4

シミュレートされたマウスクリックを別のアプリケーションに送信しようとしています。キークリックを実際に送信する方法を理解していますが、これは問題ではありません。他のアプリケーションの中心にマウスクリックを送信する必要があります。一度テストして座標を見つけ、クリックをそのXY位置に送信するだけで済みますが、問題があります...ウィンドウを移動したり、このウィンドウのサイズを変更したりすると、XY座標は明らかに同じになりません。

したがって、ウィンドウのサイズとその位置を取得する方法を見つけて、そこから中心点を見つける必要があります。誰もがこれを行う方法を知っていますか?ご返信ありがとうございます!

これがマウスクリックを送信するための私のコードです

public void SendLeftClick(int x, int y)
{
    int old_x, old_y;
    old_x = Cursor.Position.X;
    old_y = Cursor.Position.Y;

    SetCursorPos(x, y);
    mouse_event(MouseEventFlag.LeftDown, x, y, 0, UIntPtr.Zero);
    mouse_event(MouseEventFlag.LeftUp, x, y, 0, UIntPtr.Zero);
    SetCursorPos(old_x, old_y);
}
4

2 に答える 2

1

GetWindowInfoAPIを使用できます。

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

    [StructLayout(LayoutKind.Sequential)]
    struct WINDOWINFO
    {
        public uint cbSize;
        public RECT rcWindow;
        public RECT rcClient;
        public uint dwStyle;
        public uint dwExStyle;
        public uint dwWindowStatus;
        public uint cxWindowBorders;
        public uint cyWindowBorders;
        public ushort atomWindowType;
        public ushort wCreatorVersion;

        public WINDOWINFO(Boolean? filler)
            : this()   // Allows automatic initialization of "cbSize" with "new WINDOWINFO(null/true/false)".
        {
            cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO)));
        }

    }
    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    {
        public int left, top, right, bottom;
    }


    private void button1_Click_1(object sender, EventArgs e)
    {
        var p = System.Diagnostics.Process.GetProcessesByName("mspaint");

        if (p.Length == 0) return;

        WINDOWINFO wi = new WINDOWINFO(false);
        GetWindowInfo(p[0].MainWindowHandle, ref wi);

        SendLeftClick((wi.rcWindow.left + wi.rcWindow.right) / 2, (wi.rcWindow.top + wi.rcWindow.bottom) / 2);
    }
于 2012-05-25T01:39:33.983 に答える
0

mouse_eventルーチンでカーソル位置を設定し、0,0をXおよびYとして設定します。

SetCursorPos(x, y);
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);

今私のためにうまく働いています。

于 2014-04-15T14:26:21.923 に答える