![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про установку глобального хука [D6, WinXP]
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.