3

サードパーティのアプリケーションでクリックイベントを生成しようとしています。まず、電卓でクリックをシミュレートしてみました。これがコードです」

IntPtr hwnd = IntPtr.Zero;
IntPtr hwndChild = IntPtr.Zero;
//Get a handle for the Calculator Application main window
hwnd = FindWindow(null, "Calculator");

hwndChild = FindWindowEx(hwnd, IntPtr.Zero, "Button", "1");

//send BN_CLICKED message
SendMessage(hwndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero);

しかし、このコードを使用すると、ボタンのハンドルが取得されません。誰か助けてくれませんか。サードパーティアプリケーションのボタンクリックをシミュレートする他の方法はありますか?

ありがとう。

4

4 に答える 4

1

一般的なアプローチは正しいですが、コードには2つの潜在的な問題があります。

  1. FindWindowEx指定されたウィンドウの直接の子のみを検索します。電卓のボタンがメインウィンドウの子であるコンテナウィンドウに配置されている可能性があるため、ボタンはメインウィンドウの直接の子ではありません。

  2. のドキュメントにBM_CLICKは、マウスの上下のメッセージを送信することでクリックをシミュレートするため、このメッセージを送信する前に親ウィンドウをアクティブ化する必要がある場合があると記載されています。

于 2011-01-17T16:37:28.673 に答える
1

交換すると動き始めました

public const uint BM_CLICK = 0x00F5;

public const uint WM_LBUTTONDOWN = 0x0201; 
public const uint WM_LBUTTONUP = 0x0202;

使用済み

SendMessage(buttonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 
SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
于 2011-01-17T18:20:20.340 に答える
0

最初にSPY++を使用して、それがハンドル付きのボタンであることを確認します。

場合によっては、ボタンのように見えるコントロールをグラフィックコントロールにすることができます。違いは、グラフィックコントロールにはハンドルがありませんが、Windowsコントロールにはハンドルがあります。そのコントロールに有効なハンドルがある場合は、FindWindowExを使用します

また、親ウィンドウのハンドルを指定します(最初のパラメーターは、キャプションを使用してGetWindow()を使用する必要があるかもしれません)

次に、クリックメッセージを送信します。

于 2011-01-17T16:33:38.623 に答える
0

ボタンのハンドルがない場合は、座標をクリックしてマウスをエミュレートできます。

class User32
 { 
    [Flags]
    public enum MouseEventFlags
    {
        LEFTDOWN = 0x00000002,
        LEFTUP = 0x00000004,
        MIDDLEDOWN = 0x00000020,
        MIDDLEUP = 0x00000040,
        MOVE = 0x00000001,
        ABSOLUTE = 0x00008000,
        RIGHTDOWN = 0x00000008,
        RIGHTUP = 0x00000010
    }

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

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

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

class Program
{
     static void Main()
     {
         User32.SetCursorPos(25, 153);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTDOWN, 25, 153, 0, 0);
         User32.mouse_event((uint)User32.MouseEventFlags.LEFTUP, 25, 153, 0, 0);
     }
}

ただし、関数SetCursorPosは、画面のグローバル座標でカーソル位置を設定するため、最初にサードパーティアプリケーションのウィンドウの位置を取得する必要があります。

于 2011-01-17T17:04:33.997 に答える