2016-10-13 19 views
0

私はautoitの_ScreenCapture_Captureを問題なく使用しています。しかし、今私は4k解像度のスクリーン(表面の本に)でウィンドウズ10にいる。だから私は200%でWindows 10でdpiスケーリング機能を使用しています。Autoit ScreenCapture DPI対応

私は_ScreenCapture_captureを使用すると、今私は何を求めているのですか?私は2倍のズームを得て、.5私が求めた広場の場所。例えば

_ScreenCapture_Capture("c:\a.bmp", 100, 100, 200, 200) 
;        Path, X1, Y1, X2, Y2 

は、(200200)に私(100100)の画面の100×100ピクセルの正方形を与えるものではありません。それどころか、それは私に(50,50)から(100,100)のスクリーンの100x100ピクセルの正方形を与えます。なぜなら、私が200%になったら、1平方インチあたりのドット数は半分になるからです。

はとにかく、私は解決策を見つけた:)

DllCall("User32.dll", "bool", "SetProcessDPIAware") 

GUIがどのように見えるかしかし、この解決策は、ねじアップ。だから私は、その後の周りの仕事を探したとthis codeが見つかりました:GUIのための素晴らしい作品が、それは呼び出しを_ScreenCapture_Captureに来るときは全く役に立ちません

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 

を。

だから、私は見た目の良いプログラムか機能しているプログラムのどちらかを使うことができますが、両方はできません。

DPIのスケーリングは長年にわたり行われています。私は、画面の一部をキャプチャしてこの問題に遭遇しようとする最初のものにはなりませんが、この問題について話す人はいません。

これらの2つのソリューションをどのように組み合わせて、優れたGUIと機能するプログラムを得ることができるかについてのご意見はありますか?私は

DllCall("User32.dll", "bool", "SetProcessDPIAware") 

の反対を行う方法を知っていれば、必要なときに、私は基本的にオンとオフの互換性を回すことができると思いました。 guiが使用されている間、私はそれを消すことができました。次に、画面部分をキャプチャする必要があるときに、そのコード行を使用して互換性を有効にしてから、画面部分をキャプチャしたら直ちにオフにします。しかし、私は「プロセスソフトウェアの設定を解除する」方法を知らない。

あなたの考えをありがとう!

答えて

2

Windows 10 Aアップデート(10.0.14393)を使用している場合は、個別のスレッドをスピンアップして、モニタをDPI対応にするだけで、メインGUIをdpiとして認識させることができます。

あなたは、Visual Studioのバージョンを使用して構築している場合は、関数のプロトタイプ

DPI_AWARENESS_CONTEXT WINAPI SetThreadDpiAwarenessContext(
    _In_ DPI_AWARENESS_CONTEXT dpiContext 
); 

へのポインタを宣言し、存在をテストするためのGetProcAddressを使用することができます2015年前に

SetThreadDpiAwarenessContext function

を参照してください。あなたがそれを呼び出す前に関数のあなたは、この機能は、Windows 10 10.0.10586で利用できないことを

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE 

注意を使用した場合、そのスレッド内のものは、あなたに、生の物理的な情報を提供します。その可用性をテストする必要があります。

+0

これは最終的に私が最終的に終わったより良い解決策です:https://www.autoitscript.com/forum/topic/185045-screencapture-4k-res-how-to-get-dpi-awareness/ #comment-1329168 ありがとう、ずっと! –

+0

興味のあるAPIを呼び出してからSetThreadDpiAwarenessを再度呼び出して、スレッドのDPI認識をデフォルトのプロセス認識に戻すようにしてください。そうしないと、認識モードが後で別のものになる可能性があります。このAPIを呼び出す専用のスレッドがあります。 – peterfelts

関連する問題