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

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

Никак не пойму, в чем проблемма... Keyboard_Hook & SendMessage [D6]


Cosinus ©   (2005-01-19 14:27:00) 

Задача: отлавливать все сообщения клавиатуры в системе и, допустим, если это VK_SPACE, то вывести сообщение.
Реализация: Dll с хуком, которая при нужных нам условиях посылает Message главному окну программы, по принятию которого, происходят некоторые действия, например ShowMessage('SPACE!'). Почему то не работает.
Вот код Dll...

library KeySpy;

uses
 Windows,Messages;

const
 DLL_MESSAGE = WM_USER + 1652;

var
 DllHookHandle:HHook = 0;

function Space_Hook(Code: integer; wParam: word; lParam: Longint):LongInt;stdCall;
var
 Caller:HWND;
begin
 if code<0 then Result := CallNextHookEx(DllHookHandle,Code, wParam, lParam)
 else
   begin
     Result:=0;
     if wParam = VK_Space then
     begin
       Caller:=findwindow('TTest','Test');
       if (Caller<>0) then
         SendMessage(Caller,DLL_MESSAGE,0,0);
     end;
     CallNextHookEx(DllHookHandle,Code, wParam, lParam);
   end;
end;
 

procedure SetHook;stdCall;Export;
begin
DllHookHandle := SetWindowsHookEx(WH_Keyboard, @Space_Hook, hInstance, 0);
end;

procedure UnHook;stdCall;Export;
begin
UnhookWindowsHookEx(DllHookHandle);
end;

exports
SetHook,
Unhook;

Begin
 SetHook;
end.

Вот код программы...

unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

const
  DLL_MESSAGE = WM_USER + 1652;

type
 TTest = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormCreate(Sender: TObject);
   procedure DllMessage(var Msg: TMessage); message DLL_MESSAGE;
 private
   //
 public
   //
 end;

var
 Test: TTest;

implementation
procedure SetHook;stdCall; external 'KeySpy.Dll';
procedure UnHook;stdCall; external 'KeySpy.Dll';

procedure TTest.DllMessage(var Msg: TMessage);
begin
   ShowMessage('Space!');
end;
{$R *.dfm}

procedure TTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 UnHook;
end;

procedure TTest.FormCreate(Sender: TObject);
begin
 SetHook;
end;

end.

Подскажите, в какую хоть сторону глядеть то, а то замучался уже...


Cosinus   (2005-01-19 16:53:00) [1]


> Digitman ©   (19.01.05 16:49) [2]

Ясно, спасибо.
А SetHook уже убрал.


Digitman   (2005-01-19 16:49:00) [2]


> Просто вместо него надо было использовать PostMessage


совершенно не обязательно.

SendMessage() нельзя вызывать только в случае когда попытка отправки таким способом выполняется в контексте того же трэда, который создал форму, которой ты пытаешься послать сообщение

library KeySpy;
..
Begin
// SetHook; //это убери
end.


Cosinus   (2005-01-19 15:06:00) [3]

Я разобрался - посмотрел еще раз справку по SendMessage. Просто вместо него надо было использовать PostMessage.


Наверх

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