Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизСообщение при клике правой кнопкой мыши на кнопке панели задач Найти похожие ветки
← →
Alex_C (2014-02-18 11:46) [0]При клике правой кнопкой мыши на кнопке приложения на панели задач появляется меню Свернуть, Развернуть, Закрыть... Не могу отловить сообщение, которое получает приложение при этом действии.
← →
sniknik © (2014-02-18 11:57) [1]у чего ловишь, формы? попробуй у application.
← →
MBo © (2014-02-18 12:01) [2]WM_SYSCOMMAND
← →
sniknik © (2014-02-18 12:19) [3]> WM_SYSCOMMAND
на XP в D7 SC_MINIMIZE главной форме приходит, SC_MAXIMIZE нет (получается такой странный, прикольный, глюк - как бы новый рабочий стол с не активной полоской заголовка окна, и не изменившая размер программа...).
на 7ке приходит все.
← →
Alex_C (2014-02-18 15:28) [4]Немного поясню свой вопрос: делаю свои заголовки для окон на основе TPanel - примеров таких компонентов много. На их основе сделал свой компонент - все работает как надо, кроме вот появления этого меню на кнопке приложения на панели задач.
Для работа своего компонента переопределял оконную процедуру:
procedure TCaptionPanelHX.WndProcOverride(var Msg_: TMessage);
var
X, Y: integer;
P: TPoint;
LItem : LongWord;
LMenu : HMENU;
procedure DefaultProc;
begin
with Msg_ do
Result := CallWindowProc(FOldProc, TForm(Owner).Handle, Msg, WParam, LParam);
end;
begin
with Msg_ do
begin
if Msg = WM_ACTIVATE then
begin
if (WParamLo = WA_INACTIVE) or (WParamLo = WA_CLICKACTIVE) then
begin
FWndActivate := False;
PaintBackCaption;
end;
if WParamLo = WA_ACTIVE then
begin
FWndActivate := True;
PaintBackCaption;
end;
end
else
begin
if TForm(Owner).Handle = GetActiveWindow then
FWndActivate := True
else
FWndActivate := False;
PaintBackCaption;
end;
case Msg of
WM_SIZE:
begin
DefaultProc;
PaintBackCaption;
end;
WM_NCPAINT,
WM_MOUSEACTIVATE:
begin
DefaultProc;
TForm(Owner).BorderIcons := [];
PaintBackCaption;
end;
WM_NCLBUTTONDBLCLK:
begin // Вызывается при двойном щелчке мышкой в не клиентской области
if (FIcon <> icoNone) and not (TForm(Owner).Icon.Empty) then
begin
X := TWMNCLBUTTONDBLCLK(Msg_).XCursor;
Y := TWMNCLBUTTONDBLCLK(Msg_).YCursor;
if TWMNCLBUTTONDBLCLK(Msg_).HitTest = 2 then
begin
if (X >= FIconRect.Left) and (X <= FIconRect.Right) and
(Y >= FIconRect.Top) and (Y <= FIconRect.Bottom) then
WndSysCommand(wscClose)
else
SendMessage(TForm(Owner).Handle, WM_MAXHIT, 0, 0);
end;
end
else
SendMessage(TForm(Owner).Handle, WM_MAXHIT, 0, 0);
TWMNCLBUTTONDBLCLK(Msg_).HitTest := 0;
DefaultProc;
end;
WM_NCLBUTTONDOWN: // Вызывается когда кнопка мыши нажимается на неклиентской части окна
begin
X := TWMNCLBUTTONDOWN(Msg_).XCursor;
Y := TWMNCLBUTTONDOWN(Msg_).YCursor;
if (TWMNCLBUTTONDOWN(Msg_).HitTest = 2) then
begin
if PtInRect(FIconRect, Point(X - TForm(Owner).Left, Y - TForm(Owner).Top)) then
begin
LMenu := GetSystemMenu(Application.Handle, False);
LItem := LongWord(Windows.TrackPopupMenu(LMenu, TPM_LEFTBUTTON or TPM_TOPALIGN or
TPM_RIGHTBUTTON or TPM_RETURNCMD,
X, TForm(Owner).Left + Self.Height, 0, Application.Handle, nil));
if LItem > 0 then
SendMessage(TForm(Owner).Handle, WM_SYSCOMMAND, LItem, 0);
end
else
DefaultProc;
end
else
DefaultProc;
end;
WM_NCLBUTTONUP:
begin
DefaultProc;
end;
WM_NCRBUTTONDOWN:
begin
DefaultProc;
if (PopupMenu <> nil) then
begin
P := ClientToScreen(Point(TWMMouse(Msg_).XPos, TWMMouse(Msg_).YPos));
PopupMenu.Popup(P.x, P.y);
end;
end;
WM_MAXHIT:
begin
if TForm(Owner).WindowState = wsNormal then
SendMessage(TForm(Owner).Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)
else
SendMessage(TForm(Owner).Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end;
WM_GETMINMAXINFO:
begin
DefaultProc;
WMGetMinMaxInfo(TWMGetMinMaxInfo(Msg_));
end;
WM_DESTROY:
begin
UnHookWindow;
DefaultProc;
end;
else
DefaultProc;
end;
end;
end;
И вот теперь это меню по правому клику мышкой не появляется.
Пробовал отлавливать WM_SYSCOMMAND - но оно срабатывает по левому клику.
← →
sniknik © (2014-02-18 15:52) [5]> WndProcOverride
?
реально override? а где тогда inherited?
← →
Alex_C (2014-02-18 15:59) [6]>реально override? а где тогда inherited?
Нет, не реально))). Вот так:
procedure TCaptionPanelHX.HookWindow;
begin
if not (csDesigning in ComponentState) and (Owner is TControl) then
begin
if (FOldProc = nil) then
begin
FOldProc := Pointer(GetWindowLong(TForm(Owner).Handle, GWL_WNDPROC));
FNewProc := MakeObjectInstance(WndProcOverride);
SetWindowLong(TForm(Owner).Handle, GWL_WNDPROC, integer(FNewProc));
FOldProcForPanel := Pointer(GetWindowLong(Self.Handle, GWL_WNDPROC));
FNewProcForPanel := MakeObjectInstance(WndProcOverrideForPanel);
SetWindowLong(Self.Handle, GWL_WNDPROC, integer(FNewProcForPanel));
end;
end;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c