私は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が使用されている間、私はそれを消すことができました。次に、画面部分をキャプチャする必要があるときに、そのコード行を使用して互換性を有効にしてから、画面部分をキャプチャしたら直ちにオフにします。しかし、私は「プロセスソフトウェアの設定を解除する」方法を知らない。
あなたの考えをありがとう!
これは最終的に私が最終的に終わったより良い解決策です:https://www.autoitscript.com/forum/topic/185045-screencapture-4k-res-how-to-get-dpi-awareness/ #comment-1329168 ありがとう、ずっと! –
興味のあるAPIを呼び出してからSetThreadDpiAwarenessを再度呼び出して、スレッドのDPI認識をデフォルトのプロセス認識に戻すようにしてください。そうしないと、認識モードが後で別のものになる可能性があります。このAPIを呼び出す専用のスレッドがあります。 – peterfelts