REM Program to cause 'found' text to be highlighted near middle of screen
INSTALL @lib$+"CALLBACK"
ContextGap% = 14
REM!WC Windows Constants:
EMU_SETSEL = 1041
GWL_WNDPROC = -4
MEM_COMMIT = 4096
PAGE_EXECUTE_READWRITE = 64
VK_DOWN = 40
VK_UP = 38
WM_KEYDOWN = 256
SYS "GetWindowThreadProcessId", @hwnd%, ^pid%
SYS FN_syscalls("EnumWindows"), FN_callback(FNenumwinfunc(), 2), pid%
res% = FN_sysresult
SYS "FindWindowEx", hMain%, 0, "BBCEdit", 0 TO hEdit%
IF hEdit% = 0 ERROR 0, "Failed to find edit window handle"
SYS "VirtualAlloc", 0, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE TO P%
[OPT 2
.oldeditwndproc
dd 0
;
.defeditwndproc
pop eax : push [oldeditwndproc] : push eax
jmp "CallWindowProc"
;
.neweditwndproc
mov eax,[esp+8] ; iMsg
cmp eax,EMU_SETSEL
jnz defeditwndproc
push dword [esp+16] ; lParam
push dword [esp+16] ; wParam
push dword [esp+16] ; iMsg
push dword [esp+16] ; hWnd
call defeditwndproc ; forward EMU_SETSEL
mov ecx,ContextGap%
.up1
push ecx
push 0 ; lParam
push VK_UP ; wParam
push WM_KEYDOWN ; iMsg
push dword [esp+20] ; hWnd
call defeditwndproc ; cursor up
pop ecx
loop up1
mov ecx,ContextGap%*2
.down
push ecx
push 0 ; lParam
push VK_DOWN ; wParam
push WM_KEYDOWN ; iMsg
push dword [esp+20] ; hWnd
call defeditwndproc ; cursor down
pop ecx
loop down
mov ecx,ContextGap%
.up2
push ecx
push 0 ; lParam
push VK_UP ; wParam
push WM_KEYDOWN ; iMsg
push dword [esp+20] ; hWnd
call defeditwndproc ; cursor up
pop ecx
loop up2
push dword [esp+16] ; lParam
push dword [esp+16] ; wParam
push dword [esp+16] ; iMsg
push dword [esp+16] ; hWnd
call defeditwndproc ; forward EMU_SETSEL again
ret 16
]
SYS "GetWindowLong", hEdit%, GWL_WNDPROC TO !oldeditwndproc
SYS "SetWindowLong", hEdit%, GWL_WNDPROC, neweditwndproc
END
DEF FNenumwinfunc(hwnd%, param%)
LOCAL pid%, class%
SYS "GetWindowThreadProcessId", hwnd%, ^pid%
IF pid% = param% THEN
DIM class% LOCAL 255
SYS "GetClassName", hwnd%, class%, 255
IF $$class% = "BBCWin" THEN hMain% = hwnd% : = 0
ENDIF
= 1