2017-11-16 30 views
0

나는 컴파일러에게 ++C++ WINAPI SendInput을 예기치 않은 동작이

#include<iostream> 
#include<Windows.h> 

using namespace std; 

int main() { 
    SetProcessDPIAware(); 

    POINT p; 
    GetCursorPos(&p); 
    cout << p.x << " " << p.y << endl; 

    int screenWidth = GetSystemMetrics(SM_CXSCREEN); 
    int screenHeight = GetSystemMetrics(SM_CYSCREEN); 

    INPUT in; 
    in.type = INPUT_MOUSE; 
    in.mi = { 
     screenWidth/2, 
     screenHeight/2, 
     0, 
     MOUSEEVENTF_MOVE, 
     0, 
     NULL 
    }; 

    SendInput(1, &in, sizeof(in)); 

    GetCursorPos(&p); 
    cout << p.x << " " << p.y << endl; 

    return 0; 
} 

내 화면을 비주얼 C를 사용하여 컴파일 된 다음 코드는 1920 × 1080입니다했다. doc에서 상대적인 움직임 (이 경우 나는)을 사용하면 dx와 dy가 픽셀의 차이가되어야합니다.

이 코드를 실행하면 내 디스플레이의 왼쪽 상단 모서리에 커서를 놓았지만 센터에서 끝나기를 기대했지만 결국 (1243, 699) . 이유를 알아낼 수 없었습니다.

2 COUT의 정확한 독서는

0 0 
1243 699 
+0

DPI 가상화의 두 번째 매개 변수 배열 –

+0

@DavidHeffernan 당신이에 정교한 수 이유는 ... 제발 획득하고 SystemParametersInfo 기능이 값을 설정 ? 저는 진짜 초보자이며 DPI 가상화가 마우스 이벤트에 미치는 영향에 대한 문서를 찾을 수 없었습니다. –

+0

960과 540을 하드 코딩하지 마십시오. 화면의 크기를 얻으려면 GetSystemMetrics()를 호출하고 가운데를 마우스로 가져 오려면 2로 나눕니다. 이제는 화면의 크기와 DPI 가상화가 켜져 있는지 여부에 관계없이 모든 컴퓨터에서 작동하는 dpiAware 코드를 작성했습니다. –

답변

0

사용 MOUSEEVENTF_ABSOLUTE 플래그하고 마우스 좌표를 설정하는 마우스 좌표 (0xFFFF0)에 포인트를 변환합니다. 그렇지 않으면 x/y 좌표는 상대 위치로 간주됩니다. MOUSEEVENTF_ABSOLUTE 값이 지정되면 mouse_event

는 DX 및 DY는 065,535 사이 정규화 절대 좌표를 포함한다. 이벤트 절차는 이러한 좌표를 디스플레이 표면에 매핑합니다. 좌표 ( 0, 0)은 디스플레이 화면의 왼쪽 상단 모서리에 매핑되며 ( 65535, 65535)은 오른쪽 하단 모서리에 매핑됩니다. MOUSEEVENTF_ABSOLUTE 값이 지정되지 않으면

, dxdy 마지막 마우스 이벤트가 발생하고 나서 상대 운동을 지정합니다 ( 은 최종 위치보고). 양수 값은 마우스가 오른쪽으로 이동되었음을 의미합니다. (또는 아래로); 음수 값은 마우스가 왼쪽 (또는 위로)으로 이동했음을 의미합니다.

상대적 마우스 동작은 마우스 속도 및 가속 수준에 대한 설정이 적용됩니다. 일반 사용자는 제어판의 마우스 응용 프로그램을 사용하여이 값을 설정합니다. 응용 프로그램은

사용 SendInput

int main() 
{ 
    SetProcessDPIAware(); 

    POINT p; 
    GetCursorPos(&p); 
    cout << p.x << " " << p.y << endl; 

    int screenWidth = GetSystemMetrics(SM_CXSCREEN); 
    int screenHeight = GetSystemMetrics(SM_CYSCREEN); 
    cout << screenWidth << " " << screenHeight << endl; 

    p.x = screenWidth/2; 
    p.y = screenHeight/2; 

    INPUT in[1] = { 0 }; 
    in[0].type = INPUT_MOUSE; 
    in[0].mi.dx = (p.x * 0xFFFF)/(GetSystemMetrics(SM_CXSCREEN) - 1); 
    in[0].mi.dy = (p.y * 0xFFFF)/(GetSystemMetrics(SM_CYSCREEN) - 1); 
    in[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; 

    SendInput(1, in, sizeof(INPUT)); 

    GetCursorPos(&p); 
    cout << p.x << " " << p.y << endl; 

    return 0; 
} 
+0

예, 절대 플래그를 사용하면 확실히 예상 결과를 제공합니다. 그러나 상대 마우스 움직임이 의도 한대로 작동하지 않는 이유가 있습니까? –

+0

* 센터에서 끝나기를 기대했습니다. * 문서를 이해하지 못하거나 "상대적인"및 "상대적인 동작"의 의미를 이해하지 못합니다. 'screenWidth/2'는 초기 위치가 0, 0이 아닌 한, 상대 모션의 중심에서 끝나지 않을 것입니다. 정확한 화면 좌표를 사용한다는 것이 코드에서 분명하게 나타납니다. –

+0

내 출력에서 ​​알 수 있습니다. 내 커서가 SendInput 전에 0,0에 있음 –