2016-10-13 89 views
0

我以前用過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'

感謝您的想法!

回答

2

如果您使用的是Windows 10一個更新(10.0.14393),你可以旋轉了一個單獨的線程,並單獨每監視器DPI知道線程,並留下您的主界面爲DPI不知情。

SetThreadDpiAwarenessContext function

如果您正在使用一個版本的Visual Studio的建設在2015年之前,你可以聲明一個指針的函數原型

DPI_AWARENESS_CONTEXT WINAPI SetThreadDpiAwarenessContext(
    _In_ DPI_AWARENESS_CONTEXT dpiContext 
); 

,並使用GetProcAddress的測試對於存在的功能,然後再調用它。凡是在該線程會給你原始的物理信息,如果您使用的

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE 

請注意,此功能不可用在Windows 10 10.0.10586。您必須測試其可用性。

+0

這是比我最終結束的工作更好的解決方案:https://www.autoitscript.com/forum/topic/185045-screencapture-4k-res-how-to-get-dpi-awareness/ #comment-1329168 非常感謝! –

+0

確保在調用您感興趣的API後,再次調用SetThreadDpiAwareness,並將線程的DPI感知設置恢復爲默認進程意識,否則感知模式可能會在之後引發其他問題......除非您「我有一個專門調用這個API的線程。 – peterfelts