• ベストアンサー

ウィンドウ名を知るには

いくつかのウィンドウ(Microsoft Internet Explorerやフォルダ、ワードなどの)を開いていて、それらの中で特定のウィンドウの名前を知る方法をご存じの方がいらっしゃれば、アドバイスいただきたいと思います。 何が目的かといいますと、指定したウィンドウの画面をキャプチャして保存するまでを一連で行うプログラムを作りたいので、指定するウィンドウの名前を知る必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

GetForegroundWindowだとプログラムを起動するときにそこがアクティブになるので他のウィンドウは指定できないのでは。 とりあえず可視のウィンドウを片っ端から保存 BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam) { WINDOWINFO wi; char szWindowName[ 128 ]; wi.cbSize = sizeof(WINDOWINFO); GetWindowInfo(hWnd, &wi); if (wi.dwStyle & WS_VISIBLE) { //ウィンドウを前面にして書き直させる SetForegroundWindow(hWnd); Sleep(100); //ウィンドウクラス名をファイル名に GetClassName( hWnd, szWindowName, sizeof(szWindowName) ); strcat(szWindowName, ".bmp"); SaveBitmap(hWnd, szWindowName); } return TRUE; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { EnumWindows(EnumWndProc, 0); return 0; }

ureo
質問者

お礼

ご回答ありがとうございます。 ご教示の内容を試してみました。 結果として、可視のウィンドウを全て保存をしていますが、 画像を開けないもの?(白い四角の中に赤の×印) もの(ウィンドクラス名はIEFrameとThundetRT6Main(調べたところVCで作ったものみたいですが))があります。 また、キャプチャしようとしたウィンドウに他のウィンドウが重なったまま(キャプチャプログラムを起動した際の状態の画像)キャプチャされています。(このウィンドクラス名はThundetRT6FormDC) この方法で特定のウィンドウクラス名を知ることができましたが(キャプチャしたいウィンドウはVCで作られているアプリなので、おそらくは、ThundetRT6MainかThundetRT6FormDCです)上記のように余計なものが映っていたり、もしくは開けないので、この問題を解決し、 特定のウィンドウのみをキャプチャして保存する方法はないのでしょうか?

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >キャプチャプログラムを実行する際のウィンドウがアクティブになる >問題を解決できるのでしょうか?  ↑  プログラムを起動してキャプチャする仕組みだと無理でしたね。  ホットキーでキャプチャ・プログラムが実行されるタイプなら出来そうです。  でもこの仕組みではないのですよね。前質問より。  どんな仕組みでしょうか? ・クラス名が『ThunderRT6Main』とか、『ThunderRT6FormDC』は  マルチ・インスタンスのアプリケーションです。  エクセルのようなソフトはクラス名やタイトル名などを解析して  どの組み合わせでメインのウインドウのクラスになるか調べて下さい。  単純にすべてのアプリケーションに対応は難しいと思います。 >画像を開けないもの?(白い四角の中に赤の×印)  ↑  この意味がちょっと分かりません。 >また、キャプチャしようとしたウィンドウに他のウィンドウが重なったまま…  ↑  正しくウインドウ・ハンドルさえ取得できればSetForegroundWindow()関数で  前面に出してからSaveBitmap()関数を呼び出せば良いでしょう。 ・それから『ThunderRT6Main』や『ThunderRT6FormDC』はVCではなくてVBか  Delphi言語で作成されたアプリケーションだと思います。 >特定のウィンドウのみをキャプチャして保存する方法はないのでしょうか?  ↑  キャプチャ・プログラムを起動してからマウスをドラッグしてマウスの直下の  ウインドウ・ハンドルを取得する方法はどうでしょうか?  WindowFromPoint()関数など。  あるいはキャプチャ・プログラムを起動してアクティブにした後にマウスで  キャプチャしたいウインドウをクリックしてアクティブ・ウインドウが  切り替わったときにSaveBitmap()関数を呼ぶ方法とか。

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc364874.aspx
ureo
質問者

お礼

ご回答ありがとうございます。 いろいろ調べて、とりあえず、解決しました。 解決方法は、 キャプチャしたいのは特定のアプリのウィンドウ一つだけで、 そのウィンドウハンドルはThunderRT6FormDCのようです。 ですので、GetClassName関数をもちいて 順次開いているウィンドウハンドルを取得させ strcmp関数を用いて、ThunderRT6FormDCと一致する時のみ 前面に表示させBMP形式で保存するようにしました。   >画像を開けないもの?(白い四角の中に赤の×印)  ↑  >この意味がちょっと分かりません。 開くと、白い四角の中に赤の×印の画像が表示されたということです。 つまりはキャプチャできなかったと伝えたかったのですが、 分かりにくい表現となりました。 申し訳ありません。 >それから『ThunderRT6Main』や『ThunderRT6FormDC』はVCではなくて>VBかDelphi言語で作成されたアプリケーションだと思います。 調べたところ、ご指摘の通りでした。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・そういう場合はGetForegroundWindow()関数はどうでしょうか?  このAPIは一番手前のアクティブ・ウインドウのハンドルを取得します。  特定のアプリケーションを前に持ってきてからキャプチャ・プログラムを  起動すれば任意のウインドウがキャプチャできます。 ・特定のアプリケーションをタイトル名、クラス名などで検索するのであれば  FindWindow()やEnumWindows()やCreateToolhelp32Snapshot()などあります。  FindWindowEx()は子ウインドウを列挙しますのでGUIコントロールだけを  キャプチャするときに使えば良いでしょう。  ウインドウ全体ならFindWindow()です。 http://msdn.microsoft.com/ja-jp/library/cc364732.aspx http://blog.goo.ne.jp/masaki_goo_2006/e/f4a960eba4c54fb573428acd57d61a44 http://blog.goo.ne.jp/masaki_goo_2006/e/337be80c82382e81e899bbda1b027217

ureo
質問者

お礼

アドバイスありがとうございます。 この手法の場合、他の方のご回答中にもありますが、 特定のアプリケーションをキャプチャするには、 キャプチャプログラムを実行する際のウィンドウがアクティブになる 問題を解決できるのでしょうか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

「ウィンドウ名」とは何を指していますか? 必要なのはウィンドウ・ハンドルではありませんか? ウィンドウ・ハンドルの取得はFindWindowEx、EnumWindowsなど タイトルバーはGetWindowText、クラス名はGetClassNameを使います。

ureo
質問者

お礼

その通りでウィンドウ・ハンドルのことです。 適切な言葉を使わず、ご迷惑をおかけしました。 また、アドバイスありがとうございます。

関連するQ&A

専門家に質問してみよう