http://ukamen.hp.infoseek.co.jp/Programming1/WindowFunctions/
http://www.codeproject.com/dotnet/wfspy.asp
これらを発見したのですが、目的のアプリの子Windowのハンドル/タイトルキャプションはできないようです。ちなみにSPY+でやればきちんと認識します。これのコアの部分をC#で書ければいいのですが。
http://www.kumei.ne.jp/c_lang/
猫でもわかるプログラミング
//
char str3[256];
int CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam){
char str2[256];
int vv;
::GetClassName(hwnd,str2,255);
if(!lstrcmp(str2,”Edit”)){
int nY;
WINDOWPLACEMENT wp;
GetWindowPlacement(hwnd,&wp);
nY = wp.rcNormalPosition.top;
if(nY==100){
//オブジェクトのY座標が100で名前がEditのものに対して実行
SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)(str3));
return 0;
}
}
return (int)(hwnd);
}
HWND GETHW;
int CALLBACK EnumWindowProc(HWND hwnd,LPARAM lParam)
{
int i;
char str[256],szClassName[256],ttt[3];
GetWindowText(hwnd,str,255);
GetClassName( hwnd, szClassName, sizeof(szClassName) );
//キャプションが”はてな 回答ウィンドウ”かクラス名が”#32770”の窓を取得ハンドルを返す
if(!lstrcmp(str,”はてな 回答ウィンドウ”)&& !lstrcmp(szClassName,”#32770”) ){
GETHW=hwnd;
}
return (int)hwnd;
}
EnumWindows((WNDENUMPROC)EnumWindowProc,0);//でまずGETHWにハンドルを取得
SetWindowPos(GETHW,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE| SWP_NOMOVE | SWP_NOSIZE);//最上位設定
PostMessage((HWND)GETHW,WM_SETFOCUS,0,0);//フォーカス取得
::EnumChildWindows((HWND)GETHW,(WNDENUMPROC)EnumChildProc,0);//対象の子オブジェクトを取得して、メッセージ送信でテキストを取ってくる
という具合に、フォアグランドにしてみてからSetKeyboardStateなどを使うと上手くいきませんか?
フォアグランドにするのがだめなら、DLL化して強引にメッセージ投げてやらないと無理だと思います
子ウインドウの参照はEnumWindowsでできると思います。
最初の掲題のホームページにも記述がありましたが、いかがでしょうか?
以下、使いそうなAPIをピックアップしておきます。
言語はとりたてて制限していませんがご容赦ください。
http://homepage1.nifty.com/MADIA/vb/API/EnumWindows.htm
EnumWindows(全てのウインドウを列挙する)
すべてのウインドウを列挙する
EnumWindows user32
GetWindowText user32
ウィンドウ名が指定された文字列と一致するトップ レベル ウィンドウのハンドルを取得
user32 FindWindowA
http://hp.vector.co.jp/authors/VA015521/api.html
VisualBasic Frontier - API
マウスポインタを指定した位置に移動する
user32 SetCursorPos
PostMessage user32
みぎくりっく&H2
ひだりくりっく&H1
役にたちます、 thx!
DLL化とかそんな複雑にはならないはずの作業だと思うのですが、できれば数多くあるであろうサンプルでC#にべったりというのが良いのですが。