Form1.PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
begin
if Code >= 0 then
begin
result := 0;
msg := Pointer(LParam);
with Form1 do
end
else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
[quote name='volvo' date='20.08.2008 5:57' post='125638']
"Ничего не менялось, раньше работало - теперь нет"? Так не бывает. Значит, что-то изменилось...[/quote]
Да, обязательно. Тебе надо установить глобальный хук на WH_MOUSE и при отлове клика мышью послать оттуда своему приложению какое-нибудь сообщение. А приложение уже должно разбираться, что раз был клик на PopupMenu, значит надо выполнить тот пункт, который выбрали. А если пришло то самое сообщение о клике "где-то", значит надо "погасить" popup.
Если этот кто-то ставит хук правильно (и ты ставишь свой хук правильно), то все должно работать.
P.S. Вот то, что ты привел - правильным не кажется. В частности, откуда хук знает, что такое Form1? Ты что, передавал его в DLL-ку? Или это была попытка установить локальный хук?
[/quote]
после перезагрузки опять заработало... делал на основе "Как перехватывать события, посланные другим приложениям?" из drkb... потом другие статьи почитал, появились подозрения что пример в общем то не правильный... сообщения перехватываются для других приложений, а хук ставится локально...
но работает вроде всё правильно, до перезагрузки пробовал тоже самое из dll сделать, то же не работало...
ну в общем ясно, переделаю под длл... спасибо...
в общем всё таки можно проще (имхо), без хуков совсем...
procedure SetForeground;
var ID,w:DWord;
begin
w:=GetForegroundWindow();
ID:=GetWindowThreadProcessId(w,nil);
if (ID<>GetCurrentThreadID) then begin
AttachThreadInput(GetCurrentThreadID,ID,true);
SetWindowPos(w,HWND_NOTOPMOST,0,0,0,0,SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE);
SetWindowPos(FormFirstHelp.Handle,HWND_TOP,Form1.Left,Form1.Top,Form1.Width,Form1.Height,SWP_FRAMECHANGED);
AttachThreadInput(GetCurrentThreadID,ID,false);
end;
ShowWindow(Application.Handle, SW_HIDE); end;
SetForeground; Form1.PopupMenu2.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);