作業メモ
別アプリのコントロールをいぢる関数
最終手段的な実装なのですが
これでいいかな
#include <windows.h>
#include <string.h>
//---------------------------------------------------------------------------
struct FindWinInfo {
char ClassName[512+1]; // Window ClassName
char WindowText[512+1]; // Window Title(部分一致可能)
};
//---------------------------------------------------------------------------
//! 別アプリのコントロールを取得する
/*!
@param[in] parent 検索開始親HWND(=NULL デスクトップから)
@param[in] inf 子ウィンドウの関係リスト(parentからの親子関係)
@param[in] count リストの数
@return HWND
*/
HWND __fastcall GetExtWindowHandle(HWND parent, FindWinInfo *inf, size_t count)
{
char buff[1024+1] = {0};
HWND hwnd_pre = NULL;
HWND hwnd_cld = NULL;
HWND hwnd_cur = parent;
char *class_name;
char *window_text;
for( size_t i=0; i<count; i++,inf++ ) {
class_name = (inf->ClassName[0] != '\0') ? inf->ClassName : NULL;
window_text = (inf->WindowText[0] != '\0') ? inf->WindowText : NULL;
hwnd_pre = hwnd_cur;
hwnd_cur = NULL;
do {
hwnd_cld = hwnd_cur;
hwnd_cur = FindWindowEx(hwnd_pre,hwnd_cld,class_name,NULL);
if( hwnd_cur == NULL ) break;
SendMessage( hwnd_cur, WM_GETTEXT, (WPARAM)(sizeof(buff)-1), (LPARAM)buff );
} while( (window_text != NULL) && (strstr(buff, window_text ) == NULL) );
if( hwnd_cur == NULL ) break;
}
return hwnd_cur;
}
ちなみに、IE6のアドレスバー場合、こんな感じで取得,設定可能
(第一引数は使えるのか未検証)
{
FindWinInfo inf[] = {
{"IEFrame", " - Microsoft Internet Explorer"},
{"WorkerW", ""},
{"ReBarWindow32",""},
{"ComboBoxEx32", ""}
};
char buff[1024+1] = {0};
HWND hwnd = GetExtWindowHandle(NULL, inf, sizeof(inf)/sizeof(inf[0]));
if( hwnd != NULL ) {
// 別プロセスはGetWindowTextでは取得できない
SendMessage( hwnd, WM_GETTEXT, (WPARAM)sizeof(buff)-1, (LPARAM)buff );
printf("%s\n", buff );
SendMessage( hwnd, WM_SETTEXT, (WPARAM)0, (LPARAM)"about:blank" );
}
}
部分一致に正規表現使えるとよさげ
ついでに配列もvectorにして文字列もwstringあたりにするとさらによさげ?
posted by sanahi at 23:00| 滋賀 ☁|
Comment(0)
|
TrackBack(0)
|
Develop
|