Текущий архив: 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