在這裏,我告訴你一個解決方案,我已經取得了一些時間:
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <StructureConstants.au3>
OnAutoItExitRegister('OnAutoItExit')
Global $iMagZoom = 5
Global $iMagWidth = Ceiling(100/$iMagZoom)
Global $iMagHeight = Ceiling(100/$iMagZoom)
Global $hDCDesk, $hDCZoom, $hPen
Global $hUser32 = DllOpen("user32.dll")
Global $hGDI32 = DllOpen("gdi32.dll")
Global $__hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hMouseProc), _WinAPI_GetModuleHandle(0))
Global $hCross = GUICreate('', 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
WinSetTrans($hCross, '', 10)
GUISetCursor(3, 1, $hCross)
Global $hZoom = GUICreate("Zoom Window", $iMagWidth * $iMagZoom, $iMagHeight * $iMagZoom, _
MouseGetPos(0), MouseGetPos(1), $WS_POPUP+$WS_BORDER, $WS_EX_TOPMOST)
GUISetState(@SW_SHOW, $hCross)
GUISetState(@SW_SHOW, $hZoom)
; once at start, than from mouse-callback-function
_Magnify()
While 1
Sleep(10)
WEnd
Func _ende() ; called by mouse left click
Exit
EndFunc
Func _Magnify($_iX=-1, $_iY=-1)
Local Static $fInit = True
If $fInit Then
$fInit = False
$hDCDesk = (DLLCall($hUser32, "int", "GetDC", "hwnd", 0))[0]
$hDCZoom = (DLLCall($hUser32, "int", "GetDC", "hwnd", $hZoom))[0]
$hPen = (DLLCall($hGDI32, "int", "CreatePen", "int", 0, "int", 3, "int", 0x00800000))[0] ; 0=PS_SOLID, dark-blue (0x00BBGGRR)
DLLCall($hGDI32, "int", "SelectObject", "int", $hDCZoom, "hwnd", $hPen)
$_iX = MouseGetPos(0)
$_iY = MouseGetPos(1)
EndIf
Local $iW = $iMagWidth * $iMagZoom, $iH = $iMagHeight * $iMagZoom
If Not @error Then
DLLCall($hGDI32, "int", "StretchBlt", "int", $hDCZoom, "int", _
0, "int", 0, "int", $iW, "int", $iH, "int", $hDCDesk, "int", _
$_iX - $iMagWidth/2, "int", $_iY - $iMagHeight/2, "int", $iMagWidth ,"int", $iMagHeight, _
"long", $SRCCOPY)
; draw the crosshair
_GDI32_DrawLine($hDCZoom, ($iW/2)-2, $iH/8, ($iW/2)-2, 3*($iH/8), $hGDI32) ; vertical
_GDI32_DrawLine($hDCZoom, ($iW/2)-2, 5*($iH/8), ($iW/2)-2, 7*($iH/8), $hGDI32) ; vertical
_GDI32_DrawLine($hDCZoom, $iW/8, ($iH/2)-2, 3*($iW/8), ($iH/2)-2, $hGDI32) ; horicontal
_GDI32_DrawLine($hDCZoom, 5*($iW/8), ($iH/2)-2, 7*($iW/8), ($iH/2)-2, $hGDI32) ; horicontal
EndIf
EndFunc
Func _GDI32_DrawLine(ByRef $_hDC, $_iX0, $i_Y0, $_iX1, $i_Y1, $_hDll=-1)
If $_hDll = -1 Then $_hDll = "gdi32.dll"
Local $tCurrent = DllStructCreate("struct; long X;long Y; endstruct")
DllCall($_hDll, "int", "MoveToEx", "int", $_hDC, "int", $_iX0, "int", $i_Y0, "ptr", DllStructGetPtr($tCurrent))
DllCall($_hDll, "int", "LineTo", "int", $_hDC, "int", $_iX1, "int", $i_Y1)
Return $tCurrent
EndFunc
Func _MouseProc($_nCode, $_wParam, $_lParam)
Local $tMSLLHOOKSTRUCT = DllStructCreate("struct; long X;long Y; endstruct; " & _
"DWORD mouseData; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo;endstruct", $_lParam)
If $_nCode < 0 Then Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam)
Local $iX = $tMSLLHOOKSTRUCT.X, $iY = $tMSLLHOOKSTRUCT.Y
Switch $_wParam
Case $WM_LBUTTONDOWN
_ende()
Case $WM_MOUSEMOVE
WinMove($hCross, "", $iX -24, $iY -24)
Local $iXz = ($iX +24 + $iMagWidth*$iMagZoom > @DesktopWidth) ? $iX -(24 + $iMagWidth*$iMagZoom) : $iX +24
Local $iYz = ($iY +24 + $iMagHeight*$iMagZoom > @DesktopHeight) ? $iY -(24 + $iMagHeight*$iMagZoom) : $iY +24
WinMove($hZoom, "", $iXz + $iMagWidth/2, $iYz)
_Magnify($iX, $iY)
EndSwitch
Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam)
EndFunc
Func OnAutoItExit()
DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCZoom, "hwnd", $hPen)
DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCDesk, "hwnd", 0)
DLLCall($hUser32, "int", "ReleaseDC", "int", $hDCZoom, "hwnd", 0)
DllClose($hUser32)
DllClose($hGDI32)
_WinAPI_UnhookWindowsHookEx($__hHook)
DllCallbackFree($__hMouseProc)
EndFunc
非常感謝!這是我需要的。雖然我需要十字線在中心相交,但我認爲我可以自己做到這一點:) – Maeko