Конференция "WinAPI" » Хук WH_CBT, можно с его помощью отловить нажатие пункта меню?
 
  • EgorovAlex © (26.07.12 12:03) [0]
    Или нужно использовать хук WH_GETMESSAGE. Почему спрашиваю: сейчас у меня есть WH_CBT хук и из него я добавляю свой пункт меню в программу. Теперь мне нужно отловить нажатие на этот пункт. Сейчас пробую обрабатывать HCBT_SYSCOMMAND, но может что-то не так делаю?
  • EgorovAlex © (26.07.12 12:47) [1]
    Делаю так:


    function CallCBTProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    begin
     case Code of
       HCBT_CREATEWND: ...
       HCBT_ACTIVATE: ...
       HCBT_SYSCOMMAND:
         if (wParam = SC_MOUSEMENU) then
           GetMenuItem(Point(LOWORD(lParam), HIWORD(lParam)));
     end;
     Result := CallNextHookEx(hCBTHook, Code, wParam, lParam);
    end;

    procedure GetMenuItem(Pt: TPoint);
    var
     hMainMenu: HMENU;
     MII: TMenuItemInfo;
     ItemPos: Integer;
    begin
     hMainMenu := GetMenu(hWnd);
     ItemPos := MenuItemFromPoint(hWnd, hMainMenu, Pt);
     WriteFileInfo('@ItemPos: ' + IntToStr(ItemPos));
     WriteFileInfo('@X,Y: ' + IntToStr(Pt.X) + ',' + IntToStr(Pt.Y));
     ZeroMemory(@MII, SizeOf(MII));
     MII.cbSize     := SizeOf(MII);
     MII.fMask      := MIIM_SUBMENU;
     if GetMenuItemInfo(hMainMenu, SC_RQM, False, MII) then begin
       ItemPos := MenuItemFromPoint(hWnd, MII.hSubMenu, Pt);
       WriteFileInfo('ItemPos: ' + IntToStr(ItemPos));
       if GetMenuItemInfo(MII.hSubMenu, SC_RQM, False, MII) then
         WriteFileInfo('ItemId: ' + IntToStr(MII.wID));
     end;
    end;

  • EgorovAlex © (26.07.12 12:49) [2]
    @ItemPos получаю верное значение для главного меню при клике в меню верхнего уровня (пункты, которые видно вверху), а вот как отлавливать нажатия в выпадающих меню, которые, собственно, и интересуют?
 
Конференция "WinAPI" » Хук WH_CBT, можно с его помощью отловить нажатие пункта меню?
Есть новые Нет новых   [134430   +4][b:0][p:0.001]