Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.08.14;
Скачать: [xml.tar.bz2];

Вниз

Hook trouble   Найти похожие ветки 

 
Axis_of_Evil   (2003-06-09 15:51) [0]

Ставится ловушка с параметром wh_Keyboard, ставится она в DLL(!)
DLL при получении извещения о нажатии клавиши отправляет
сообщение моему окну.
Truble = неактивное окно ссобщение не получает

DLL:


library HookDLL;
uses
Windows, Messages;
const
am_Msg = wm_User + 1000;

var
KeyboardHook: hHook;
App: hwnd;

function KeyboardHookProc(Code: LongInt; wP: LongInt; Lp: Longint): Longint; stdcall;
begin
if (Code >= 0) then
SendMessage(App, am_Msg, 0, 0);
Result := CallNextHookEx(KeyboardHook, Code, wP, Lp);
end;

function SetKeyboardHook: Boolean;
begin
KeyboardHook := SetWindowsHookEx(wh_Keyboard, @KeyboardHookProc, hInstance, 0);
Result := (KeyboardHook <> 0);
end;

procedure UnHookAll; export;
begin
UnHookWindowsHookEx(KeyboardHook);
end;

procedure Start; export;
begin
App := FindWindow("TAForm", "AForm");
if (App = 0) then
MessageBox(0, "Main window not found", "Error", mb_OK or mb_SystemModal);

if not SetKeyboardHook then
MessageBox(0, "Couldn""t hook keyboard", "Error", mb_OK or mb_SystemModal);
end;

exports
Start index 1,
UnHookAll index 2;

begin
end.



Project:


...
const
am_Msg = wm_User + 1000;

type
TDLLProc = procedure;

type
TAForm = class(TForm)
OutList: TListBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
protected
procedure amMsg(var Msg: TMessage); message am_Msg;
end;

var
AForm: TAForm;
Start, UnHookAll: TDLLProc;
hDLL: THandle;
implementation

procedure TAForm.FormCreate(Sender: TObject);
begin
@Start := nil;
@UnHookAll := nil;

hDLL := LoadLibrary("HookDLL.dll");
if (hDLL = 0) then
begin
Application.MessageBox("Couldn""t load DLL", "Error");
( hDLL, "Start")
Ставится ловушка с параметром wh_Keyboard, ставится она в DLL(!)
DLL при получении извещения о нажатии клавиши отправляет
сообщение моему окну.
Truble = неактивное окно ссобщение не получает

DLL:


library HookDLL;
uses
Windows, Messages;
const
am_Msg = wm_User + 1000;

var
KeyboardHook: hHook;
App: hwnd;

function KeyboardHookProc(Code: LongInt; wP: LongInt; Lp: Longint): Longint; stdcall;
begin
if (Code >= 0) then
SendMessage(App, am_Msg, 0, 0);
Result := CallNextHookEx(KeyboardHook, Code, wP, Lp);
end;

function SetKeyboardHook: Boolean;
begin
KeyboardHook := SetWindowsHookEx(wh_Keyboard, @KeyboardHookProc, hInstance, 0);
Result := (KeyboardHook <> 0);
end;

procedure UnHookAll; export;
begin
UnHookWindowsHookEx(KeyboardHook);
end;

procedure Start; export;
begin
App := FindWindow("TAForm", "AForm");
if (App = 0) then
MessageBox(0, "Main window not found", "Error", mb_OK or mb_SystemModal);

if not SetKeyboardHook then
MessageBox(0, "Couldn""t hook keyboard", "Error", mb_OK or mb_SystemModal);
end;

exports
Start index 1,
UnHookAll index 2;

begin
end.



Project:


...
const
am_Msg = wm_User + 1000;

type
TDLLProc = procedure;

type
TAForm = class(TForm)
OutList: TListBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
protected
procedure amMsg(var Msg: TMessage); message am_Msg;
end;

var
AForm: TAForm;
Start, UnHookAll: TDLLProc;
hDLL: THandle;
implementation

procedure TAForm.FormCreate(Sender: TObject);
begin
@Start := nil;
@UnHookAll := nil;

hDLL := LoadLibrary("HookDLL.dll");
if (hDLL = 0) then
begin
Application.MessageBox("Couldn""t load DLL", "Error");
Exit;
end;
@Start := GetProcAddress(hDLL, "Start");
@UnHookAll := GetProcAddress(hDLL, "UnHookAll");
Start;
end;


procedure TAForm.amMsg(var Msg: TMessage);
begin
OutList.Items.Add("App Got It");
end;


procedure TAForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnHookAll;
FreeLibrary(hDLL);
end;

end.


 
Song   (2003-06-09 16:48) [1]

App должна быть описана в памяти. DLL прицепляется ко всем процессам и в зоне действия других процессов кроме твоего переменная App равна нулю!!!


 
Axis_of_Evil   (2003-06-10 14:51) [2]

т.е. как? ведь:

procedure Start; export;
begin
App := FindWindow("TAForm", "AForm");
...


 
VMcL   (2003-06-10 15:05) [3]

>Axis_of_Evil © (10.06.03 14:51)

Читай внимательно <Song © (09.06.03 16:48)>

DLL прицепляется ко всем процессам и в зоне действия других процессов кроме твоего переменная App равна нулю!!!


 
Игорь Шевченко   (2003-06-10 15:06) [4]

Что-то я не понимаю...

if (Code >= 0) then
SendMessage(App, am_Msg, 0, 0);

Может, PostMessage оно лучшее будет ?


 
_ALEXey_   (2003-06-11 16:53) [5]

Причина: изолированность адресного пространства. Здесь, в статьях, есть ответ на этот вопрос.


 
StAL   (2003-06-12 11:39) [6]

Ваша DLL внедряется во все процессы!
При внедрении код DLL используется тот же, а данные DLL инициализируются заново!

Вот и получается, что App во всех процессах кроме вызвавшего Start.

Но это далеко не единственная проблема!!!!

Все приложения, установившие хук раньше Вас не получат уведомление о нажатии клавиши! Вы вызываете CallNextHookEx с параметром KeyboardHook, который тоже равен 0. Так, хорошая работа одного программиста может быть испорчена плохой работой другого.

Решается эта проблема так:

с пом. CreateFileMapping создается отображение в память, доступное всем процессам (см. MSDN, SDK)

с пом. MapViewOfFile ему передается физическая память.

Именно в ней нужно сохранить KeyboardHook и App.

Для получения справки читай MSDN, SDK или, лучше всего Дж. Рихтер Windows для профессионалов 4 изд.
С ув. Алексей




Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.005 c
14-44969
VladP
2003-07-30 08:27
2003.08.14
Посоветуйте цифровой фотоаппарат за 350$


14-45127
Сёма
2003-07-30 23:30
2003.08.14
Вопрос на засыпку


14-45007
Думкин
2003-07-29 05:35
2003.08.14
Стихи


14-45030
galleleo
2003-07-28 17:40
2003.08.14
Есть небольшой заказ!


14-45077
Viktor Kushnir
2003-07-27 08:17
2003.08.14
Delphi 5 Service Packs - Где найти?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский