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が私のウィンドウをどこかでヒットして「クリック」ハンドラーをトリップするか、ランダムなウィンドウをクリックすることを期待します。これは、アプリが完全に欠落していて、代わりにフォーカスするためです...なぜ何も起こらないのですか?

4

2 に答える 2

2

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

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

ドキュメントを読んでみてください。

于 2012-01-30T00:36:02.580 に答える
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));
}
于 2012-01-30T00:59:02.693 に答える