2013-03-25 2 views
7

Я использую эту функцию для перемещения курсора.C# надежный MouseMove (hop)

[DllImport("user32.dll")] 
static extern bool SetCursorPos(int X, int Y); 

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

Однако мне нужно вызвать SetCursorPos во время события MouseMove. Если пользователь перемещает мышь в определенную область, я хочу, чтобы она прыгала в другое место и продолжала оттуда. Но сейчас он прыгает к месту назначения, а затем сразу возвращается назад (90% времени). Как я могу избежать такого поведения?

Редактировать: Я решил обойти это, отсекнув курсор в квадрате 1 на 1 пиксель за одно событие mousemove. Cursor.Clip (MousePosition, новый прямоугольник (1, 1));

+4

Пожалуйста, разместите свой код обработчика событий MouseMove. –

+0

Я буквально просто называю эту функцию и ничего больше в событии MouseMove. – user1340531

+0

@ user1340531: Опубликовать его в любом случае? – mpen

ответ

1

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

Например, здесь я добавил зеленую панель 200x200 в позиции 0, 0 в верхнем левом углу. Если мышь перемещается по панели, событие формы MouseMove перестанет захватывать позицию курсора мыши. В событии mouse_move моей формы я установил текст формы для отображения координат мыши. Обратите внимание, что координаты в тексте окна по-прежнему 200, 200, когда мышь фактически находилась в 0, 0 (не вижу мой курсор из-за необходимости щелкнуть SnippingTool.exe, чтобы получить снимок экрана).

enter image description here

Чтобы исправить это, используйте один и тот же код помещается в MouseMove случае вашей формы в MouseMove случае панели (или какой бы ни управления вы используете). Это приводит к правильным координатам в тексте формы.

enter image description here

А вот код (это может, очевидно, быть переработана в единый метод):

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool SetCursorPos(int X, int Y); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 
} 
+0

Событие MouseMove на самом деле глобально, оно срабатывает независимо от того, что я вишу, пока курсор перемещается. – user1340531

+2

@ user1340531 Как заявили другие комментаторы, вам необходимо добавить этот код к вашему вопросу. – Inisheer

+1

Главным образом, потому что нет такой вещи, как «глобальное» событие MouseMove, если только вы не установили глобальный крючок. –

0

Трудно сказать, с такой небольшой информации (возможно, скриншот вашего GUI поможет) , Вы можете попробовать:

private void Button_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     SetCursorPos(0, 0); 
     e.Handled = true; 
    }