А нафига тебе каркулятор с твоим меню?
Конспирация батенька ) Это так для примера просто взято. А вообще, переделал так:
{*в программе: *}
...
procedure TForm1.Button1Click(Sender: TObject);
begin
TheHWND:= FindWindow(Nil,'Калькулятор!');
if TheHWND <> 0 then TheHMENU:= GetMenu(TheHWND)
else MessageBox(0,'Can`t find Calc window!','Error!',mb_iconhand);
myPopUPMenu:= CreatePopUpmenu();
InsertMenu(myPopUpMenu,0,MF_BYPOSITION,ID_MENU_1,'MenuItem1');
InsertMenu(myPopUpMenu,1,MF_BYPOSITION,ID_MENU_2,'MenuItem2');
InsertMenu(myPopUpMenu,2,MF_BYPOSITION,ID_MENU_3,'MenuItem3');
AppendMenu(TheHMENU,MF_POPUP, myPopUpMenu,'Test');
SetMenuHandler();
end;
В DLL вынесен hook:
{*в dll: *}
function MenuHandler(nCode, wParam, lParam: integer): lResult; stdcall;
begin
if nCode = MSGF_MENU then
begin
mhMSGStruct:= PMSG(lParam)^;
case mhMSGStruct.message of
WM_LBUTTONDOWN:
begin
if (GetMenu(mhMSGStruct.hwnd) = GetMenu(FindWindow(Nil,'Калькулятор'))) then
begin
messagebox(0,PChar(inttostr(lo(mhMSGStruct.wParam))),'foo',mb_iconhand);
result:= CallNextHookEx(mhHandle,nCode,wParam,lParam);
Exit;
end;
end;
else
begin
result:= CallNextHookEx(mhHandle,nCode,wParam,lParam);
Exit;
end;
end;
end;
result:= CallNextHookEx(mhHandle,nCode,wParam,lParam);
end;
function SetMenuHandler(): boolean; stdcall;
begin
mhHandle:= SetWindowsHookEx(WH_MSGFILTER, @MenuHandler, hInstance,0);
if (mhHandle <> 0) then result:= false else
result:= true;
end;
Меню добавляется, хук ловит клики мышью, но проблема в том, что после обработки
сообщения WM_LButtonDown оно попадет и в Calc, т.е допустим мое меню открылось и
перекрыло собой пару кнопок, так вот, после щелчка по пункту моего меню, хук его ловит,
но ловит этот щелчек и Сalc, и нажимается кнопка которую перекрыло собой мой меню,
как будто оно прозрачное. Как от этого избавиться. Нужно что бы на клики по меню,
срабатывал только обработчик моего меню. )
Посмотрю WM_MEASUREITEM, что то похоже но не знаю...