tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルアクティブ ウィンドウのスナップショットを取得
記事No15116
投稿日: 2011/03/01(Tue) 07:59
投稿者クロ
あるプログラムのウィンドウのスナップショットを数分の間隔で取得し
ファイルにセーブしたいと思います。

逆引きヘルプ273とタイマーコントロール028を元させていただき試しました。
Command1ボタンを押すとタイマーがスタートし、時間が着たら
 Call SaveWindowPic(True, False) を呼ぶようにしました。

結果CommandボタンのFormやVB6の編集画面は問題なくsaveされるのですが
マイドキュメントのフォルダーや目的のプログラムのWindowは
"保存出来ませんでした。"のMSGがでて取得できません。

しかしたまに取得できるときがあります。
不思議なのは "保存出来ませんでした。"と表示されながらsaveされる
時があるのです。

すいませんが対処方法教えてください。

[ツリー表示へ]
タイトルRe: アクティブ ウィンドウのスナップショットを取得
記事No15117
投稿日: 2011/03/01(Tue) 13:01
投稿者花ちゃん
> あるプログラムのウィンドウのスナップショットを数分の間隔で取得し
> ファイルにセーブしたいと思います。
>
> 逆引きヘルプ273とタイマーコントロール028を元させていただき試しました。
> Command1ボタンを押すとタイマーがスタートし、時間が着たら
>  Call SaveWindowPic(True, False) を呼ぶようにしました。
>
> 結果CommandボタンのFormやVB6の編集画面は問題なくsaveされるのですが
> マイドキュメントのフォルダーや目的のプログラムのWindowは
> "保存出来ませんでした。"のMSGがでて取得できません。
>
> しかしたまに取得できるときがあります。
> 不思議なのは "保存出来ませんでした。"と表示されながらsaveされる
> 時があるのです。
>
> すいませんが対処方法教えてください。

実行環境等を書いて下さい。

又、問題を切り分けて下さい。
アクティブなウィンドウは、取得できないが、全画面なら取得できるとか?
手動で、PrintScreen キー を押した場合は、目的の画面がクリップボードにコピー
できているのか、いないのか?

No.273 のサンプルは、プログラム上から PrintScreen キー を操作して、それによって
クリップボードにスナップショットがコピーされるので、クリップボードに画像が
あれば、それを取得して保存しているので、どこまで、うまく動作していて
どこから、(どこが)動作がうまくしていないかを調べて下さい。
まず、PrintScreen キー が押されているかどうか?
クリップボードに画像が入っているのかどうか?
アクティブなウィンドウ を取得したいのなら、PrintScreen キー が押された時に
そのウィンドウがアクティブ になっていなければなりません。
クリップボードを利用した場合、クリップボードに転送されたタイミングと取得する
タイミングが合わず、画像がクリップボードに入っていないとされ取得できない場合も
あります。
PrintScreen キー を押してから、少し時間をおいてから取得したら取得できるとかも
調べてみてください。

>不思議なのは "保存出来ませんでした。"と表示されながらsaveされる
>時があるのです。
そのような事は、プログラム上もあり得ません。
IF 文で保存とメッセージの表示は同時に行うようにはなっていません。
保存された時とメッセージが表示された操作は別の操作の時に起きた事だと思います。

[F8]キー等で、プログラムを1ステップづつ実行してどのようにコードが実行されて
いるのか、その時にクリップボード内の画像はどうなっているのかどうかとかをよく
調べてみてください。

[ツリー表示へ]
タイトルRe^2: アクティブ ウィンドウのスナップショットを取得
記事No15118
投稿日: 2011/03/02(Wed) 08:01
投稿者クロ
> 実行環境等を書いて下さい。

失礼しました。
 Windows XP Home
 VB6
 VB暦1年弱
 趣味での使用です。

> PrintScreen キー を押してから、少し時間をおいてから取得したら取得できるとかも

原因はこれでした。
以下のようにsleepで時間をおくようにしたら問題なくなりました。

    Do Until Clipboard.GetFormat(vbCFBitmap) = True
        DoEvents
        Sleep (100)
    Loop

sleepは余り使わないほうがよいということをたまに見かけますがいかがでしょうか。
BMPファイルへの変換処理をとめているようにも思えます。
Windowのサイズにより変わりますが1〜3秒程度かかっています。
よい方法がありましたら教えてください。

[ツリー表示へ]
タイトルRe^3: アクティブ ウィンドウのスナップショットを取得
記事No15119
投稿日: 2011/03/02(Wed) 09:17
投稿者花ちゃん
>     Do Until Clipboard.GetFormat(vbCFBitmap) = True
>         DoEvents
>         Sleep (100)
>     Loop
>

上記では、何らかのトラブルで、クリップボードに画像がコピーされない場合は、
延々と待機する事になりませんか?

> sleepは余り使わないほうがよいということをたまに見かけますがいかがでしょうか。
個人的には、自分だけが承知の上で使っていて特に問題がなければいいかとは
思うのですが、やはり、使用しない方が無難でしょう。

> BMPファイルへの変換処理をとめているようにも思えます。
> Windowのサイズにより変わりますが1〜3秒程度かかっています。
> よい方法がありましたら教えてください。
私は、MS のサイトの Visual Basic で SetWaitableTimer を使用する方法をActiveX DLL で
作成して使用したり、MsgWaitForMultipleObjectsを使ったりしています。(最近では)
http://support.microsoft.com/kb/231298/ja

又、簡単な方法なら、キーを押した後、タイマーコントロールを使って、何回か回数を
決めて、クリップボード内を調べるのがいいのではないでしょうか?
(クリップボード内にコピーされない場合の事も考えて)

[ツリー表示へ]
タイトルRe^4: アクティブ ウィンドウのスナップショットを取得
記事No15122
投稿日: 2011/03/04(Fri) 08:01
投稿者クロ
> 私は、MS のサイトの Visual Basic で SetWaitableTimer を使用する方法

> 又、簡単な方法なら、キーを押した後、タイマーコントロールを使って、何回か回数を
> 決めて、クリップボード内を調べるのがいいのではないでしょうか?

ご教示いただいた方法で目的のプログラムを作ることが出来ました。
他クリップボード->JPG変換、他のソフトのハンドルを取得しwindowをアクティブにする
も逆引きヘルプ一覧表を利用させていただきました。

大変助かりました。
ありがとうございます。

[ツリー表示へ]