2009-04-08 3 views
2

Я улавливаю события движения мыши 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

Я не уверен, что специфика того, что вы пытаетесь сделать, но почему бы не попробовать отсечения курсора на небольшую часть экрана и сделать его невидимым. Затем каждый раз, когда вы обнаруживаете движение, переместите курсор клиента обратно в центр этого отсеченного блока. Таким образом, вы каждый раз рассчитываете относительное движение с одной и той же экранной точки.

Это то, что делает Bochs, эмулятор ПК (почти - он не закрепил курсор к окну).

2

Я не могу ответить на ваш вопрос, но знаете ли вы о программе с открытым исходным кодом Synergy?

Он делает то, что вы пытаетесь сделать - возможно, вы могли бы заглянуть в источник за подсказками.

+0

Я уже смотрел их код, но я не очень-то знаком с ним, не вижу многого. Я узнал, что они отслеживают движение мыши и используют таймер, чтобы игнорировать неправильное движение. Но это выглядит сложным. Надеюсь, есть более простой способ – Tarion

Смежные вопросы