2013-07-19 26 views
5

私は、複数のウィンドウクライアントを開き、それぞれのプロセス内でマウスクリックをシミュレートするプロジェクトがあります。 Win32 APIとSendMessageを使用して複数のインスタンスのメモ帳にメッセージを正常に送信できました。次のように私のために動作するコードは次のとおりです。Web Automation Mouse Clicking

Process[] notepads = Process.GetProcessesByName("notepad"); 
      foreach (Process proc in notepads) 
      { 
        IntPtr handle = proc.Handle; 
        IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null); 
        if (child != null) 
        { 
         MessageBox.Show("Child was found, sending text"); 
         SendMessage(child, 0x000C, 0, "test"); 
        } 
       } 
      } 

これは、私がどんなに多く、メモ帳で開かれていないすべてのインスタンスに「テスト」を送信します。あなたが見ることができるように、私はプロセスのすべてのインスタンスを繰り返し、単純にメッセージをループしています。最終的な目標は、Microsoft拡張Awesomiumむしろ、メモ帳ではありません、すべての...

で難しいことではありませんでした。私はウィンドウハンドル、次にChrome_RenderWidgetHostHWNDの子(Awesomium)クラス名を取得しました。そこから、SendMessageの変数型をリファクタリングしてマウスイベントを送信して、システムで読み取り可能なlParamをアセンブルしました。ここではそのコードは次のとおりです。

私はこれを経由してのlParamを組み立てたいくつかの例を使用して
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
     static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 

int x = 834; 
int y = 493; 
IntPtr lParam = (IntPtr)((y << 16) | x); 
IntPtr wParam = IntPtr.Zero; 

私はすべての子ウィンドウでプレスイベントを検出するために、グローバル・マウスフックを使用して、そしてときに私のです私のボタンを押してプロセスを繰り返してクリックすると、何も送られません。私はマウスのクリックが送信されない原因となっている何かばかげたことをやっていることを知っています。いずれにせよ、ここには私が持っている最終的なコード構造があります。アドバイスやヒントをいただければ幸いです。ありがとう。

private void button2_Click(object sender, EventArgs e) 
    { 
     Process[] notepads = Process.GetProcessesByName("client"); 
     foreach (Process proc in notepads) 
     { 
       IntPtr handle = proc.Handle; 
       string mine = Convert.ToString(proc); 
       MessageBox.Show(mine); 
       IntPtr child = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Chrome_RenderWidgetHostHWND", null); 
       if (child != null) 
       { 
       int x = 834; 
       int y = 493; 
       IntPtr lParam = (IntPtr)((y << 16) | x); 
       IntPtr wParam = IntPtr.Zero; 
       SendMessage(child, 0x201, wParam, lParam); 
       SendMessage(child, 0x202, wParam, lParam); 
       } 
      } 
     } 
+0

、私は最終的に深いWinInspectorに掘ってマウスクリックを開始するのに必要なすべてのコマンドを取得しました。私はそんな奴だ。将来的に誰のために が、ここでのWin32を使用してAwesomium上のクリックを活性化するために必要なメッセージであり、最も可能性が高いそれはすべてのために同じです。 WM_PARENTNOTIFY、WM_MOUSEACVTIVATE、WM_LBUTTONDOWN。これらの3つのコマンドは、ユーザーがマウスをアクティブにしたことを親に通知し、次に簡単なヒットテストを行い、最後に左ボタンを押し下げます。これが誰かを助けることを望みます。 – user2578424

+3

答えを出してそれを受け入れる必要があります。 – Xcelled194

答えて

1

それとも、マウスフックの存在下で正しく動作しますれ、代わりにSendInputを使用することができます。あなたの解決策(メッセージを直接投稿する)はできません。プロセスが起動を拒否した場合(ターゲットがWM_MOUSEACTIVATEから0を返した場合、すなわち、)

はより重要なことに、WM_LBUTTONDOWNは送信されません。私のコードにはいくつかの欠点を実現