Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про установку глобального хука [D6, WinXP]


Страницы:   1 2

leonidus ©   (2006-07-03 21:30:00) 

Уважаемые мастера подскажите пожалуйста как мне поставить такой глобальный хук: хук ставится на щелчок правой клавиши мыши, после этого если пользователь нажимает скажем Ctrl и щелкает правой клавишей мыши, то хук срабатывает отсылая моему окну некое сообщение и при этом не дает отобразиться контекстному меню которое как правило во всех приложениях отображается по щелчку правой клавиши мыши. В остальных случаях (когда щелчок правой клавишей мыши произведен но Ctrl не нажат) все работает в обычном режиме, т.е. щелчки правой клавишей в любом приложении вызывают появление контекстного меню данного приложения.
 
Я делаю так, создаю dll`ку в которой есть функция получающая управления при перехвати действий мыши:

function Mouse_SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var H: HWND;
begin
if (Code=HC_ACTION) then
 begin
  H := FindWindow('TForm1', 'XXX');

//тут проверяю факт нажатия правой клавиши мыши и Ctrl`а
if (wParam = WM_RBUTTONDOWN) AND (HiWord(GetAsyncKeyState(VK_LCONTROL))<>0)    then
   SendMessage(H, wm_RightMouse_Event, 0, 0);
 end;

 Result:= CallNextHookEx(Mouse_SysHook, Code, wParam, lParam);
end;

Этот код позволяет мне узнать что нажата правая клавиша мыши и Ctrl, но не позволяет предотвратить появление контекстного меню. Как мне это сделать?


второе явление Чапаева народу   (2006-07-04 11:38:00) [21]


> я просто не нашел сообщение WH_MOUSE_LL

Логично. Потому как такого сообщения ещё не придумали.


Ketmar   (2006-07-04 11:30:00) [22]

странно. а я нашёл. что я сделал неправильно?

LL -- это "низкоуровневый" хук. работает по всей системе, не требует DLL. если упрощённо, то вызывается сразу после того, как драйвер сгенерировал событие, но до того, как это событие будет проинтерпретировано.


leonidus   (2006-07-04 10:40:00) [23]

Ок, я понял что нужно глобальный хук, я просто не нашел сообщение WH_MOUSE_LL, поясните поажлуйста как оно работает.


второе явление Чапаева народу   (2006-07-04 09:57:00) [24]


> >function Mouse_SysMsgProc(code : integer; wParam : word;
>  lParam : longint) : longint; stdcall;
>
> [OFFTOPIC] Уже устал спрашивать: откуда многие этот бред
> берут?

Из Win16, где WPARAM <=> Word...


> Леонид, подскажите пожалуйста как с WM_MOUSE_LL работать?
>  Искал на MSDN "WM_MOUSE_LL" но не нашел

Дядя пошутил. Имелось в виду SetWindowsHookEx()+WH_MOUSE_LL.


leonidus   (2006-07-04 08:54:00) [25]

Леонид, подскажите пожалуйста как с WM_MOUSE_LL работать? Искал на MSDN "WM_MOUSE_LL" но не нашел, Яндекс вообще молчит, поясните пожалуйста хотябы как вы видите решение этой проблемы.


Lamer@fools.ua   (2006-07-03 23:31:00) [26]

> function Mouse_SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;

[OFFTOPIC] Уже устал спрашивать: откуда многие этот бред берут?


Leonid Troyanovsky   (2006-07-03 23:26:00) [27]


> leonidus ©   (03.07.06 23:13) [3]

> Леонид, а чем вам не нравится GetAsyncKeyState, чем его
> можно заменить? Разве в данном случае это вообще принципиально,
>  ведь как раз определение факта нажатия Ctrl срабатывает
> нормально? И потом как вы предлагаете установить глобальный
> хук без dll? Простите что столько вопросов, я просто совсем


GetKeyboardState vs GetAsyncKeyState.
WM_MOUSE vs  WM_MOUSE_LL

Все это можно почерпнуть из http://msdn.microsoft.com

--
Regards, LVT.


leonidus   (2006-07-03 23:13:00) [28]

Леонид, а чем вам не нравится GetAsyncKeyState, чем его можно заменить? Разве в данном случае это вообще принципиально, ведь как раз определение факта нажатия Ctrl срабатывает нормально? И потом как вы предлагаете установить глобальный хук без dll? Простите что столько вопросов, я просто совсем не понял ваших ответов...


Leonid Troyanovsky   (2006-07-03 23:05:00) [29]


> leonidus ©   (03.07.06 21:30)  

> Уважаемые мастера подскажите пожалуйста как мне поставить
> такой глобальный хук: хук ставится на щелчок правой клавиши
> мыши, после этого если пользователь нажимает


WH_MOUSE_LL, этот ответ (LL), IMHO, уже давался.
Т.е., даже без dll.

--
Regards, LVT.


Leonid Troyanovsky   (2006-07-03 22:58:00) [30]


> leonidus ©   (03.07.06 21:30)  

> if (wParam = WM_RBUTTONDOWN) AND (HiWord(GetAsyncKeyState>  


Почему, собс-но, GetAsyncKeyState?
IMHO, этот вопрос уже задавался.
Ну, а про остальные вопросы можно и после.

--
Regards, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо