Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-50742
maxim2
2002-09-05 06:10
2002.09.16
Запретить изменение размеров формы до определенных.


3-50630
@Ujin
2002-08-26 19:11
2002.09.16
как ???


1-50849
Valeris
2002-09-04 15:02
2002.09.16
Компонент для работы с Excel


1-50683
KidMan
2002-09-04 22:48
2002.09.16
Вывод в файл


8-50876
PEC
2002-05-15 10:55
2002.09.16
Помогите !!!





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