Главная страница
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.068 c
4-1103542919
Harry_Ts
2004-12-20 14:41
2005.03.06
Дисковые процедуры низкого уровня в Delphi


3-1107700175
dreamse
2005-02-06 17:29
2005.03.06
Как выполнить хранимую процедуру с параметрами


1-1108639319
BFG9k
2005-02-17 14:21
2005.03.06
Нормальные иконки


4-1106413640
Engy
2005-01-22 20:07
2005.03.06
Заголовок активного окна


14-1108254728
Lancelot
2005-02-13 03:32
2005.03.06
Отмучился :)