.nolist
include windows.inc ;die von Windows 3.1 reicht!
.list
ideal
P386
model flat
includelib "import32"
SEGMENT _shar dword use32 private "SHARED"
HHook dd 0 ;den brauchen wir fr CallNextHookEx
Usage dd 0 ;nur zum Spa - ein Zhler!
Scrollbar$ db 'ScrollBar',0 ;ist read-only!
ENDS
DATASEG
Merker db 0
UDATASEG
Hold dd 4 dup (?) ;Halte-Rechteck
CODESEG
proc MinMax
;[WORD EDI] zwischen [DWORD EBX] und [DWORD EBX+8] begrenzen, EDI vorrcken
movsx eax,[word edi]
cmp eax,[ebx]
jg @@1
mov eax,[ebx]
@@1: cmp eax,[ebx+8]
jl @@2
mov eax,[ebx+8]
@@2: stosw
ret
endp
procdesc CallNextHookEx stdcall hhook:DWORD,code:DWORD,wParam:DWORD,lParam:DWORD
procdesc GetClassNameA stdcall wnd:DWORD,str:PTR BYTE,sl:DWORD
procdesc lstrcmpiA stdcall s1:PTR BYTE,s2:PTR BYTE
procdesc GetClientRect stdcall wnd:DWORD,r:PTR DWORD
procdesc ScreenToClient stdcall wnd:DWORD,p:PTR DWORD
procdesc SetRect stdcall r:PTR DWORD,l:DWORD,t:DWORD,r:DWORD,b:DWORD
procdesc MessageBeep stdcall ton:DWORD
procdesc DisableThreadLibraryCalls stdcall hmodule:DWORD
procdesc SetWindowsHookExA stdcall t:DWORD,a:DWORD,hmodule:DWORD,hthread:DWORD
procdesc UnhookWindowsHookEx stdcall hhook:DWORD
proc GetMessageHook stdcall
arg @@code:DWORD, @@wParam:DWORD, @@lParam:DWORD
local @@classname:BYTE:32, @@R:DWORD:4, @@P:DWORD:2
pushad ;alles auf den Stack
call CallNextHookEx,[HHook],[@@code],[@@wParam],[@@lParam]
mov [esp+1Ch],eax ;Rckgabewert
cld
mov esi,[@@lParam]
mov ax,[esi+4] ;Message
cmp ax,WM_LButtonDown
jne @@1
test [Merker],2
jnz @@exi ;nicht schachteln!
lea edi,[@@classname]
call GetClassNameA,[dword esi],edi,32
call lstrcmpiA,offset ScrollBar$,edi
or eax,eax
jnz @@exi
call GetClientRect,[dword esi],offset Hold
jmp @@activate
@@1:
cmp ax,WM_NCLButtonDown
jne @@2
test [Merker],2
jnz @@exi ;nicht schachteln!
lea edi,[@@P]
push edi
movsx eax,[word esi+12] ;lParam, lo=x
stosd
movsx eax,[word esi+14] ;lParam, hi=y
stosd
push [dword esi] ;hWnd
call ScreenToClient
lea edi,[@@R]
call GetClientRect,[dword esi],edi
mov al,[esi+8] ;wParam=HitTestCode
cmp al,HTVScroll
jnz @@1a
push [@@R+12] ;R.bottom
push [@@P] ;P.x
push [@@R+4] ;R.top
push [@@P] ;P.x
jmp @@1b
@@1a:
cmp al,HTHScroll
jnz @@exi
push [@@P+4] ;P.y
push [@@R+8] ;R.right
push [@@P+4] ;P.y
push [@@R] ;R.left
@@1b:
push offset Hold
call SetRect
@@activate:
; call MessageBeep,-1 ;wenn Rollbalken-Treffer
or [Merker],2
jmp @@exi
@@2:
cmp ax,WM_MouseMove
je @@2a
cmp ax,WM_LButtonUp
jne @@exi
@@2a: test [Merker],2 ;Fang aktiv?
jz @@exi ;nein, nicht beeinflussen!
; call MessageBeep,-1 ;wenn Rollbalken-Treffer
lea edi,[esi+12] ;lParam adressieren
lea ebx,[Hold] ;R.left und R.right
call MinMax ;erhht EDI mit STOSW
add ebx,4 ;nun R.top und R.bottom
call MinMax
@@exi:
mov ax,[esi+4] ;message noch einmal
cmp ax,WM_LButtonUp
je @@ex1
cmp ax,WM_NCLButtonUp
jne @@ex2
@@ex1: and [Merker],(not 2) ;Fang aufheben
@@ex2:
popad
ret
endp
proc startdll stdcall
arg @@hinstDLL:DWORD, @@fdwReason:DWORD, @@lpvReserved:DWORD
cmp [@@fdwReason],1 ;DLL_PROCESS_ATTACH
jne @@detach
inc [Usage]
; call MessageBeep,0
call DisableThreadLibraryCalls,[@@hinstDLL]
cmp [HHook],0 ;Erster Aufruf?
jnz @@exi
or [Merker],1 ;Bit 0 = g_IsHookingProcess
call SetWindowsHookExA,WH_GetMessage,offset GetMessageHook,[@@hInstDLL],0
jmp @@ex0
@@detach:
cmp [@@fdwReason],0
jnz @@exi ;ein Irrlufer!?
dec [Usage]
cmp [HHook],0
jz @@exi ;Hook muss existieren!
test [Merker],1
jz @@exi ;Es war nicht der Prozess, der Hook setzte
call UnhookWindowsHookEx,[HHook]
xor eax,eax ;sicherheitshalber
@@ex0:
mov [HHook],eax
@@exi:
ret
endp
end startdll
Vorgefundene Kodierung: UTF-8 | 0
|