IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Crgsnbt выпадающего меню...
Snake_B
сообщение 19.08.2008 14:09
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Form1.PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);



показываю popup menu.... приложение скрыто (ShowWindow(Application.Handle, SW_HIDE);)
как закрыть меню при нажатии мыши...

пробовал:
1. (Как перехватывать события, посланные другим приложениям? - DRKB)

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;


вроде заработало, не давно опять проверил, не хочет работать...
сначала не реагировало на мышу совсем, в том числе при выборе пункта меню ноль эмоций,
потом меню сразу же стало закрываться... код не менял...
может это быть от того что кто то ещё хук ставит?
нужно ли эту функцию делать в длл?
и может это можно сделать как-нибудь проще?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
volvo
сообщение 19.08.2008 20:57
Сообщение #2


Гость






Цитата
вроде заработало, не давно опять проверил, не хочет работать...
"Ничего не менялось, раньше работало - теперь нет"? Так не бывает. Значит, что-то изменилось...

Цитата
нужно ли эту функцию делать в длл?
Да, обязательно. Тебе надо установить глобальный хук на WH_MOUSE и при отлове клика мышью послать оттуда своему приложению какое-нибудь сообщение. А приложение уже должно разбираться, что раз был клик на PopupMenu, значит надо выполнить тот пункт, который выбрали. А если пришло то самое сообщение о клике "где-то", значит надо "погасить" popup.

Цитата
может это быть от того что кто то ещё хук ставит?
Если этот кто-то ставит хук правильно (и ты ставишь свой хук правильно), то все должно работать.

P.S. Вот то, что ты привел - правильным не кажется. В частности, откуда хук знает, что такое Form1? Ты что, передавал его в DLL-ку? Или это была попытка установить локальный хук?
 К началу страницы 
+ Ответить 
Snake_B
сообщение 20.08.2008 3:56
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


[quote name='volvo' date='20.08.2008 5:57' post='125638']
"Ничего не менялось, раньше работало - теперь нет"? Так не бывает. Значит, что-то изменилось...[/quote]

Да, обязательно. Тебе надо установить глобальный хук на WH_MOUSE и при отлове клика мышью послать оттуда своему приложению какое-нибудь сообщение. А приложение уже должно разбираться, что раз был клик на PopupMenu, значит надо выполнить тот пункт, который выбрали. А если пришло то самое сообщение о клике "где-то", значит надо "погасить" popup.

Если этот кто-то ставит хук правильно (и ты ставишь свой хук правильно), то все должно работать.

P.S. Вот то, что ты привел - правильным не кажется. В частности, откуда хук знает, что такое Form1? Ты что, передавал его в DLL-ку? Или это была попытка установить локальный хук?
[/quote]

после перезагрузки опять заработало... делал на основе "Как перехватывать события, посланные другим приложениям?" из drkb... потом другие статьи почитал, появились подозрения что пример в общем то не правильный... сообщения перехватываются для других приложений, а хук ставится локально...
но работает вроде всё правильно, до перезагрузки пробовал тоже самое из dll сделать, то же не работало...
ну в общем ясно, переделаю под длл... спасибо...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Snake_B
сообщение 20.08.2008 17:06
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


в общем всё таки можно проще (имхо), без хуков совсем...

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);


и меню закрывается как надо само....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 30.07.2025 23:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"