質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

3回答

9352閲覧

外部プロセスのボタンをハンドル操作でクリックできない。

ta2ta2.tk

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2020/11/02 03:10

編集2020/11/04 00:12

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/02 05:00 編集

Spy++でメッセージ送信先のボタンのメッセージをキャプチャして、メッセージは飛んできていますか? ちなみに、SendMessageの戻り値、WPARAM、LPARAMは IntPtr です。 (x86でビルドする分には問題なく動くでしょうけど)
ta2ta2.tk

2020/11/04 00:14

上記、ご回答ありがとうございます。 上記SendMessageの戻り/引数をIntPtrに直した後、メッセージのキャプチャをしました。 ただGETTEXTのメッセージしか飛んでこなく、BUTTONCLICKのメッセージは飛んできませんでした。
guest

回答3

0

操作対象アプリが自動で管理者権限で実行されるものだったため、今回の処理のプロジェクトにマニュフェストで権限を管理者に変更し実行したところ正常に動作しました。

投稿2020/11/04 07:24

ta2ta2.tk

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

上記、調べたところ操作対象アプリが自動で管理者権限で実行されるものだったため、管理者権限をマニフェストで権限を管理者に上げて実行したところ正常に動作しました。

投稿2020/11/04 07:20

ta2ta2.tk

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ボタンだけ置いたWindowsFormsアプリを作成し、こちらの環境で下記処理を実行したら、特に問題なくWM_LBUTTONDOWN, WM_LBUTTONUP メッセージがキャプチャされ、クリックイベントが発生しました。
クリックイベントを実行するアプリが前面に表示されていないとクリックイベントが発生しない事もありましたが、その場合でも問題なく WM_LBUTTON系 メッセージ自体はキャプチャされるのを確認しました。

csharp

1 var hBtn = new IntPtr(送信先ボタンのHWND); 2 SendMessage(hBtn, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 3 SendMessage(hBtn, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);

操作対象アプリは自作のものでしょうか?また、OS標準のButtonでしょうか?
別のアプリケーション(アンチウイルスソフト)等によって、他プロセスへの干渉が出来なくなっている等は考えられないでしょうか?

ちなみに、SendInputでマウスやキーボード操作を送信してみるとかではどうでしょう?

投稿2020/11/04 00:53

編集2020/11/04 00:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta2ta2.tk

2020/11/04 04:27

上記ご回答ありがとうございます。 上記のようにボタンだけ置いたWindowsFormsアプリを作成しクリック動作を試したところ正常に動作しました。 操作対象アプリ側の問題の様です。 ボタンクラスを確認したところ以下の様です。 動作したアプリのボタンクラス >WindowsForms10.BUTTON.app.0.af25cb_r9_ad1 動作できないが遠隔操作したいアプリのボタンクラス >WindowsForms10.BUTTON.app.0.223fba4 上記のクラスで操作できないような違いあるのでしょうか?
ta2ta2.tk

2020/11/04 04:31

上記追記ですが、SendInputでマウス操作(ボタンのスクリーン座標取得、カーソル移動、クリック)まで行いましたが、ボタンだけのフォームは正常に動作し、動作させたいアプリではカーソル移動までで止まってしまいました。
退会済みユーザー

退会済みユーザー

2020/11/04 04:34

操作対象アプリがどのような作りをしているかによるので、何とも言えません。 ゲーム等では、チートやマクロ防止の為に外部プロセスからの操作を弾く仕組みを入れているものもあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問