Форум: "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.
← →
nikkie (2001-12-27 13:25) [1]WM_CANCELJOURNAL is posted with a NULL window handle.
It is meant to be processed from within an application"s main loop or a GetMessage hook procedure, not from a window procedure.
← →
a-leksey (2001-12-27 19:31) [2]Да и это правельно.
Но есть подводные камни!!!
Я могу не поймать сообщение!!!
Я могу просто не вызвать GetMessage именно тогда когда через систему пролетит эта мысуха. Да и если диалоговое окно в даний момент активно то главный цыкл обработки сообщений не получит управление!
Может кто-то уже делал такое? То как Вы определили снятие хука!!!
← →
nikkie (2001-12-28 09:41) [3]раньше не делал, но за 10 минут сделал :)
program JournalHook;
uses Windows;
const
WM_CANCELJOURNAL = $004B;
var
g_hJournalPlaybackHook : HHOOK;
function JournalPlaybackProc(code : integer;
wParam : WPARAM;
lParam : LPARAM) : LRESULT; stdcall;
begin
Result := CallNextHookEx(g_hJournalPlaybackHook, code, wParam, lParam);
end;
var
message : MSG;
begin
g_hJournalPlaybackHook :=
SetWindowsHookEx(WH_JOURNALPLAYBACK, @JournalPlaybackProc, hInstance, 0);
while (GetMessage(message, 0, 0, 0)) do begin
if message.message = WM_CANCELJOURNAL then begin
MessageBox(0, "WM_CANCELJOURNAL", "", MB_OK);
PostQuitMessage(0);
end; TranslateMessage(message);
DispatchMessage(message);
end;
end.
← →
nikkie (2001-12-28 10:06) [4]через GetMessage-hook у меня не получилось. ну и шут с ним, без него проще. вот VCL-вариант.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
g_hJournalPlaybackHook : HHOOK;
function JournalPlaybackProc(code : integer;
wParam : WPARAM;
lParam : LPARAM) : LRESULT; stdcall;
begin
Result := CallNextHookEx(g_hJournalPlaybackHook, code, wParam, lParam);
end;
procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_CANCELJOURNAL then
MessageBox(0, "WM_CANCELJOURNAL", "", MB_OK);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnAppMessage;
g_hJournalPlaybackHook :=
SetWindowsHookEx(WH_JOURNALPLAYBACK, @JournalPlaybackProc, hInstance, 0);
end;
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c