- ベストアンサー
FindWindowの戻り値が違う!?
いつもお世話になっております。 FindWindowの戻り値についてご教授願います。 ret = FindWindow(NULL,"sample"); 上記を実行した場合、取得する画面がアクティブの時と非アクティブの時でFindWindowの戻り値が違うのは何故でしょうか? 私は、sample画面が非アクティブでもアクティブ状態の時と同じハンドルが取得したのですが、良い方法は有りますでしょうか? 取得画面タイトル:sample 実行ファイル名:sample.exe 実行環境:WindowsXP 開発環境:VC++ 6.0
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1, No.2 への補足読みました。 VC++ に付属の Spy++ というツールを使うと,任意のウィンドウのウィンドウクラス名を調べることができます。 使い方は参考 URL を。 これで調べたウィンドウクラス名を,FindWindow の第1引数に渡してやればよいです。 ただし,ウィンドウクラス名は一意ではないので,確実に目的のウィンドウのハンドルが取れる保証はありません。 要は仕様でどこまで要求されるかですが,それじゃ困るという場合には別な方法を考えないといけませんね,ということで。
その他の回答 (2)
- nk2
- ベストアンサー率23% (6/26)
FindWindowの第一引数はウィンドウクラスを指定することになっています。 sample.exeのソースコードでCreateWindowなどのAPIでウィンドウハンドルを取得していると思いますが、第一引数に指定しているウィンドウクラスを調べ、 FindWindowで指定して下さい。
補足
millibarさんへの補足説明にも記述しましたが、画面自体は「VB6.0」で作成されております。 このような場合、FindWindowの第一引数に渡すウィンドウクラスとは何を渡せば良いのですか? 宜しくお願いします。
ウィンドウテキストが "sample" のウィンドウが複数あった場合, どのウィンドウのハンドルが返ってきてもおかしくないです。 おそらく Z オーダー順に探しにいくので, アクティブ / 非アクティブではなくて, ウィンドウの順序の違いが結果に現れていると思います。 以上はあくまで推測ですが。 ハンドルを取得したいウィンドウと呼び出し元との関係を明らかにしていただければ, より的確な回答が得られるかもしれません。 例えば, 呼び出し元のプロセスで Create したウィンドウなら,わざわざ探さなくてもハンドルを保持してるのが普通ですけどね。
補足
早速の回答ありがとうございます。 大変申し訳有りませんでした。 説明不足でしたので、補足させていただきます。 「sample.exe」は、VB6.0で作成された画面で、3回連続で実行されます。 その際の画面タイトル(Caption)は「sample」「sample1」「sample2」となります。 FindWindowを実行した場合、画面タイトルが「sample」のものに限り、アクティブ時と非アクティブ時でFindWindowの戻り値が違います。 この説明でご理解できますでしょうか? 宜しくお願いします。
お礼
Spy++ツールを使用することにより各画面のウィンドウハンドル確認/取得に成功しました。 本当にありがとうございます。 勉強になりました。 また、何か有りましたら宜しくお願いします。
補足
いろいろとご検討いただきありがとうございます。 更に補足させていただきます。 「sample」「sample1」「sample2」画面は、setwindowlongを使用し、別の要求画面のSendMessage要求を待っています。 SendMessageの第一引数に「sample」「sample1」「sample2」画面いずれかのウィンドウハンドルを設定するようにしていますので、確実に目的画面のウィンドウハンドルが必要となります。 宜しくお願いします。 Spy++というツールは知りませんでした。 試しに使用してみたいと思います。 勉強になりました。