Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.71.142] |
|
Сообщ.
#1
,
|
|
|
Dpr:
program MainUnit;<br>Uses Windows,SysUtils;<br><br>type MyProcType = procedure (Flag: Boolean); stdcall;<br><br>Var Hook: MyProcType;<br> HDLL:HWND;<br><br>begin<br> @Hook:=nil;<br> HDLL:=LoadLibrary(PChar('HPPCloser.dll'));<br> IF HDLL>HINSTANCE_ERROR then<br> Begin<br> @Hook:=GetProcAddress(HDLL,'Hook');<br> Hook(True);<br> End else MessageBox(0,'Error loading of hook!','Error',MB_OK or MB_ICONERROR);<br>end. DLL: library HppCloser;<br>uses Windows, Classes;<br><br>Var SysHook:HHook=0;<br><br>Procedure PrintClassName(Hnd: HWND);<br>Var P: PChar;<br>Begin<br> New(P);<br> GetClassName(Hnd,P,255);<br> MessageBox(0,P,'info',MB_OK);<br> Dispose(P);<br>End;<br><br>Function SysCbtProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt;<br>Begin<br> IF Code=HCBT_CREATEWND then PrintClassName(wParam); //='#32770:Dialog';<br> Result:=CallNextHookEx(SysHook,Code,WParam,LParam);<br>end;<br><br>procedure Hook(Flag:Boolean); export; stdcall; <br>Begin <br> IF Flag then SysHook:=SetWindowsHookEx(WH_CBT,@SysCbtProc,HInstance,0) Else <br> Begin <br> UnhookWindowsHookEx(SysHook); <br> SysHook:=0; <br> End; <br>End;<br><br>exports Hook;<br><br>{$R *.res}<br><br>begin<br>end. И получаю в резльтате что ни один MessageBox() не выдаётся, хотя должно выдаться по меньшей мере сотня. stdcall ставить пробовал.. У кого есть какие идеи? |
Сообщ.
#2
,
|
|
|
Проблема решена.
|
Сообщ.
#3
,
|
|
|
как именно?
|
Сообщ.
#4
,
|
|
|
Был перепутана форма параметров call-back ф-ии хука.
С точки зрения Object Pascal и АПИ вообще x1,x2: Integer и x1: Integer; x2: Integer; - совершенно разные вещи. В стёк эти параметры передаются неодинаково, хотя выглядит как одно и тоже. |
Сообщ.
#6
,
|
|
|
2 Song:
Покажи наглядно, как было, и как надо? |
Сообщ.
#7
,
|
|
|
Было: Function SysCbtProc(Code: Integer; WParam: LongInt; LParam: LongInt):LongInt;
Надо: Function SysCbtProc(Code:Integer; WParam, LParam: LongInt): LongInt; JinX оспаривает что из-за этого, но у меня его сведения не проходят, возможно проблема в разных Дельфях. |