Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.025 c
4-1106433800
Unleashed
2005-01-23 01:43
2005.03.06
Setupdi функции


1-1108977468
REA
2005-02-21 12:17
2005.03.06
ResourceString


8-1100374978
Alex_Rov
2004-11-13 22:42
2005.03.06
Не играет MP3 в Windows 98 SE


14-1108435828
Думкин
2005-02-15 05:50
2005.03.06
С Днем рождения! 15 февраля


14-1108144122
Мазут Береговой
2005-02-11 20:48
2005.03.06
Денежные переводы стали "нетрудовыми доходами"




   Наверх