Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1393479979
Васька
2014-02-27 09:46
2015.09.10
Переключение между дочерними окнами


15-1419456602
Юрий
2014-12-25 00:30
2015.09.10
С днем рождения ! 25 декабря 2014 четверг


15-1421303608
ПЛОВ
2015-01-15 09:33
2015.09.10
Запрос к БД, но данные не нужны :)


2-1395399726
Александр_2012
2014-03-21 15:02
2015.09.10
откат изменений в БД


2-1397568702
opium
2014-04-15 17:31
2015.09.10
Оптимизация функции





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский