前提・実現したいこと
C#でプログラミングをしています。
Windows10で外部プロセスのボタンハンドルを取得して、ボタンをクリックするだけの処理を実現したいです。
ただ、Windows7(x86)では実行できたソースコードをそのまま移植しましたが、ハンドルのキャプションは取得できますが、クリック操作が実行されません。
発生している問題・エラーメッセージ
SendMessageでボタンに入力されているテキストはGetWindowTextメソッドで取得できますが、 SendMessageでボタンをクリックすることが出来ません。。
該当のソースコード
C#
1 2 private const int BM_CLICK = 0x00F5; 3 private const int WM_LBUTTONDOWN = 0x201; 4 private const int WM_LBUTTONUP = 0x202; 5 private const int MK_LBUTTON = 0x0001; 6/* 7 [DllImport("user32.dll")] 8 public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam); 9*/ 10 // 戻り/引数をIntPtrに変更 11 [DllImport("user32.dll")] 12 public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 13 14 [DllImport("user32.dll")] 15 public extern static int SendMessage( 16 IntPtr hWnd, // 送信先ウィンドウのハンドル 17 uint Msg, // メッセージ 18 uint wParam, // メッセージの最初のパラメータ 19 StringBuilder lParam // メッセージの 2 番目のパラメータ 20 ); 21 22/* 23 /// <summary> 24 /// ボタンハンドルのクリック制御を行います。 25 /// </summary> 26 /// <param name="hBtn">ウィンドウボタンハンドル</param> 27 public static void ClickButton(IntPtr hBtn) 28 { 29 MessageBox.Show(GetWindowText(hBtn)); 30 SendMessage(hBtn, WM_LBUTTONDOWN, MK_LBUTTON, 0); 31 SendMessage(hBtn, WM_LBUTTONDOWN, MK_LBUTTON, 0); 32 Thread.Sleep(100); 33 SendMessage(hBtn, WM_LBUTTONUP, 0, 0); 34 35 SendMessage(hBtn, BM_CLICK, 0, 0); 36 } 37 38 /// <summary> 39 /// 指定ウィンドウハンドルのテキストを取得します。 40 /// </summary> 41 /// <param name="hWnd"></param> 42 /// <returns>テキスト</returns> 43 public static string GetWindowText(IntPtr hWnd) 44 { 45 int length = (int)(SendMessage(hWnd, 0xe, (IntPtr)0, (IntPtr)0)) * 2 + 1; 46 StringBuilder sb = new StringBuilder(new string('\0', length)); 47 48 SendMessage(hWnd, 0xd, (uint)sb.Length, sb); 49 50 return sb.ToString(); 51 } 52*/ 53 /// <summary> 54 /// ボタンハンドルのクリック制御を行います。(IntPtrに変更したため反映) 55 /// </summary> 56 /// <param name="hBtn">ウィンドウボタンハンドル</param> 57 public static void ClickButton(IntPtr hBtn) 58 { 59 MessageBox.Show(GetWindowText(hBtn)); 60 SendMessage(hBtn, WM_LBUTTONDOWN, (IntPtr)MK_LBUTTON, IntPtr.Zero); 61 SendMessage(hBtn, WM_LBUTTONDOWN, (IntPtr)MK_LBUTTON, IntPtr.Zero); 62 Thread.Sleep(100); 63 SendMessage(hBtn, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); 64 65 SendMessage(hBtn, BM_CLICK, IntPtr.Zero, IntPtr.Zero); 66 } 67 68 69 /// <summary> 70 /// 指定ウィンドウハンドルのテキストを取得します。(IntPtrに変更したため反映) 71 /// </summary> 72 /// <param name="hWnd"></param> 73 /// <returns>テキスト</returns> 74 public static string GetWindowText(IntPtr hWnd) 75 { 76 int length = (int)SendMessage(hWnd, 0xe, IntPtr.Zero, IntPtr.Zero) * 2 + 1; 77 StringBuilder sb = new StringBuilder(new string('\0', length)); 78 79 SendMessage(hWnd, 0xd, (uint)sb.Length, sb); 80 81 return sb.ToString(); 82 }
試したこと
Spy++から外部プロセスのハンドルを閲覧し、直接ClickButtonメソッドを実行→クリックされない。
プラットフォームターゲットを”Any CPU”から”x86”に変更→クリックされない。
ボタンハンドルをキャプチャし、ClickButtonメソッドを実行→GETTEXTのみしかキャプチャできない。
補足情報(FW/ツールのバージョンなど)
Windows10(64bit)
Visual Studio 2015
回答3件
あなたの回答
tips
プレビュー