Форум: "WinAPI";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
ВнизВопрос о Хуках! А именно о WH_JOURNALPLAYBACK!!! Найти похожие ветки
← →
a-leksey (2001-12-26 20:06) [0]Суть такова!!!
Я блокирую клавиатуру и мышь устанавливая хук WH_JOURNALPLAYBACK
с пустой функцией-фильтром (почти пустой)!
Теперь вопрос, как я могу узнать, когда пользователь снимает хук
блокировки нажав клавиши WIN, WIN+ESC! В доке сказано, что при этом в мой просес уходит сообщение WM_CANCELJOURNAL, но с нулевым дескриптором окна, по этому в окне я его не поймаю!!!
ЧТО я делаю - ставлю еще один Хук но уже на WH_GETMESSAGE, чтобы словить эту мысуху. Но есть проблемка - это все тормозит систему,
но главное нито мой хук не ловит мысуху , нито окно не ловит мысуху хука, нито такой мысухи нет!
Прилагаю код Dll и EXE
library MesHook;
uses
Windows;
const
WM_USER = $0400;
WM_LOOKENABLED = WM_USER + 346;
WM_CANCELJOURNAL = $004B;
{$R *.res}
var
MessageHook: HHOOK;
function Proc(hCode:Integer;WParam:word;LParam:Longint): LRESULT; stdcall;
var
msg: PEVENTMSG;
Wnd: THandle;
begin
msg:=Pointer(LParam);
if msg.message=WM_CANCELJOURNAL then
begin
Wnd := FindWindow(nil,"Look");
if Wnd > 0 then
//Посылаем пользовательское сообщение в нашу программу -
//о том, что блокировка снята
PostMessage(Wnd,WM_LOOKENABLED,1,0);
end;
Result:=CallNextHookEx(MessageHook,hCode,wParam,LParam);
end;
function SetMessageHook: Boolean; stdcall; export;
begin
MessageHook := SetWindowsHookEx(WH_GETMESSAGE,@Proc,HInstance,0);
Result := MessageHook <> 0;
end;
function RemoveMessageHook: Boolean; stdcall; export;
begin
Result := UnhookWindowsHookEx(MessageHook);
end;
exports SetMessageHook, RemoveMessageHook;
begin
end.
А вот и Сама прога:
unit frmMain;
interface
uses
Windows, Messages, SysUtils,Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
const
WM_USER = $0400;
WM_LOOKENABLED = WM_USER + 346;
type
TMainForm = class(TForm)
Label1: TLabel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
procedure WMHOOK(var Msg:TMessage); message WM_LOOKENABLED;
public
{ Public declarations }
end;
function SetMessageHook: Boolean; stdcall;
function RemoveMessageHook: Boolean; stdcall;
var
MainForm: TMainForm;
LookHook: HHOOK;
Looked:Boolean=false;
implementation
{$R *.dfm}
function SetMessageHook: Boolean; external "MesHook.dll";
function RemoveMessageHook: Boolean; external "MesHook.dll";
procedure TMainForm.WMHOOK(var Msg: TMessage);
begin
if Msg.wParam=1 then Label1.Caption:="Ловушка снята!";
Label1.Repaint;
end;
function LookProc(hCode: Integer; wParam: Longint; lParam: Longint): LRESULT; stdcall;
var
Wnd: THandle;
begin
{if hCode = HC_SKIP then
begin
Looked:=false;
MainForm.Label1.Caption:="Блокировка снята!";
end;}
Result := CallNextHookEx(LookHook, hCode, wParam, lParam);
end;
function SetLookHook: Boolean;
begin
LookHook := SetWindowsHookEx(WH_JOURNALPLAYBACK,@LookProc,HInstance,0);
Result := LookHook <> 0;
end;
function RemoveLookHook: Boolean;
begin
Result := UnhookWindowsHookEx(LookHook);
end;
procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
SetMessageHook;
if SetLookHook then
begin
Looked:=true;
Label1.Caption:="Блокировка установлена!";
Label1.Repaint;
end
else ShowMessage("error")
end;
procedure TMainForm.SpeedButton2Click(Sender: TObject);
begin
RemoveMessageHook;
if not RemoveLookHook then ShowMessage("error");
end;
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c