C#を使用して、サードパーティのアプリケーションのボタンのハンドルを取得するにはどうすればよいですか?
質問
サードパーティのアプリケーションでクリックイベントを生成しようとしています。スタートとして、私は電卓のクリックをシミュレートしようとしました。これがコードです」
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);
しかし、このコードを使用して、ボタンのハンドルを取得していません。誰かが助けてくれませんか。サードパーティのアプリケーションをクリックするボタンをシミュレートする他の方法はありますか?
ありがとう。
解決 2
交換すると機能し始めました
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);
他のヒント
一般的なアプローチは正しいですが、コードには2つの潜在的な問題があります。
FindWindowEx
指定されたウィンドウの直接の子供のみを見つけます。電卓ボタンは、メインウィンドウの子供であるコンテナウィンドウに配置されている可能性があるため、ボタンはメインウィンドウの直接の子ではありません。のドキュメント
BM_CLICK
マウスを下に送信してメッセージを送信してクリックをシミュレートするため、このメッセージを送信する前に親ウィンドウをアクティブにする必要がある場合があります。
最初にSpy ++を使用して、それがハンドルを持つボタンであることを見つけます。
場合によっては、ボタンのように見えるコントロールがグラフィックコントロールになる可能性があります。違いは、グラフィックコントロールにはハンドルがないことですが、Windowsコントロールには処理があります。そのコントロールに有効なハンドルがある場合
また、親のウィンドウハンドルを与えます(最初のパラメーターは、キャプションを使用してgetWindow()を使用する必要があるかもしれません)
次に、クリックメッセージを送信します。
ボタンのハンドルがない場合は、座標をクリックするマウスをエミュレートできます。
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は、画面のグローバル座標にカーソル位置を設定するため、拳はサードパーティのアプリケーションのウィンドウの所有を取得します。