Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизПроблемы с SetWindowHookEx Найти похожие ветки
← →
KASioZ (2005-01-02 11:09) [0]Здравствуйте ув. программисты
У меня следующая проблема:
Я устанавливаю глобальную ловушку в системе.
В глобальной ловушке я ловлю все сообщения сис-мы, проверяю сообщение, если сообщение WM_KeyDown, то сохраняем в локальный файл нажатые клавиши.
Почему то моя программа сохраняет данные только в случае если моё приложение активно! Хотя хук глобальный и клавиши передаются в обработчик событий!
Это я проверяю ShowMessage, работает всегда.
Вот код DLL:
library myhookdll;
uses
SysUtils,
Windows,
Dialogs,
Messages;
var
HookHandle: HHOOK = 0;
F: File;
{$R *.res}
function KeyHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
buff: array [1..100] of char;
begin
if TMsg(Pointer(lParam)^).message = WM_KeyDown then
begin
GetKeyNameText(TMsg(Pointer(lParam)^).lParam, @buff, SizeOf(buff));
BlockWrite(F,buff,1);
ShowMessage(StrPas(@buff));
end;
result:=CallNextHookEx(HookHandle,code,wParam,lparam);
end;
procedure SetKeyHook; export; stdcall;
begin
AssignFile(f,"ntnpn32.dat");
if FileExists("ntnpn32.dat") then Reset(F,1)
else Rewrite(F,1);
if HookHandle = 0 then HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,@KeyHook,hInstance, 0);
end;
procedure UnSetKeyHook; export; stdcall;
begin
CloseFile(F);
if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
HookHandle:=0;
end;
exports
SetKeyHook name "SetKeyHook",
UnSetKeyHook name "UnSetKeyHook";
begin
end.
Вот код загрузчика:
procedure TForm1.FormCreate(Sender: TObject);
begin
SetKeyHook;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnSetKeyHook;
end;
← →
Vaitek © (2005-01-02 12:31) [1]Не знаю, у меня такой работал.
library Key;
uses
WinTypes,
WinProcs,
Messages,
SysUtils,
Classes;
const
KeyEvent = WM_USER + 1;
var
HookHandle: hHook;
wnd: hWnd;
{$R *.res}
function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
begin
if Code >= 0 then
begin
wnd := FindWindow("TSVMain", nil);
SendMessage(wnd, KeyEvent, wParam, lParam);
Result := 0;
end else
Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure SetKeyHook;
begin
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
end;
procedure DelKeyHook;
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
exports
SetKeyHook index 1,
DelKeyHook index 3;
Begin
end.
А в главном окне программы обрабатывал
procedure WM_NextMSG(var Msg: TMessage); message KeyEvent;
← →
Piter © (2005-01-02 13:25) [2]перед тем как разбираться с хуками, весьма желательно изучить более простые вещи - например, что такое ВАП и все с ним связанное.
Что касается хуков - есть статья на это сайте по хукам.
← →
Piter © (2005-01-02 13:27) [3]Vaitek © (02.01.05 12:31) [1]
зачем выкладывать какой-то код, если ты в этом коде ни фига не разбираешься и только можешь подать плохой пример?
← →
Vaitek © (2005-01-02 13:47) [4]Почему плохой пример?
Во-первых он списан со статьи на этом сайте.
Во-вторых он работает. Могу прислать прогу, если интересно, целиком.
Ну а в третьих, что такое ВАП? Случаем не winapi?
← →
KASioZ (2005-01-02 15:00) [5]Во первых код не списан
Во вторых я понимаю абсолютно каждую строчку
А в третьих лучше помогите разобратся с проблемой
а кто сможет замыльте рабочие сырцы на fakom@Mail.ru
← →
VMcL © (2005-01-02 15:07) [6]>>KASioZ (02.01.05 11:09)
>Проблемы с SetWindowHookEx
Нет такой функции в WinAPI. Есть SetWindowsHookEx.
По поводу вопроса, смотрите, как и порекомендовал Piter, статью:
http://www.delphimaster.ru/articles/hooks/index.html
>>Vaitek © (02.01.05 13:47) [4]
>Почему плохой пример?
Потому что неправильный.
>Во-первых он списан со статьи на этом сайте.
Верно. Из примера, взятого из example.zip::Example1\hook_dll1.dpr, где в заголовке написано:// Demo of wrong hook - DLL module //
К тому же ясно, что статью Вы не читали, потому что в ней об этом написано:
>Думаю, теперь, разобравшись в исходных кодах библиотек из первого примера, вы поняли, как НЕ надо писать DLL, из которых вы устанавливаете глобальные ловушки.
>Во-вторых он работает.
Смотря на какой версии Windows.
← →
VMcL © (2005-01-02 15:09) [7]>>Vaitek © (02.01.05 13:47) [4]
P.S.
>Ну а в третьих, что такое ВАП? Случаем не winapi?
Случаем не winapi. А случаем, Виртуальное адресное пространство.
← →
Vaitek © (2005-01-02 15:39) [8]Ну ладно, ладно, где моя походная лопата, пора выкапываться из асфальта. На 2003 винде работает, на ХР тоже.
С замечанием согласен, хотя, как выяснилось, пример я взял не из статьи, а тот что мне вот так же написали на форуме. Давно это было, подзабыл. Так что сорри, за не совсем корекктный пример.
← →
KASioZ (2005-01-02 17:01) [9]Эту статью я тоже читал!
Но где ошибка ?
Ведь всё делается верно!
ShowMessage(); возращает нормальный результат
а вот в файл почему то не пишет
как будто переменная пуста
А надо чтобы работало под платформой WinNT (NT, 2K, XP, 2K3).
И причем сдесь адресное пространство ?
Ловушка то глобальная
← →
Vaitek © (2005-01-02 17:23) [10]Там глючокс, когда две копии проги сапускаешь. Я об этом как-то не подумал.
← →
Piter © (2005-01-02 17:28) [11]KASioZ (02.01.05 17:01) [9]
Эту статью я тоже читал!
это ты моим тапочкам рассказывать будешь, что ЧИТАЛ (а не просматривал) статью.
Ну ясен пень, супер хакеры не смотрят на всякие там диаграммы и рисунки, и параграфы пояснительные к этим диаграммам не читают - нафиг надо? Там что-то сложновато читать, термины непонятные... Лучше просто не читать это место, а потом на форуме кричать "почему не работает?!"
← →
Piter © (2005-01-02 17:30) [12]Vaitek © (02.01.05 17:23) [10]
Там глючокс, когда две копии проги сапускаешь
там "глючокс" не только в этом
← →
KASioZ (2005-01-03 18:01) [13]А моим тапочкам ты будешь рассказывать
Что там есть причина неработоспособности DLL
И если ты такой читалец статей, то лучше помог бы!
Я на форумах не просто треплюсь а помогаю по возможности!
Vaitek а что за глюк ?
Когда 2 копии пускаешь ?
Хммм да мне и не нужно 2 копии пускать
и пускаться они не будут
← →
Piter © (2005-01-03 18:47) [14]поразительно как люди готовы целыми днями выпрашивать ответ в форуме, а в тоже время заглянуть в статью и за полчаса разобраться не хотят...
← →
Vaitek © (2005-01-03 20:34) [15]Не стоит думать обо всех в серых тонах. Я в статью заглянул, сравнил код со своим, понял что ошибался, но разбираться мне влом, поскольку сейчас мне это совершенно не интересно.
← →
Davinchi © (2005-01-03 20:57) [16]Тя пракильно уже направляли, у меня была подобная проблема - все дело в адресном пространстве, которое занимает твоя ДЛЛ когда ты ее загружаешь, те нужен объект файлового отображения и лучше храни дескриптер полученый от SetWindowsHookEx....
Перечитай статью именно на этом моменте....
← →
kaZaNoVa © (2005-01-03 21:55) [17]Davinchi © (03.01.05 20:57) [16]
> лучше храни дескриптер полученый от SetWindowsHookEx
ЛЮДИ, не парьтесь - указано же Win2k, WinXP - 0 надо ставить:))))
← →
GuAV © (2005-01-03 22:19) [18]kaZaNoVa © (03.01.05 21:55) [17]
ЛЮДИ, не парьтесь - указано же Win2k, WinXP - 0 надо ставить:))))
а в MSDN это написано ?
← →
kaZaNoVa © (2005-01-03 22:21) [19]GuAV © (03.01.05 22:19) [18]
ага, имхо можно 0 передавать в виндах 2000 и выше :)))
← →
GuAV © (2005-01-03 22:40) [20]Да, уже вижу
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookre ference/hookfunctions/callnexthookex.asp
Первый параметр Ignored. Но ведь в 9х не Ignored !
← →
kaZaNoVa © (2005-01-03 22:43) [21]GuAV © (03.01.05 22:40) [20]
забей на 9х =)
← →
Eraser © (2005-01-03 23:44) [22]Absolutly correct )))
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.038 c