2016-09-24 144 views
-2

我有一個SetWindowsHookEx(WH_MOUSE_LL,,,)右擊鉤子的過程。我的過程在Window 10.0.10586上設置爲DPI系統,兩臺顯示器的縮放比例均爲150%。這是通過調用SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)來設置的。高DPI縮放,鼠標鉤子和WindowFromPoint

我的問題是例如Office 2007不知道DPI,因此讓我們將MS Word放在屏幕的右側四分之一處。右鍵單擊右下角任務欄上方的鼠標鉤子,發送1279,675的座標 - 縮放到Word。然後,我右擊Visual Studio(DPI認識),在屏幕上將近四分之三的時間,並且鼠標鉤向我發送例如來自Visual Studio的1279,1008。所以如果我點擊更高的屏幕我可能會得到相同的1279,675.

我的過程試圖通過調用WindowFromPoint API來確定哪個窗口在該點,但是在這種情況下,這顯然會失敗,因爲兩個應用程序「共享」同一點。

是否可以強制鼠標鉤始終發送原始物理座標而不是縮放到DPI不知道的應用程序?如果是這樣,怎麼樣?或者,是否有其他方式來確定鼠標鉤子的hWnd或processID?

回答

-1

由於該過程支持DPI,因此在鼠標鉤子回調處理程序中調用GetCursorPos()將始終獲取原始物理座標,而不是縮放到應用程序的邏輯座標。只需放棄傳遞給鼠標回調的座標。

新增30/09/2016

值得什麼,而GetMessagePos似乎有可能的,如果候選人的過程中沒有虛擬化的dpi它只返回正確的座標。

例如

VOID MessagePump() 
{ 
    MSG  messageGet = { 0 }; 
    DWORD dwPos; 
    POINTS p; 

    while (GetMessage(&messageGet,NULL,0,0)) 
    { 
     dwPos = GetMessagePos(); 
     p = MAKEPOINTS(dwPos); 
     TranslateMessage(&messageGet); 
     DispatchMessage(&messageGet); 
    } 
} 

老鼠回調處理程序獲取的GetMessage()調用期間調用,但是在DPI虛擬化是流程活躍,這並不正確獲取物理座標。例如物理x = 1909,y = 1072返回爲1091,612,具有175%的縮放比例,雖然算術上正確,但並非如此。

+0

聽起來像一個壞主意。當您調用GetCursorPos時,光標可能在其他地方。 –

+0

這是迄今爲止我能想到的最好的,似乎接近瞬間,但我願意接受任何更好的建議。 – birdwes

+1

[GetMessagePos](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644938.aspx)可能更適合。 – IInspectable