-
Или нужно использовать хук WH_GETMESSAGE. Почему спрашиваю: сейчас у меня есть WH_CBT хук и из него я добавляю свой пункт меню в программу. Теперь мне нужно отловить нажатие на этот пункт. Сейчас пробую обрабатывать HCBT_SYSCOMMAND, но может что-то не так делаю?
-
Делаю так:
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;
-
@ItemPos получаю верное значение для главного меню при клике в меню верхнего уровня (пункты, которые видно вверху), а вот как отлавливать нажатия в выпадающих меню, которые, собственно, и интересуют?
|