Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Никак не пойму, в чем проблемма... Keyboard_Hook & SendMessage   Найти похожие ветки 

 
Cosinus ©   (2005-01-19 14:27) [0]

Задача: отлавливать все сообщения клавиатуры в системе и, допустим, если это 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 15:06) [1]

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


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


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


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

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

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


 
Cosinus ©   (2005-01-19 16:53) [3]


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
11-1092721240
Ал
2004-08-17 09:40
2005.03.06
Localizy


6-1102991145
Timur
2004-12-14 05:25
2005.03.06
Счетчик трафика


14-1108553563
syte_ser78
2005-02-16 14:32
2005.03.06
dvd-to-avi


6-1103884743
AlexG
2004-12-24 13:39
2005.03.06
Какую библтотеку использовать?


3-1107210202
ka
2005-02-01 01:23
2005.03.06
Помогите с диагнозом и лечением.