Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-90665
helper
2002-01-11 18:25
2002.02.28
Сообщение


3-90494
dymka
2002-02-04 12:42
2002.02.28
тип TIME в IB6


1-90573
chelobaka
2002-02-11 17:04
2002.02.28
Делал проект под win2000, перенес на 98 - не работает. Помогите советом, плс.


3-90461
Rad
2002-01-31 19:15
2002.02.28
Как выяснить размерность поля Numeric?


1-90591
Dumitru
2002-02-12 11:03
2002.02.28
Delphi 6 Update





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский