Раньше я использовал _ScreenCapture_Capture()
AutoIt без каких-либо проблем. Но в Windows 10 с экраном с разрешением 4k я использую масштабирование DPI на уровне 200%. _ScreenCapture_capture()
теперь получает 2-кратное увеличение и половину местоположения, которое я просил.
Например :
_ScreenCapture_Capture("c:\a.bmp", 100, 100, 200, 200)
; Path, X1, Y1, X2, Y2
Не возвращает квадрат экрана размером 100x100 пикселей (от 100,100
до 200,200
). Вместо этого он возвращает квадрат размером 100x100 пикселей (от 50,50
до 100,100
).
Я нашел решение:
DllCall("User32.dll", "bool", "SetProcessDPIAware")
Однако это портит внешний вид графического интерфейса. Затем я нашел этот код:
GUISetFont(8.5 * _GDIPlus_GraphicsGetDPIRatio()[0])
Func _GDIPlus_GraphicsGetDPIRatio($iDPIDef = 96)
Local $aResults[2] = [1, 1]
_GDIPlus_Startup()
Local $hGfx = _GDIPlus_GraphicsCreateFromHWND(0)
If @error Then Return SetError(1, @extended, $aResults)
#forcedef $__g_hGDIPDll, $ghGDIPDll
$aResult = DllCall($__g_hGDIPDll, "int", "GdipGetDpiX", "handle", $hGfx, "float*", 0)
If @error Then Return SetError(2, @extended, $aResults)
Local $iDPI = $aResult[2]
Local $aresults[2] = [$iDPIDef / $iDPI, $iDPI / $iDPIDef]
_GDIPlus_GraphicsDispose($hGfx)
_GDIPlus_Shutdown()
Return $aresults
EndFunc ;==>_GDIPlus_GraphicsGetDPIRatio
Что отлично работает для графического интерфейса, но не помогает для _ScreenCapture_Capture()
вызовов. Кажется, у меня может быть либо красивая, либо работающая программа, но не то и другое одновременно.
Как я могу объединить эти два решения, чтобы получить как хороший графический интерфейс, так и работающую программу? Если бы я знал, как сделать противоположное:
DllCall("User32.dll", "bool", "SetProcessDPIAware")
Затем, когда мне нужно захватить часть экрана, я могу включить совместимость, а затем сразу же отключить ее после завершения захвата. Но я не знаю, как «UNsetprocessdpiaware».