Source file: /~heha/hsn/maus32.zip/rollfang/rollfa32.asm

	.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 für CallNextHookEx
Usage		dd	0		;nur zum Spaß - ein Zähler!
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 vorrücken
	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		;Rückgabewert
	 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			;erhöht 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 Irrläufer!?
	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
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded