Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
ВнизСрочно!!! Нужна помощь по хукам. Найти похожие ветки
← →
MaxSit (2002-09-04 14:43) [0]Добрый день!
Написан хук на клавиатуру, который отлично работает в Win2000 и WinXP, но не пашет в Win9*. Подскажите куда копать, бо работа совсем остановилась. Привожу поскипанный код:
library hk;
uses Windows,Messages,SysUtils,RxCalc;
var H_Calc: THandle;
function KeyUp_Ctrl: Boolean;
begin
Result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0;
end;
procedure RunLocalCalculator;
begin
...
тут создаю, работаю и уничтожаю калькулятор
...
end;
function Hook_Calc(Code: Integer; WParam: WParam;LParam: LParam): Longint; StdCall;
begin
if Code>=0 then
if (wParam=vk_F8)and(((lParam shr 16) and KF_UP)=0)and
(KeyUp_Ctrl)and(GetForegroundWindow<>0) then RunLocalCalculator;
Result:=CallNextHookEx(H_Calc,Code,wParam,lParam);
end;
procedure SetHOOK_Calc; StdCall;
begin
H_Calc:=SetWindowsHookEx(WH_KEYBOARD,@Hook_Calc,hInstance,0);
end;
procedure RemoveHOOK_Calc; StdCall;
begin
UnhookWindowsHookEx(H_Calc);
end;
exports
SetHOOK_Calc,
RemoveHOOK_Calc;
end.
← →
MaxSit (2002-09-04 14:55) [1]Да, забыл сказать. Сам хук загружается нормально, но при нажатии на любую клавишу, говорить, что аксес виолатион.
← →
Ученик (2002-09-04 14:57) [2]H_Calc в других процессах не восстанавливается, смотри в разделе Статьи
← →
MaxSit (2002-09-04 15:50) [3]Новый вариант, по статье (тот же результат, ошибка на том же месте):
library Force_hk;
uses Windows,Messages,SysUtils,RxCalc;
const MMFName_Calc: PChar = "MForce_Calc";
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND;
end;
var
GlobalData_Calc: PGlobalDLLData;
MMFHandle_Calc: THandle;
function KeyUp_Ctrl: Boolean;
begin
Result:=(Word(GetKeyState(VK_CONTROL)) and $8000)<>0;
end;
function WindowClassName(Wnd: HWnd): String;
var Buffer: array[0..255] of Char;
begin
SetString(Result,Buffer,GetClassName(Wnd,Buffer,SizeOf(Buffer)-1));
end;
procedure RunLocalCalculator;
begin
...
тут создаю, работаю и уничтожаю калькулятор
...
end;
function Hook_Calc(Code: Integer; WParam: WParam;LParam: LParam): Longint; StdCall;
begin
if Code>=0 then
if (wParam=vk_F8)and(((lParam shr 16) and KF_UP)=0)and
(KeyUp_Ctrl)and(GetForegroundWindow<>0) then RunLocalCalculator;
Result:=CallNextHookEx(GlobalData_Calc^.SysHook,Code,wParam,lParam);
end;
procedure SetHOOK_Calc; StdCall;
begin
GlobalData_Calc^.SysHook:=SetWindowsHookEx(WH_KEYBOARD,@Hook_Calc,hInstance,0);
end;
procedure RemoveHOOK_Calc; StdCall;
begin
UnhookWindowsHookEx(GlobalData_Calc^.SysHook);
end;
procedure OpenGlobalData();
begin
MMFHandle_Calc:=CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,SizeOf(TGlobalDLLData),MMFName_Calc);
GlobalData_Calc:=MapViewOfFile(MMFHandle_Calc,FILE_MAP_ALL_ACCESS,0,0,SizeOf(TGlobalDLLData));
if GlobalData_Calc=nil then begin
CloseHandle(MMFHandle_Calc);
end;
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData_Calc);
CloseHandle(MMFHandle_Calc);
end;
procedure DLLEntryPoint(dwReason: DWord); StdCall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports
SetHOOK_Calc,
RemoveHOOK_Calc;
begin
DLLProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
Ученик (2002-09-04 16:15) [4]>MaxSit © (04.09.02 15:50)
В каком, код рабочий на Windows 95
← →
Ученик (2002-09-04 16:15) [5]string ты зря используешь
← →
MaxSit (2002-09-04 16:18) [6]Тестирую на WIN98. Программа запускается нормально, но при нажатии на любую клавишу приводит к AV. На Win95 проверить не могу, из-за отсутствия такового.
Перепробовал все варианты (один из основных: убрать RxCalc), но все по старому.
← →
Ученик (2002-09-04 16:26) [7]>MaxSit © (04.09.02 16:18)
пробовал,
procedure RunLocalCalculator;
begin
WinExec("calc.exe", sw_shownormal)
end;
← →
MaxSit (2002-09-04 16:28) [8]String`и все убрал. Результат не изменился. Может дело в вызове?
procedure SetHook;
type TSetHooks = procedure; StdCall;
var SetHook_Calc: TSetHooks;
hModuleHook: HInst;
begin
hModuleHook:=LoadLibrary(PChar("hk.dll"));
try
if (hModuleHook<>NULL)and(hModuleHook<>0) then begin
@SetHook_Calc:=GetProcAddress(hModuleHook,PChar("SetHOOK_Calc"));
if Assigned(SetHook_Calc) then SetHook_Calc
end;
finally
if hModuleHook<>NULL then FreeLibrary(hModuleHook);
end;
end;
procedure RemoveHook;
type TRemoveHooks = procedure; StdCall;
var RemoveHook_Calc: TRemoveHooks;
hModuleHook: HInst;
begin
hModuleHook:=LoadLibrary(PChar("Force_hk.dll"));
try
if (hModuleHook<>NULL)and(hModuleHook<>0) then begin
@RemoveHook_Calc:=GetProcAddress(hModuleHook,PChar("RemoveHOOK_Calc"));
if Assigned(RemoveHook_Calc) then RemoveHook_Calc;
end;
finally
if hModuleHook<>NULL then FreeLibrary(hModuleHook);
end;
end;
← →
MaxSit (2002-09-04 16:30) [9]> WinExec("calc.exe", sw_shownormal)
Такой калькулятор мне не подходит по ряду причин. Одна из основных: нет возвращаемого значения.
← →
Ученик (2002-09-04 16:39) [10]С WinExec("calc.exe", sw_shownormal) ошибка есть ?
И текст RunLocalCalculator был бы интересен
← →
Учени (2002-09-04 16:41) [11]>MaxSit © (04.09.02 16:28)
А это совсем непонятно
← →
MaxSit (2002-09-04 16:44) [12]Дело в том, что если RunLocalCalculator пустой, то ошибка все равно возникает (только что пробовал).
На счет вызовов:
SetHook - установка (запуск) хука из EXE файла (OnCreate)
RemoveHook - остановка (OnClose).
← →
Ученик (2002-09-04 16:53) [13]>MaxSit © (04.09.02 16:44)
Странно все тут как-то названия DLL-разные FreeLibrary зачем-то
← →
MaxSit (2002-09-04 17:17) [14]Большое спасибо, Ученик, за выделенное для меня время. Все заработало.
1.) Название DLL - просто опечатка (прошу прощение).
2.) Зачем поставил FreeLibrary? Да черт его за ногу дернул, без него заработало, как с листа. Все нормально.
Еще раз спасибо.
P.S.
Осталось загадкой только одно: почему все так классно работало в Win2000?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c