2009-04-08 3 views
2

나는 윈도우 마우스 움직임 이벤트를 잡아 내고 상대적인 마우스 움직임을 계산하여 다른 PC로 전송합니다. 지금까지 그렇게 잘 작동합니다.상대방 마우스 움직임을 다른 PC로 보내는 방법

그러나 마우스 좌표 (클라이언트)를 보내는 화면에서 마우스 움직임을 차단하거나 화면의 한쪽면에 도달하면 Windows API에 의해 두 번째 마우스 이벤트가 발생하여 마우스를 다시 스냅합니다.

내 첫 번째 생각은 상대적인 움직임을 기록하고 모든 "거꾸로 된"움직임을 무시하는 것입니다. 그러나 나는 더 나은 방법을 찾고 있습니다.

먼저 내가 전화 :

Cursor.Position = new Point(0, 0); 

    void HookManager_MouseMoveExt(object sender, MouseEventExtArgs e) 
    { 
     Logger.Log(String.Format("Pos: {0} {1} Delta: {2} {3}", e.X, e.Y, e.DeltaX, e.DeltaY), LogLevel.Info); 

     if (hasControl) 
      server.MouseMove(e.DeltaX, e.DeltaY, true); // send the coordinates to the client 

     e.Handled = true; // Don't move the mouse 
    } 

지금 내가 응용 프로그램을 시작하고 왼쪽 방향으로 마우스를 이동합니다. 난 단지 부정적인 델타를 수신 할,하지만이 발생합니다

09.04.2009 00:29:31 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: 0 0 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:31 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:31 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: -1 0 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: 0 0 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: -1 -1 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -2 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 1 0 // Here it starts to snap back first time 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -2 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -2 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -2 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 -2 Delta: 1 0 
09.04.2009 00:29:31 <10> Pos: -3 -1 Delta: 0 1 
09.04.2009 00:29:31 <10> Pos: -2 -2 Delta: 1 0 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: 1 1 
09.04.2009 00:29:31 <10> Pos: -3 -1 Delta: 0 0 
09.04.2009 00:29:31 <10> Pos: -1 0 Delta: 2 0 
09.04.2009 00:29:31 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:31 <10> Pos: -1 -1 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: 0 0 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: -1 -1 Delta: -1 -1 
09.04.2009 00:29:32 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:32 <10> Pos: -1 -1 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: -1 -1 Delta: 0 -1 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: 0 0 
09.04.2009 00:29:32 <10> Pos: -2 -2 Delta: 0 -2 
09.04.2009 00:29:32 <10> Pos: 0 0 Delta: 2 2 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: 0 -1 Delta: 0 -1 
09.04.2009 00:29:32 <10> Pos: -1 0 Delta: -1 0 
09.04.2009 00:29:32 <10> Pos: -1 -1 Delta: 0 -1 
09.04.2009 00:29:33 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:36 <10> Pos: -1 -1 Delta: 0 0 
09.04.2009 00:29:36 <10> Pos: -2 -2 Delta: 0 0 
09.04.2009 00:29:36 <10> Pos: -5 -5 Delta: -3 -3 
09.04.2009 00:29:36 <10> Pos: -5 -4 Delta: 0 1 
09.04.2009 00:29:36 <10> Pos: -6 -6 Delta: -1 -2 
09.04.2009 00:29:36 <10> Pos: -8 -7 Delta: -2 -1 
09.04.2009 00:29:36 <10> Pos: -8 -7 Delta: 0 0 
09.04.2009 00:29:36 <10> Pos: -14 -11 Delta: -6 -4 
09.04.2009 00:29:36 <10> Pos: -20 -17 Delta: -6 -6 
09.04.2009 00:29:36 <10> Pos: -26 -25 Delta: -6 -8 
09.04.2009 00:29:36 <10> Pos: -33 -25 Delta: -7 0 
09.04.2009 00:29:36 <10> Pos: -36 -31 Delta: -3 -6 
09.04.2009 00:29:36 <10> Pos: -39 -31 Delta: -3 0 
09.04.2009 00:29:36 <10> Pos: -38 -29 Delta: 1 2 
09.04.2009 00:29:36 <10> Pos: -38 -24 Delta: 0 5 
09.04.2009 00:29:36 <10> Pos: -33 -24 Delta: 5 0 
09.04.2009 00:29:36 <10> Pos: -28 -21 Delta: 5 3 
09.04.2009 00:29:36 <10> Pos: -27 -18 Delta: 1 3 
09.04.2009 00:29:36 <10> Pos: -22 -16 Delta: 5 2 
09.04.2009 00:29:36 <10> Pos: -19 -12 Delta: 3 4 
09.04.2009 00:29:36 <10> Pos: -16 -11 Delta: 3 1 
09.04.2009 00:29:36 <10> Pos: -14 -8 Delta: 2 3 
09.04.2009 00:29:36 <10> Pos: -11 -8 Delta: 3 0 
09.04.2009 00:29:36 <10> Pos: -8 -5 Delta: 3 3 
09.04.2009 00:29:36 <10> Pos: -8 -5 Delta: 0 0 
09.04.2009 00:29:36 <10> Pos: -4 -2 Delta: 4 3 
09.04.2009 00:29:36 <10> Pos: -3 -3 Delta: 1 -1 
09.04.2009 00:29:36 <10> Pos: -1 0 Delta: 2 3 

답변

0

상자 방법을 기반으로 솔루션을 얻었습니다. MouseSimulator.Position은 수행

 Cursor.Position = new Point(value, Y); 

HookManager_MouseMoveExt 내 콜백입니다. MouseEventExtArgs는 확장 된 MouseEventArgs이며 델타와 같은 기능이 추가되었습니다.

 private bool ignoreNext = false; 
     void HookManager_MouseMoveExt(object sender, MouseEventExtArgs e) 
     { 
      // Should we block all mouse interactions? 
      if (Block) { 
       e.Handled = true; 
       return; 
      } 

      // Return if we should ignore the nex, because we made a big jump 
      if (ignoreNext) { 
       ignoreNext = false; 
       return; 
      } 

      if (hasControl) 
      { 
       // Lock the mouse to 100,100 : 200,200 and flip back to 150,150 if out of bounds 
       if (e.X < 100 || e.X > 200 || e.Y < 100 || e.Y > 200) // Box leaved 
       { 
        // If we leave the box, we set the position to the center 
        // and set the event to handled otherwise the mouse is free 
        MouseSimulator.Position = new System.Drawing.Point(150, 150); 
        e.Handled = true; 
        ignoreNext = true; 
       } 

       // We moved fine, send the delta to the server 
       // The MouseSimulator.Position change will not be visible yet. 
       server.MouseMove(e.DeltaX, e.DeltaY, true); 

      } 

      Logger.Log(String.Format("Pos: {0} {1} Delta: {2} {3}", e.X, e.Y, e.DeltaX, e.DeltaY), LogLevel.Info); 
     } 
1

난 당신이 뭘 하려는지의 세부 모르겠지만, 왜 화면의 작은 부분에 커서를 클리핑하지 그것을 보이지 않게합니다. 그런 다음 이동을 감지 할 때마다 클라이언트의 커서를 잘린 상자의 가운데로 다시 이동하십시오. 따라서 매번 동일한 화면상의 포인트에서 상대적인 움직임을 계산할 수 있습니다.

이것은 PC 에뮬레이터가하는 Bochs의 기능입니다 (거의 - 커서를 창에 집어 넣지 않습니다).

2

실제로 질문에 답변 할 수는 없지만 오픈 소스 프로그램 Synergy을 알고 있습니까?

당신이하려는 일을합니다. 아마 당신은 힌트를 얻기 위해 소스를 들여다 볼 수 있습니다.

+0

나는 이미 코드를 살펴 봤지만,별로 잘 알지 못한다. 나는 그들이 마우스 움직임을 추적하고 잘못된 움직임을 무시하기 위해 타이머를 사용한다는 것을 알았다. 그러나 그것은 복잡해 보입니다. 더 쉬운 방법이 있기를 바랍니다. – Tarion