Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Сообщение при клике правой кнопкой мыши на кнопке панели задач   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
2-1389243343
SkAndriy
2014-01-09 08:55
2015.09.10
Коррекция уменьшения размеров формы в Windows 7 (64-bit)


3-1304412780
OW
2011-05-03 12:53
2015.09.10
Вот опять Odac начинает глупости пороть.. ORA-00932


15-1413664202
Юрий
2014-10-19 00:30
2015.09.10
С днем рождения ! 19 октября 2014 воскресенье


15-1395728665
[ВладОшин]
2014-03-25 10:24
2015.09.10
выделение наиболее частых последовательностей


15-1412335282
ProstoTak
2014-10-03 15:21
2015.09.10
MS SQL deadlock