![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректно ли так устанавливать глобальный хук на клавиатуру? [D6, WinXP]
leonidus © (2008-07-30 13:19:00)Господа, подскажите корректно ли я ставлю глобальный хук, а то некоторые пользователи жалуются, что вроде из-за моей программы у них подвисает система и хочется понять это причина именно в моей проге или нет.
Глобальный хук на клаву на клавишу Ctrl ставлю в dll:
library key_mouse_hook;
uses
SysUtils, Classes, Windows, Messages;
const
wm_LCtrl_Down=wm_User+1;
wm_RCtrl_Down=wm_User+2;
var
Key_SysHook:HHook = 0;
{$R *.res}
function Key_SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var H: HWND;
begin
if (Code >= 0) and (lParam and $40000000 = 0) then
begin
H := FindWindow('TForm1', 'MainWindow');
if HiWord(GetAsyncKeyState(VK_LCONTROL))<>0 then SendMessage(H, wm_LCtrl_Down, 0, 0);
if HiWord(GetAsyncKeyState(VK_RCONTROL))<>0 then SendMessage(H, wm_RCtrl_Down, 0, 0);
end;
Result:= CallNextHookEx(Key_SysHook, Code, wParam, lParam);
end;
{ Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
//Устанавливаю HOOK, если он не установлен (switch=true).
begin
Key_SysHook := SetWindowsHookEx(WH_Keyboard, @Key_SysMsgProc, HInstance, 0);
if Key_SysHook <> 0 then //MessageBox(0, 'Keyboard hook is working', '', 0)
else MessageBox(0, 'Keyboard hook is not working', '', 0);
end
else
begin
//Удаляю функцию-фильтр, если она установлена (т.е. switch=false).
if UnhookWindowsHookEx(Key_SysHook) then //MessageBox(0, 'Keyboard hook is unload', '', 0)
else MessageBox(0, 'Keyboard hook is not unload', '', 0);
Key_SysHook := 0;
end;
end;
exports hook;
begin
end.
А уже в самой программу устанавливаю хук так:
@hook:= nil; // инициализируем переменную hook
// ********* динамическая загрузка **************
Hdll:= LoadLibrary(PChar('key_mouse_hook.dll')); //загрузка DLL
if Hdll > HINSTANCE_ERROR then // если всё без ошибок, то
begin
@hook:=GetProcAddress(Hdll, 'hook'); // получаем указатель на необходимую процедуру
hook(true);
end
else
ShowMessage('Error key_mouse_hook.dll loading!');
Может я что-то делаю не так?
Eraser (2008-07-30 15:03:00) [21]> Может я что-то делаю не так?
> SendMessage
тут может быть задержка, лучше асинхронно высылать.
brother (2008-07-30 13:22:00) [22]> что вроде из-за моей программы у них подвисает система
имхо не из-за нее...