2011-01-17 11 views
3

私はサードパーティアプリケーションでクリックイベントを生成しようとしています。まず、電卓でクリックをシミュレートしようとしました。ここでは、コード」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); 

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

感謝それはハンドルを持つボタンで見つける。

+1

を使用はWM_CLICKことBM_CLICKないでしょうか? – Flipster

+0

私はあなたが簡単にそれをしたい場合は、あなたのコードに入れて名前と、さらに特定のハンドルを見つけるためにSpy + +を使用することができますしたい場合は、ウィンドウメッセージとして送信する必要があるようにフリップは正しいと思います。 –

+0

@FlipScript:彼らはどちらもうまくいくと思いますが、そうではありませんか? – Mehrdad

答えて

1

それは私が

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

public const uint BM_CLICK = 0x00F5; 

を交換したときに仕事を始めと

SendMessage(buttonHandle, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 
SendMessage(buttonHandle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); 
0

まず使用SPY ++。

いくつかのケースではボタンのように見えるコントロールは、グラフィックコントロールすることができます。 違いはグラフィックコントロールがハンドルを持っていませんが、 Windowsのコントロールはハンドルを持っています。 そのコントロールがある場合は、有効なHandle.Thenも

クリックメッセージを送信する(私はあなたがキャプションを使用して()は、GetWindowを使用する必要がありますしてもよいし、最初のパラメータを考える)親ウィンドウハンドルを与える

FindWindowEx

を使用しています。

1

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

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

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

+0

この使用法は正しいですか。私は最初の公開コンストラクトでこれを宣言しています。BM_CLICK = 0x00F5; – Nikil

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はそうあなたがshoud拳、画面のグローバル座標にカーソル位置を設定しますサードパーティのアプリケーションのウィンドウの所有権を取得します。

+0

ありがとうございますが、私はハンドルを取得しています。 – Nikil

関連する問題