none
Windows 8.1에서 SetCursorPos가 에러가 납니다. RRS feed

  • 질문

  • 다이렉트 X 프로그램을 짜고 있는데 SetCursorPos가 작동하지 않습니다.

    리턴값 0 이고 라스트 에러값은 설정되지 않습니다. 이 상태로 커서가 움직여지지않고 돌아옵니다.

    kb2908279와는 다른 문제로 보이며 적용시켜보았지만 정상적으로 작동되지 않았습니다.

    소스코드입니다.

      POINT pt;
    float fDelta = 0.001f; // 마우스의 민감도, 이 값이 커질수록 많이 움직인다.

    GetCursorPos( &pt );
    int dx = pt.x - g_dwMouseX; // 마우스의 변화값
    int dy = pt.y - g_dwMouseY; // 마우스의 변화값

    g_pCamera->RotateLocalX( dy * fDelta ); // 마우스의 Y축 회전값은 3D world의  X축 회전값
    g_pCamera->RotateLocalY( dx * fDelta ); // 마우스의 X축 회전값은 3D world의  Y축 회전값
    D3DXMATRIXA16* pmatView = g_pCamera->GetViewMatrix(); // 카메라 행렬을 얻는다.
    g_pd3dDevice->SetTransform( D3DTS_VIEW, pmatView ); // 카메라 행렬 셋팅

    RECT rc;
    GetClientRect( g_hwnd, &rc );
    pt.x = (rc.right - rc.left) / 2;
    pt.y = (rc.bottom - rc.top) / 2;
    ClientToScreen( g_hwnd, &pt );
    SetLastError(2311);
    int iRet = SetCursorPos(pt.x, pt.y);

    if (!iRet)
    {
    g_pLog->Log("SETPOSERROR :%d %d,, %d %d", iRet,GetLastError(),pt.x,pt.y);
    }
    g_dwMouseX = pt.x;
    g_dwMouseY = pt.y;

    커서가 클라이언트의 가운데로 가야 합니다만 가지않고 실패만합니다.

    인자값은 모두 정상입니다..

    도움을 요청합니다.. 도와주세요...

    제가 만든건 물론이고 Harf:LIFE이나 Call of Duty  시리즈 와같은 게임에도 위와 같은 문제가 보이며

    커서가 가운데로 가지지않기때문에 로직상으로 버그가 일어나며

    계속해서 회전하는 버그가 생깁니다 ..

    강제로 외부에서 커서를 잡아줄경우 될 것 같이 보이다가 게임 윈도우 창이 활성화 될 경우 모든 창에서 호출되는 SetcursorPos는 실패합니다. 

    SendInput 또한 마찬가지이며 SendInput을 지속적으로 호출할 경우 화면이 검은 화면으로 페이드인 이펙트가 나옵니다 ...

    http://donewmouseaccel.blogspot.kr/2010/03/markc-windows-7-mouse-acceleration-fix.html

    검색하여서 위와같은 패치를 찾아보았으나 역시나 되지않았고, 또한 된다하더라도 게임을 배포할때 전부 이패치가 먹혀있어야한다는 전제조건도 이상합니다..





    • 편집됨 430vain 2014년 3월 29일 토요일 오전 11:57
    2014년 3월 29일 토요일 오전 11:38

답변

  • SetCursorPos에 넘겨주는 파라미터 값들은 정상인지요?

    윈도우8.1에서 혹시 SetCursurPos API에 변경이 있었는지 찾아보았는데, 8.1에서도 문제없이 잘 동작한다는 글만을 확인하였습니다.

    http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/127fb692-b37b-4a80-b8e1-0a60173915cd/setcursorpos-and-related-mouse-position-setting-calls-not-working-in-win81

    I just ran a quick test app on Windows 8.1 (RTM) which set a timer to call SetCursorPos(100,100) ever second and it worked as expected: the cursor warped to 100,100 every time the timer triggers.

    2014년 4월 1일 화요일 오후 2:28