- ベストアンサー
VisualC++で他のウィンドウのボタンを自動的に押す方法
- VisualC++で作成したアプリケーションから、他のWindowsアプリケーションの特定のウィンドウをアクティブにし、その中のボタンを自動的に認識して押す方法を知りたいです。
- 具体的には、Windowsの電卓アプリケーションのウィンドウをアクティブにし、その中の「1」ボタンを押す操作をプログラムで実現したいです。
- 関連する技術の名前やMFCでのAPI名を教えていただけると幸いです。また、使用する関数やライブラリについてもお知りになりたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★列挙方法のアドバイス ・補足になる仕様の >(1)ウィンドウのタイトルバーの名前(例:「電卓」)、 >またはウィンドウのIDでウィンドウを探す ↑ これなら FindWindow() 関数でウインドウ・ハンドルを探せます。 例: HWND hWnd = FindWindow( "SciCalc", "電卓" ); >(2)最初にヒットしたウィンドウをアクティブにする ↑ 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。 例: SetForegroundWindow( hWnd ); >(3)アクティブにしたウィンドウの中にあるボタンを探す ↑ (1)で取得しているウインドウに対して子ウインドウ(ボタンなど)を列挙します。 列挙には EnumChildWindows() 関数と EnumChildProc() のコールバック関数を使います。 >(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す ↑ 列挙のコールバック関数(EnumChildProc)でボタンのキャプションを調べて 『1』となっている文字列が電卓の『1』ボタンです。 このときにボタンを押す処理をプログラムから行います。 例: SendMessage( hChild, BM_CLICK, 0, 0 ); URL: http://wisdom.sakura.ne.jp/system/winapi/win32/win53.html ・上記のような感じで操作できます。 一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。 このウインドウ・ハンドルを見つけるには次の方法があります。 (1)FindWindow() 関数を使う (2)EnumWindows() 関数を使う (3)Process32First()、Process32Next() 関数を使う (4)EnumProcesses() 関数を使う などがあります。 今回は簡単な(1)を紹介しました。 もしもウインドウのクラス名やキャプション名以外で詳しく捜査対象の ウインドウを検索するには(2)の EnumWindows() 関数や起動パス名を 調べて特定できる (3)、(4)の関数群を利用します。 >テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。 ↑ ボタンなどのテキストを認識、保存には GetWindowText()、WM_GETTEXT メッセージを 使います。メッセージの場合は SendMessage() 関数でキャプション文字列を取得します。 例: SendMessage( hChild, WM_GETTEXT, sizeof(szBuff), szBuff ); ・下に簡単なボタンの列挙を載せます。これを活用して下さい。 サンプル: #include <stdio.h> #include <windows.h> // コールバック関数 BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam ) { TCHAR szBuff[ 1024 ]; // キャプションの取得 GetWindowText( hWnd, szBuff, sizeof(szBuff) ); printf( "├[%s]\n", szBuff ); return TRUE; } // メイン関数 int main( void ) { HWND hCalc; if ( (hCalc = FindWindow("SciCalc","電卓")) != NULL ){ printf( "◆電卓のコントロール列挙\n" ); EnumChildWindows( hCalc, EnumChildProc, NULL ); } return 0; } 以上。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >他のアプリケーションを自動的に操作するソフトを作りたいのです。 ↑ 操作したいアプリケーションのウインドウ・ハンドルを取得すればいろいろと 操作できます。ここが一番のポイントです。 ・例えとして『Windows電卓』の『1』ボタンを押す仕組みは (1)起動しているであろう『Windows電卓』のウインドウ・ハンドルを取得 (2)トップレベルのウインドウ・ハンドルからコントロールの列挙 (3)列挙されてボタン、テキストボックスなどのキャプションを調べて目的の コントロール(ボタンなど)のウインドウ・ハンドルを取得 (4)取得したボタンのウインドウ・ハンドルにプログラムから押された指示を出す こんな感じになります。 ・それでどのようにウインドウ・ハンドルを得るかがポイントになります。 まずはどうやって他のアプリケーションを操作するのかの仕様を決めて下さい。 (1)マウスの下にあるウインドウを操作 (2)アクティブ・ウインドウを操作 (3)登録されたウインドウをひそかに操作 (4)その他 どのような仕組みで操作するのでしょうか補足して下さい。 良くフリーソフトなどではキーボードやマウス操作を記録して再生するソフトがあります。 このような仕様ですか?それとも別方式? ・以上。操作の仕様などを補足して下さい。
補足
回答ありがとうございます。 私が考えている他のアプリケーションを操作する仕様は (1)ウィンドウのタイトルバーの名前(例:「電卓」)、またはウィンドウのIDでウィンドウを探す (2)最初にヒットしたウィンドウをアクティブにする (3)アクティブにしたウィンドウの中にあるボタンを探す (4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す といった仕様を考えています。 なぜ、このような質問をしたかというと、フリーウェアによくある操作再生だけではなく、ウィンドウのスナップショット取り、操作の成功失敗のログ吐き出し、テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。 以上、よろしくお願いします。
お礼
ありがとうございます。 サンプルプログラムを作ってみましたところ、うまく電卓アプリケーションの操作ができました。 また、教えていただいたキーワードを足がかりに、関連する技術用語も検索することができました。