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