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

Все особенности программирования под платформу Wintel
Ответить
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

17 фев 2009, 15:39

Как временно отключить вывод 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(...), но что именно. Не подскажете?
tim-soft.narod.ru
BHy4ok
Сообщения: 229
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

17 фев 2009, 21:11

А что насчет использование глобальный переменных?
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

18 фев 2009, 08:06

...вообще, можно ли послать окну сообщение ЗАПРЕЩАЮЩЕЕ в нем его же контексное меню? Или нет?
tim-soft.narod.ru
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 11:26

&quot писал(а):...вообще, можно ли послать окну сообщение ЗАПРЕЩАЮЩЕЕ в нем его же контексное меню? Или нет?
Не знаю, бывает ли такая мессага ввообще. Но обработку сообщений каждый делает сам и может забокировать любое ссобщение или обработать его иначе. Поэтому если даже такая мессага бывает, то в чужом окне она может не работать, то есть не блокировать POPUP. Если же окно твоё, то ты можешь сам определить такое сообщение и вопрос сведётся к "не продублирую ли я в результате существующий код мессаги и какой именно?".
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

19 фев 2009, 07:01

В том то и дело, что окно не мое - любое...
Дело вот в чем: контекстное меню всплывает всегда при нажатии правой кнопки мыши, а мне нужно сделать так, чтобы оно не всплывало если (это проверяется хуком) нажата левая кнопка мыши.
Это было реализовано в одной программе, я даже писал ее автору, спрашивал как сие сделано, но ответа не получил.
tim-soft.narod.ru
Аватара пользователя
SergeyS
Сообщения: 193
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

19 фев 2009, 16:56

Могу подкинуть только идею: у каждого окна на котором выскакивает popup должен быть hpopup или hmenu (нужно в этом направлении покапать). Так вот, если просто отключить у окна этот хэндл? Насколько я могу судить, даже делфи со своим VCL завязан на этом хэндле
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

19 фев 2009, 18:02

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

Копать надо все-таки в сторону WM_POPUP
Аватара пользователя
timself
Сообщения: 16
Зарегистрирован: 15 мар 2007, 01:28

19 фев 2009, 19:55

Спасибо всем за участие.
Я понял как можно обойтись вообще без нажатия правой кнопки мыши. Это устраняет проблему и весь сопутствующий "геморрой". Пусть POPUP спит спокойно.
tim-soft.narod.ru
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

20 фев 2009, 09:36

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