我以前用過autoit的_ScreenCapture_Capture沒有任何問題。但現在我在4k分辨率屏幕上的窗戶10上(在表面書上)。所以我在Windows 10中以200%使用dpi縮放功能。Autoit ScreenCapture DPI知道
當我使用_ScreenCapture_capture現在我沒有得到我所要求的。我得到了2x放大的東西,以及.5我要求的廣場的位置。
例如
_ScreenCapture_Capture("c:\a.bmp", 100, 100, 200, 200)
; Path, X1, Y1, X2, Y2
不給我在(100,100)屏幕的100×100像素的正方形到(200,200)。相反,它在(50,50)至(100,100)處給出了100×100像素的屏幕平方。因爲當我達到200%時,每平方英寸的點數減半。
反正我沒有找到一個解決方案:)
DllCall("User32.dll", "bool", "SetProcessDPIAware")
但是這種解決方案螺絲了GUI的外觀。所以,我當時找了一個工作了一圈,發現this code:
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
這對GUI的偉大工程,但是當涉及到_ScreenCapture_Capture電話並不會在所有幫助。
所以看來我可以有一個好看的程序或功能程序,但不是兩個。
縮放DPI已經存在多年 - 我不能成爲第一個嘗試捕捉屏幕的一部分並遇到這個問題的人,但我找不到任何人在討論這個問題。
有關我如何將這兩種解決方案結合起來以獲得良好的GUI和功能性程序的任何建議?我想如果我知道如何做相反的事情
DllCall("User32.dll", "bool", "SetProcessDPIAware")
我可以在需要時打開或關閉兼容性。當gui被使用時,我可以關閉它,然後當我需要捕獲屏幕部分時,我可以使用該行代碼打開兼容性,然後在完成捕獲屏幕部分時立即關閉它。但我不知道如何'UNsetprocessdpiaware'
感謝您的想法!
這是比我最終結束的工作更好的解決方案:https://www.autoitscript.com/forum/topic/185045-screencapture-4k-res-how-to-get-dpi-awareness/ #comment-1329168 非常感謝! –
確保在調用您感興趣的API後,再次調用SetThreadDpiAwareness,並將線程的DPI感知設置恢復爲默認進程意識,否則感知模式可能會在之後引發其他問題......除非您「我有一個專門調用這個API的線程。 – peterfelts