C/C++ ( Windows API実装 ) でやっています。(趣味で。)
Craving Explorer というソフトを自分が組んだプログラムから操作したいと思っています。
「Windows API 他のソフト 操作」と検索したところ、
自分のコントロールを操作するように、
コントロールのハンドルを取得すればいい。
ということがわかりました。
SPY++ というソフトで コントロールのハンドルやらメッセージやらが取得できるということですが、
私は MinGW でやっているので使えません。 ( VC++についているようです。 )
それに近いソフトということで
WinspectorU というソフトで覗いてみました。
これで取得したハンドルに SendMessageで WM_SETTEXT 等のメッセージを送っても...
となぜかイマイチ...
...と色々思いつく範囲のものを試していて、
「どこのウィンドウ(または プロパティシートみたいなコントロール)に張り付いているか」という親ウィンドウハンドルからたどって取得すると、
EDITやCOMBOBOXはなんとかできました。
問題はここからなのです。
質問は複数あります。
( "問題"とはいっても、"課題" の意味じゃないですよ? )
問題1.
試した方法では FindWindow関数で CravingExplorerのハンドルを取得し、FindWindowEx関数でその子ウィンドウ ( コントロール ) を取得していきます。
このとき、
HWND hChild = FindWindowEx( 親ウィンドウハンドル, 0, クラス名, NULL );
となると思いますが、
クラス名が同じで 同じウィンドウ ( コントロール ) に張り付いている場合 ( つまり候補が複数ある場合 )は
どのように取得すべきなのでしょうか?
( 私がやった範囲では 知りたいコントロールが先に来ていたので問題なかったですが。 )
問題2.
Firefox等で言うところの"検索窓" や "URL用" に文字列をセットして後に、手動でやった場合 ( 普通に使った場合 ),
Enterキー か "検索" ボタン的なものを押す 等で 次へ進ませますよね。
このボタンを押す操作だけでも問題ですが、
CE ( CravingExplorer ) の場合は "ツールバー" のようです。
このツールバーを押す操作がどうしてもできません...
私は行きあったりばったりでやっているので、
どうやったか忘れました( 1時間もたってないのに... ) が、
C++
1 EnumWindowsEx::ENUMWINDOW ReBarWindow32, AfxWnd140u1, AfxWnd140u2, ComboBox32, ToolBar; 2 3 // コントールの流れ的には 4 // mainWindow -> ReBar -> AfxWnd140u -> AfxWnd140u -> ComboBox32 となっているようです。 5 6 string sss = "hello"; 7 8 CravingExplorer.hWnd = FindWindow( "CravingExplorerWindowClass", NULL ); 9 if( CravingExplorer.hWnd == NULL ){ return 1; } 10 11 MsgBox->Show( "Found1" ); 12 13 ReBarWindow32.hWnd = FindWindowEx( CravingExplorer.hWnd, 0, "ReBarWindow32", NULL ); 14 if( ReBarWindow32.hWnd == NULL ){ return 1; } 15 16 MsgBox->Show( "Found2" ); 17 18 AfxWnd140u1.hWnd = FindWindowEx( ReBarWindow32.hWnd, 0, "AfxWnd140u", NULL ); 19 if( AfxWnd140u1.hWnd == NULL ){ return 1; } 20 21 MsgBox->Show( "Found3" ); 22 23 AfxWnd140u2.hWnd = FindWindowEx( AfxWnd140u1.hWnd, 0, "AfxWnd140u", NULL ); 24 if( AfxWnd140u2.hWnd == NULL ){ return 1; } 25 26 MsgBox->Show( "Found4" ); 27 28 ComboBox32.hWnd = FindWindowEx( AfxWnd140u2.hWnd, 0, "ComboBoxEx32", NULL ); 29 if( ComboBox32.hWnd == NULL ){ return 1; } 30 31 MsgBox->Show( "Found5" ); 32 33 //ToolBar.hWnd = FindWindowEx( AfxWnd140u2.hWnd, 0, "ToolbarWindow32", NULL ); 34 //if( ToolBar.hWnd == NULL ){ return 1; } 35 36 ToolBar.hWnd = FindWindowEx( AfxWnd140u1.hWnd, 0, "AfxWnd140u", NULL ); 37 if( ToolBar.hWnd == NULL ){ return 1; } 38 39 SendMessage( ComboBox32.hWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)sss.c_str() ); 40 // SendMessage( CravingExplorer.hWnd, WM_ACTIVATE, 0, (LPARAM)ToolBar.hWnd ); 41 SendMessage( AfxWnd140u2.hWnd, WM_COMMAND, (WPARAM)GetWindowLongPtr( ToolBar.hWnd, GWLP_ID ), 0 );
を WM_CREATE のところで行っています。
EnumWindowsEx::ENUMWINDOW は構造体で、
C++
1namespace EnumWindowsEx{ 2 struct ENUMWINDOW{ 3 HWND hWnd; 4 std::string classname; // クラス名 5 std::string title; // キャプション 6 } 7}
で、流用して使っているとします。
私が行いたい処理は、
- EDITかCOMBOBOXにあたる 検索窓? に URLなり、キーワードなりをセット
- 1でセットした直後、ボタン( ツールバー? ) を押した状態にして、検索結果を表示させる
という感じです。
書きこむデータは自分のウィンドウが行うとします。 ( EDIT とかで入力させる。 今はメッセージが送れないと無理なのでテストするために、文字列を固定するとします。 )
自作あぷりからAPIで他のあぷりをいじるときのめも。(1/4)
を参考にして組んでみました。
ツールバーがどうやればいいのか分からなかったので、
「Windows API 他のソフト ツールバー」で検索したところ、
[ 677_他のアプリの TToobar のボタンをクリック ] - Mr.XRAY
がヒットしました。
これを参考にやってみましたが、
型が(Delphi)オリジナルになっているようで、
そのままでは使えませんでした。
どのようにすればいいのでしょうか?
メッセージを送りつけるといっても、メッセージをpeepしたらものすごい勢いで流れて
どれがどれなのかが判断できない... ( on "WinspectorU" )
一応頑張れば(調べながら)使える言語:
Java
VBA
JavaScript
[情報]
言語: C/C++ ( Windows API 実装 )
コンパイラ: MinGW
頑張れば読める言語: VBA, Java, JavaScript

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/08 04:44