在 C 應用程式上作業,嘗試將滑鼠從坐標映射到全屏視窗。
獲取滑鼠坐標GetPhysicalCursorPos(&mouse_point);,回傳相對于原點 0,0 的坐標。這會導致問題,因為滑鼠正在“超出”監視器的范圍,因為視窗正在縮小它們的大小。例如,它在右下角時回傳 {3839, 1079},但 Windows 將總桌面大小計算為 3200x1080。(這個例子是兩個 1080p 顯示幕,并排,左邊有 100% 縮放,右邊有 150% 縮放)
使用以下命令檢索虛擬桌面大小:
unsigned int vScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
unsigned int vScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
但這會回傳一個桌面,其中 DPI 較高的顯示幕較小,因此對于 3840x1080 的雙 1080p 顯示幕配置,它回傳 3200x1080(上述配置)。
我嘗試使用GetSystemMetricsForDpi96 DPI (100%) 但它回傳與上面相同:
unsigned int vScreenWidth = GetSystemMetricsForDpi(SM_CXVIRTUALSCREEN, 96 /* 100% scaling*/);
unsigned int vScreenHeight = GetSystemMetricsForDpi(SM_CYVIRTUALSCREEN, 96 /* 100% scaling*/);
盡管明確告訴它強制使用 100% 縮放,但在上面的混合縮放示例中,上面也回傳 3200x1080。
有沒有其他方法可以獲得未縮放的虛擬桌面大小?
請注意,該應用程式不支持 DPI。
uj5u.com熱心網友回復:
感謝@RaymondChen,我能夠通過SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);在GetSystemMetricsForDpi.
它現在回傳完整的虛擬桌面大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/474448.html
下一篇:使用Mutablelivedata從DialogFragmentColorPicker更改片段的背景顏色不起作用
