Страница 1 из 1

Как временно запретить POPUP в любом HWND?

Добавлено: 17 фев 2009, 15:39
timself
Как временно отключить вывод POPUP меню в любом HWND?
Ситуация такая: стоит хук на мышь, когда юзер одновременно жмет левую и правую кнопки мыши, данному окну через keybd_event шлется определенное нажатие клавишь.
Но тут возникает проблема: keybd_event не срабатывает, так как всплывает контекстное меню и забирает фокус на себя.
Можно ли заблокировать в нужный момент POPUP для текущего окна?

Код: Выделить всё

...
lmdown: boolean;
pMHook : TMouseHookStructEx;
...
pMHook := PMouseHookStructEx(lParam)^;
...
case wparam of

  WM_LBUTTONDOWN:
  begin
    lmdown:=true;
    // <--- вот тут бы заблокировать...
  end;

  WM_LBUTTONUP:
  begin
    lmdown:=false;
    // <--- а тут по идее разблокировать...
  end;

  WM_RBUTTONUP:
  if lmdown then
  begin
    keybd_event(...); 
  end;
...
Подозревю, что можно послать окну некое SendMessage(...) или PostMessage(...), но что именно. Не подскажете?

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 17 фев 2009, 21:11
BHy4ok
А что насчет использование глобальный переменных?

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 18 фев 2009, 08:06
timself
...вообще, можно ли послать окну сообщение ЗАПРЕЩАЮЩЕЕ в нем его же контексное меню? Или нет?

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 18 фев 2009, 11:26
atavin-ta
&quot писал(а):...вообще, можно ли послать окну сообщение ЗАПРЕЩАЮЩЕЕ в нем его же контексное меню? Или нет?
Не знаю, бывает ли такая мессага ввообще. Но обработку сообщений каждый делает сам и может забокировать любое ссобщение или обработать его иначе. Поэтому если даже такая мессага бывает, то в чужом окне она может не работать, то есть не блокировать POPUP. Если же окно твоё, то ты можешь сам определить такое сообщение и вопрос сведётся к "не продублирую ли я в результате существующий код мессаги и какой именно?".

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 19 фев 2009, 07:01
timself
В том то и дело, что окно не мое - любое...
Дело вот в чем: контекстное меню всплывает всегда при нажатии правой кнопки мыши, а мне нужно сделать так, чтобы оно не всплывало если (это проверяется хуком) нажата левая кнопка мыши.
Это было реализовано в одной программе, я даже писал ее автору, спрашивал как сие сделано, но ответа не получил.

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 19 фев 2009, 16:56
SergeyS
Могу подкинуть только идею: у каждого окна на котором выскакивает popup должен быть hpopup или hmenu (нужно в этом направлении покапать). Так вот, если просто отключить у окна этот хэндл? Насколько я могу судить, даже делфи со своим VCL завязан на этом хэндле

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 19 фев 2009, 18:02
Naeel Maqsudov
ИМХО, тупиковая идея. Что такое handle? Это число которое я храню в какой-нибудь переменной. Этот хендл конечно принадлежит процессу (и его конечно можно найти по PID). Во-первых он никак не связан с хендлом окна, так как это опять же всего-лишь хэндл, которым владеет процесс. Во-вторых, отключить хендл, т.е. запретить им пользоваться, можно отлько одним способом: освободить ресурс FreeResource(aHandle). Но это будет уже навсегда.

Копать надо все-таки в сторону WM_POPUP

Re: Как временно запретить POPUP в любом HWND?

Добавлено: 19 фев 2009, 19:55
timself
Спасибо всем за участие.
Я понял как можно обойтись вообще без нажатия правой кнопки мыши. Это устраняет проблему и весь сопутствующий "геморрой". Пусть POPUP спит спокойно.

.

Добавлено: 20 фев 2009, 09:36
BBB
SergeyS писал(а):Могу подкинуть только идею: у каждого окна на котором выскакивает popup должен быть hpopup или hmenu (нужно в этом направлении покапать). Так вот, если просто отключить у окна этот хэндл? Насколько я могу судить, даже делфи со своим VCL завязан на этом хэндле
Все-таки, кину такую идею. Если повесить HOOK не на мышиные события, а на создание окна. Popup-меню - это некое окно. Если на моменте создания запретить его создание (в HOOK-е такая возможность точно есть, я ею пользвался), то - вот он и искомы результат. Главное понять - какое окно из создаваемых "запретить".