Hey, Sean! In your first post you say your script will never work in Win9x. Oh well... not in its official form, but with a few minor changes, it does.
Personally I run Win98SE with some WinME, Win2000, WinXP and even Win2003 system files upgraded. As such, balloon tips display fine when called (see the topics on balloon tips posted around, where I've performed tests). The only drawback is that the close button won't show up so can't be used to close the balloons and also links won't show up (but that doesn't pertain to your script; sorry for the digression).
The color zoomer rectangle appears fine with the cross cursor in the middle of it, but it won't show anything inside, because the layered style used is not supported by the 9x USER32.DLL library and all it captures is the zoom rectangle itself. As such, I'd be grateful if you could offer an alternate option of showing the zoom rectangle as a tooltip to the side of the cross cursor, similar to the magnifier; when so, the script would also work correctly at least in a stock WinME, along with any updated Win98SE such as mine.
The other necessary changes would be:
- replace
RtlFillMemoryULong calls with
NumPut
- replace
CreateWindowEx with
CreateWindowExA
- replace
SetClassLong with
SetClassLongA
Code:
DllCall("ntdll\RtlFillMemoryUlong", "Uint", &ti + 4, "Uint", 4, "Uint", 0x20)
DllCall("ntdll\RtlFillMemoryUlong", "Uint", &ti +36, "Uint", 4, "Uint", &nColor)
hWnd := DllCall("CreateWindowEx", "Uint", 0x08000008, "str", "tooltips_class32", "str", "", "Uint", 0x3, "int", 0, "int", 0, "int", 0, "int", 0, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0, "UInt")
DllCall("SetClassLong", "Uint", hWnd, "int", -12, "int", DllCall("LoadCursor", "Uint", 0, "Uint", 32515))
would become:
Code:
NumPut(0x20, ti, 4, "UInt")
NumPut(&nColor, ti, 36, "UInt")
hWnd := DllCall("CreateWindowExA", "Uint", 0x08000008, "str", "tooltips_class32", "str", "", "Uint", 0x3, "int", 0, "int", 0, "int", 0, "int", 0, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0)
DllCall("SetClassLongA", "Uint", hWnd, "int", -12, "int", DllCall("LoadCursor", "Uint", 0, "Uint", 32515))
The magnifier works fine with the exception of a flickering rectangle to the top-left side of the magnified window, containing the original clipped region unzoomed. Probably a recreation/initialization of the tooltip. I haven't yet checked that particular code to see for a fix.
[EDIT] OK, I've checked the magnifier code and the fix (actually workaround) is pretty simple: check for mouse coordinates and if not changed between loop iterations, just continue the loop. This way it will only flicker while the mouse is moved.

Here's the relevant part fo the code:
Code:
Loop
{
MouseGetPos, xCursor, yCursor
if (oldX = xCursor && oldY = yCursor)
continue
DllCall("BitBlt", "Uint", hDC_LW, "int", 0, "int", 0, "int", 2*nW, "int", 2*nH, "Uint", hDC_SC, "int", xCursor-nW, "int", yCursor-nH, "Uint", 0x40CC0020)
If bInvert
DllCall("BitBlt", "Uint", hDC_LW, "int", 0, "int", 0, "int", 2*nW, "int", 2*nH, "Uint", 0, "int", 0, "int", 0, "Uint", 0x00550009)
Cursor(hDC_LW, nW, nH) ; Capture magnified mouse cursor.
DllCall("StretchBlt", "Uint", hDC_TT, "int", 0, "int", 0, "int", 2*nW*nZ, "int", 2*nH*nZ, "Uint", hDC_LW, "int", 0, "int", 0, "int", 2*nW, "int", 2*nH, "Uint", 0x00CC0020)
; Cursor(hDC_TT, nW*nZ, nH*nZ) ; Capture un-magnified mouse cursor.
WinMove, ahk_id %hWnd%,, xCursor-(nW*nZ+1), yCursor+nH, 2*(nW*nZ+1), 2*(nH*nZ+1)
oldX := xCursor
oldY := yCursor
If GetKeyState("Esc")
Break
}
Thank you so much for the script!
