2012-01-30 2 views
2

У меня этот код:Почему мой имитируемый щелчок мыши ничего не делает?

[DllImport("user32.dll")] 
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo); 

[Flags] 
public enum MouseEventFlags 
{ 
    Move = 0x0001, 
    LeftDown = 0x0002, 
    LeftUp = 0x0004, 
    RightDown = 0x0008, 
    RightUp = 0x0010, 
    MiddleDown = 0x0020, 
    MiddleUp = 0x0040, 
    Absolute = 0x8000 
} 

public void SimMouseEvent(MouseEventFlags e, int x, int y) 
{ 
    mouse_event((uint)e, (uint)x, (uint)y, 0, UIntPtr.Zero); 
} 

public void SimLeftClick(int x, int y) 
{ 
    SimMouseEvent(MouseEventFlags.LeftUp | MouseEventFlags.RightUp, x, y); 
} 

Моя форма выглядит следующим образом:

При нажатии кнопки "Button" она работает следующим образом:

private void button3_Click(object sender, RoutedEventArgs e) 
{ 
    SimLeftClick(50, 50); 
} 

И мое окно У меня также есть это:

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show("click"); 
} 

Когда я нажимаю на окно, он говорит «нажмите», как ожидалось, но когда я нажимаю «Button», он ничего не делает.

Являются ли координаты абсолютными или относительными? Как насчет нескольких мониторов? Они работают только с ориентированным приложением?

Я бы ожидал, что 50,50, чтобы либо попасть в мое окно, либо пропустить обработчик «щелчок», либо нажать на какое-то случайное окно, потому что оно полностью упустило мое приложение и сосредоточилось на этом ... почему ничего не происходит?

ответ

2

Вы обрабатываете сообщение с кнопкой мыши, но отправляете сообщение с кнопкой мыши. Щелчок должен быть нажат на кнопку, за которым следует одна и та же кнопка.

Координаты игнорируются, потому что вы не прошли мимо Move.

Попробуйте прочитать the documentation.

+0

Я смотрел на это, но не мог понять это. Я думаю, что у меня было это как LeftDown | LeftUp, но затем перепутал его где-то вдоль линии. Кажется, сейчас работает. Благодаря! – mpen

+0

Справедливости ради, документация ужасно ужасна; он не говорит, что требуется «MOUSEEVENTF_MOVE». –

+0

@Ian: «Если мышь перемещена, указанная« MOUSEEVENTF_MOVE »установлена, *' dx' * и * 'dy' * содержат информацию об этом движении." –

1

Исправлено, с предложениями Бена.

public void SimLeftClick(int x, int y) 
{ 
    var scr = Screen.PrimaryScreen.Bounds; 
    SimMouseEvent(MouseEventFlags.LeftDown | MouseEventFlags.LeftUp | MouseEventFlags.Move | MouseEventFlags.Absolute, 
     (int)(x/(double)scr.Width * 65535), 
     (int)(y/(double)scr.Height * 65535)); 
}