ウィンドウにメッセージを送って動かしてみる
ソースコードのないソフトウェアの操作を自動で行う必要がでてきた。
操作自体はあるボタンを押すという簡単なもの。
winspector spyを使って該当操作のウィンドウメッセージのパラメータを調べてみると
であった。
したがって該当のウィンドウにこのパラメータでメッセージを送ってあげれば目的の操作ができるはず。
実際にためしてみる。
DWORD wParam = (WPARAM) MAKEWPARAM(32979, 0); DWORD lParam = 0; SendMessage([ウィンドウハンドル], WM_COMMAND, wParam, lParam);
で該当のソフトウェアに目的の操作をさせることができた。
ただ、自動で目的の操作をするためには該当のソフトウェアのウィンドウハンドルを知っている必要がある。そこで調べてみると、EnumWndProcを使うと画面上のすべてのトップレベルウィンドウを列挙することができるみたいだ。
そこで、ソフトウェアのウィンドウ名(CHANBARA)で該当のソフトウェアのウィンドウハンドルを特定して、上記のメッセージを送ることにした。
// ターゲットとなるウィンドウの情報 typedef struct _WindowInfo { HWND Handle; // ウィンドウハンドル std::string Title; // ウィンドウのタイトル } WindowInfo; // ウィンドウ情報の配列 typedef std::vector<WindowInfo*> WindowInfoArray; // それぞれのウィンドウのハンドルを順に受けるコールバック関数 BOOL CALLBACK EnumWndProc( HWND hWnd, LPARAM lParam ) { TCHAR buff[256]=_T(""); GetWindowText(hWnd, buff, sizeof(buff));//ウィンドウ名を取得 if(strstr(buff, "CHANBARA") != NULL ){ // ウィンドウ名がGHANBARAであった場合 // ウィンドウ情報をセットする WindowInfo* p = new WindowInfo(); assert(p != NULL); p->Handle = hWnd; p->Title = std::string(buff); pWindowInfoArray->push_back(p); } }
これで無事に操作できるようになった。
この記事へのコメントはありません。