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 ©   (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]

> что вроде из-за моей программы у них подвисает система

имхо не из-за нее...


Страницы:   1 2

Наверх

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