2012-01-30 4 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); 
} 

私のフォームは次のようになります。あなたが "ボタン" をクリックすると、それは、この実行さ

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

と上を私の窓私もこれを持っています:

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

ウィンドウをクリックすると、「クリック」したように見えますが、「ボタン」をクリックすると何もしないように見えます。

座標は絶対座標ですか、相対座標ですか?複数のモニターはどうですか?フォーカスされたアプリケーションでのみ動作しますか?

私のアプリを完全に見逃してしまったため、「クリック」ハンドラを動かすか、ランダムなウィンドウをクリックすると、50,50のウィンドウが表示されてしまいます。

答えて

2

マウスボタンを押しながらメッセージを処理しますが、マウスボタンを押してメッセージを送信します。クリックは、ボタンを押した後、同じボタンを上にする必要があります。

Moveフラグを渡さなかったため、座標は無視されます。

the documentationをお試しください。

+0

私はそれを見ましたが、それを理解できませんでした。私はLeftDown | LeftUpとしてそれを持っていたと思っていますが、それからそのラインに沿ってどこかでそれを混乱させました。今働こうとしているようだ。ありがとう! – mpen

+0

公正であるためには、ドキュメントは恐ろしくひどいです。 'MOUSEEVENTF_MOVE'が必要であるとは言いません。 –

+0

@Ian: "MOUSEEVENTF_MOVE"が設定されていると、マウスが動いた場合、* dx' *と* 'dy' *はその動きに関する情報を保持します。 –

1

Ben氏の提案で修正されました。

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)); 
} 
関連する問題