プロが教えるわが家の防犯対策術!

いくつかのウィンドウ(Microsoft Internet Explorerやフォルダ、ワードなどの)を開いていて、それらの中で特定のウィンドウの名前を知る方法をご存じの方がいらっしゃれば、アドバイスいただきたいと思います。

何が目的かといいますと、指定したウィンドウの画面をキャプチャして保存するまでを一連で行うプログラムを作りたいので、指定するウィンドウの名前を知る必要があります。

A 回答 (4件)

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;

}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご教示の内容を試してみました。
結果として、可視のウィンドウを全て保存をしていますが、
画像を開けないもの?(白い四角の中に赤の×印)
もの(ウィンドクラス名はIEFrameとThundetRT6Main(調べたところVCで作ったものみたいですが))があります。

また、キャプチャしようとしたウィンドウに他のウィンドウが重なったまま(キャプチャプログラムを起動した際の状態の画像)キャプチャされています。(このウィンドクラス名はThundetRT6FormDC)

この方法で特定のウィンドウクラス名を知ることができましたが(キャプチャしたいウィンドウはVCで作られているアプリなので、おそらくは、ThundetRT6MainかThundetRT6FormDCです)上記のように余計なものが映っていたり、もしくは開けないので、この問題を解決し、
特定のウィンドウのみをキャプチャして保存する方法はないのでしょうか?

お礼日時:2008/05/21 12:25

★アドバイス


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

参考URL:http://msdn.microsoft.com/ja-jp/library/cc364874 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

いろいろ調べて、とりあえず、解決しました。

解決方法は、
キャプチャしたいのは特定のアプリのウィンドウ一つだけで、
そのウィンドウハンドルはThunderRT6FormDCのようです。

ですので、GetClassName関数をもちいて
順次開いているウィンドウハンドルを取得させ
strcmp関数を用いて、ThunderRT6FormDCと一致する時のみ
前面に表示させBMP形式で保存するようにしました。
 
>画像を開けないもの?(白い四角の中に赤の×印)
 ↑
 >この意味がちょっと分かりません。
開くと、白い四角の中に赤の×印の画像が表示されたということです。
つまりはキャプチャできなかったと伝えたかったのですが、
分かりにくい表現となりました。
申し訳ありません。

>それから『ThunderRT6Main』や『ThunderRT6FormDC』はVCではなくて>VBかDelphi言語で作成されたアプリケーションだと思います。

調べたところ、ご指摘の通りでした。

お礼日時:2008/05/21 19:06

★アドバイス


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

http://msdn.microsoft.com/ja-jp/library/cc364732 …
http://blog.goo.ne.jp/masaki_goo_2006/e/f4a960eb …
http://blog.goo.ne.jp/masaki_goo_2006/e/337be80c …
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/21 11:59

「ウィンドウ名」とは何を指していますか?


必要なのはウィンドウ・ハンドルではありませんか?
ウィンドウ・ハンドルの取得はFindWindowEx、EnumWindowsなど
タイトルバーはGetWindowText、クラス名はGetClassNameを使います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/21 11:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!