Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.023 c
4-90702           Строр                 2001-12-28 12:44  2002.02.28  
Как отследить нажатие клавиш когда прога сидит в трее?


1-90613           PlaZZma               2002-02-12 17:17  2002.02.28  
Как проверить, находится ли курсор над компонентом или нет?


4-90705           cher_gvf              2001-12-03 17:33  2002.02.28  
Как послать сообщение по сети определенным юзерам?


3-90498           Behemoth              2002-02-03 10:36  2002.02.28  
Настройка псевдонима БД Access в BDE


1-90584           Beer                  2002-02-11 11:14  2002.02.28  
Отчет в Excel..