2016-09-24 7 views
-2

SetWindowsHookEx (WH_MOUSE_LL,,,) 오른쪽 클릭 훅을 설정하는 프로세스가 있습니다. 내 프로세스는 양쪽 모니터에서 150 % 확장시 Window 10.0.10586에서 DPI 시스템이 인식하도록 설정됩니다. 이것은 SetProcessDpiAwareness (PROCESS_SYSTEM_DPI_AWARE)를 호출하여 설정됩니다.높은 DPI 스케일링, 마우스 훅 및 WindowFromPoint

내 문제 시나리오는 다음과 같습니다. Office 2007은 DPI를 인식하지 못하므로 MS Word를 화면의 오른쪽 분기에 배치합시다. 오른쪽 하단의 작업 표시 줄 바로 위에서 마우스 오른쪽 버튼을 클릭하면 마우스 훅이 Word로 축소 된 1279, 675의 좌표를 보냅니다. 그런 다음 비주얼 스튜디오 (DPI 인식)를 마우스 오른쪽 버튼으로 클릭하면 화면이 거의 3/4 지점에 위치합니다. 1279, 1008 Visual Studio에서. 따라서 화면 위쪽을 클릭하면 잠재적으로 동일한 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