2012-12-28 3 views
5

저는 마우스가 전체 화면으로 갈 수있는 경계를 수정하는 작은 유틸리티를 작성하려고했습니다. 나는 here (버전 1을 사용하고있다)을 발견 한 글로벌 마우스 훅 라이브러리를 사용하고, 마우스 기능을 내 자신의 함수에 생성하는 이벤트에서 마우스 위치 정보를 전달한다. . 그것을 실행하는 경우마우스 위치가 작동하지 않습니다. C#

internal void ProcessMouseEvent(System.Drawing.Point point) 
{ 
    Cursor.Position = new Point(50,50); 
} 

는, 마우스가 지정된 점에 플래시 나타나지 않지만, 즉시 다시는 이동 이벤트 인 경우는 변경 전에 어디로 되돌아갑니다. 클릭 이벤트를 통해 완료된 경우에만 실제로 새 위치에 유지됩니다.

답변

3

마우스를 효율적으로 사용할 수있는 곳을 제한하려면 cursor.clip을 사용해야합니다. 해당 설명서 here을 찾을 수 있습니다. 그것은 당신이 훨씬 더 쉽게 원하는 것을 할 것이고 추천 된 방법입니다.

+0

내 경계가 직사각형이 아닌 경우 어떻게해야합니까? – littlerat

+0

@littlerat 귀하의 질문에 서클에 대해 언급하지 않았습니다. cursor.clip과 함께 사각형을 사용해야합니다. 죄송합니다! – FrostyFire

+0

글쎄 그건 원형도 아니야. 내가하려는 일은 [this] (http://i.imgur.com/6hpmb.jpg)를 [this] (http://i.imgur.com/KhWb0.jpg)로 바꾸는 것입니다. 화면 해상도. – littlerat

3

여기에서 문제는 마우스 메시지의 알림을 제공한다는 것입니다. 그러나 실제로 알림을 처리 할 응용 프로그램에 의해 처리되는 것을 방지하지는 않습니다. 따라서 정상적으로 처리되고 마우스는 원하는 곳으로 이동합니다. 당신이해야 할 일은 실제로 메시지가 전달되는 것을 차단하는 것입니다. 이것은 훅 콜백에서 0이 아닌 값을 반환해야합니다.

라이브러리는 후크 콜백 리턴 값으로 조작 할 수 없으며 수술이 필요합니다. 버기가주의하십시오. 대신 this sample code을 사용하겠습니다. 이 샘플 콜백 메소드를 사용하면 :

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { 
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { 
     System.Windows.Forms.Cursor.Position = new Point(50, 50); 
     return (IntPtr)1; // Stop further processing! 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

그러면 이제 단단히 고착됩니다. Alt + Tab, Alt + D, E를 사용하여 제어권을 다시 얻으십시오.

+0

훌륭한 대답은 내가 한 일은 커서 위치를 설정 한 직후에'return new IntPtr (1)'을 한 번만 추가하면 그 위치에 남아 있고 이후의 이벤트에서 사용자가 마우스를 움직일 수 있도록 허용하는 것입니다. –

관련 문제