[リストへもどる]
一括表示

投稿時間:2003/03/30(Sun) 15:55
投稿者名:HB
Eメール:
URL :
タイトル:
実行画面をファイルに保存
初めて投稿します(^^)

VBで作成したプログラムの実行画面を、ファイルに保存したいと思っていますが、
全然方法が分かりません。
具体的には、メニューなどに「現在表示中の画面をファイルに保存」などを作成し、
それをクリックするとファイルに保存される、と言った手順を想定しています。
どなたか分かる方、教えて下さい。

投稿時間:2003/03/30(Sun) 16:34
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 実行画面をファイルに保存
keybd_event API等を使って VK_SNAPSHOT 等のキーを操作してクリップボードに画面をコピーします
(ここの逆引きヘルプのキーストロークをシミュレート(押下げ・制御)するを参照)                            


その画像をピクチャーボックスに貼付、その画像をファイルに保存します。
(クリップボードの利用やピクチャーボックスに表示・描画した画像・文字の保存を参照)

投稿時間:2003/03/30(Sun) 17:13
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 実行画面を保存(簡単なサンプル)
中途半端なコードを投稿してご迷惑をお掛けしてもなんですので
ここの投稿は削除させて頂きます。

修正版(?)を逆引きヘルプの方にアップしておきましたので
そちらを見て下さい。
未確認の機種については各自確認の上ご利用願います。

 2003/04/02 再投稿

投稿時間:2003/04/01(Tue) 00:57
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^2: 実行画面を保存(簡単なサンプル)
>   'こちらの方法でOSのVersionが取得できない場合はAPIを使って下さい。
>     OsVer = CreateObject("SysInfo.SYSINFO").OSVersion

 OSPlatformで95系かNT系かを見るのでは。

> ※ 上記以外のOSで動作確認された場合投稿して頂けるとありがたいのですが!

 Win2000 :bScan=0 フルスクリーン
      bScan=1 アクティブウィンドウ
 WinNT4.0:bScan=0 フルスクリーン
      bScan=1 フルスクリーン

 Win4.0は、私の思い違いで、正常に動作しなかったようです。keybd_eventで
Altキーも操作すると動きますが。
 参考リンク
 http://www.galliver.co.jp/writing/nikkei_tokushu/prn908/
 http://support.microsoft.com/default.aspx?scid=kb;ja;411704

投稿時間:2003/04/01(Tue) 02:19
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 実行画面を保存(簡単なサンプル)
>  OSPlatformで95系かNT系かを見るのでは。

  "SysInfo.SYSINFO" がいつからサポートされたのか知らなかったので
  サポートされていない場合はAPIを使って下さいという意味で書いたのですが
  書き方がまづかったですね

>  Win2000 :bScan=0 フルスクリーン
>       bScan=1 アクティブウィンドウ
>  WinNT4.0:bScan=0 フルスクリーン
>       bScan=1 フルスクリーン
>
>  Win4.0は、私の思い違いで、正常に動作しなかったようです。keybd_eventで
> Altキーも操作すると動きますが。
>  参考リンク
>  http://www.galliver.co.jp/writing/nikkei_tokushu/prn908/
>  http://support.microsoft.com/default.aspx?scid=kb;ja;411704
色々調べて頂きありがとうございます。
NTの場合 keybd_event APIの2番目の引数の使い方違うようですがどちらでも問題ないのでしょうか?
NTは持っていないので動作確認はできませんが
keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0
keybd_event(VK_LMENU, 0x56, KEYEVENTF_EXTENDEDKEY, 0)

Win98/WinXP で上記を試した結果どちらでも動作するようです。多分NTでもOKかと思います。

投稿時間:2003/03/30(Sun) 20:33
投稿者名:HB
Eメール:
URL :
タイトル:
Re: 実行画面を・・・(完成しました(^^)
花ちゃん、早速の丁寧なレス、ありがとうございました!
多少アレンジして目的を果たしました。感謝です(^^♪

アレンジの結果です。

Public Sub 画面保存()

    On Error GoTo ErrSub
    
    Dim FullPath As String
    
    FullPath = App.Path & "\" & "Temp@Pic1.bmp"
    
    If MsgBox(StrConv(FullPath, vbWide) & vbCrLf & "に保存します。", 36, "画面保存") = 6 Then
        Screen.MousePointer = 11
        Clipboard.Clear
        Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
        DoEvents
        If Clipboard.GetFormat(vbCFBitmap) Then
            PicDB1.Picture1.Picture = LoadPicture()
            Set PicDB1.Picture1.Picture = Clipboard.GetData(vbCFBitmap)
            SavePicture PicDB1.Picture1, FullPath
        End If
        Screen.MousePointer = 0
    End If
    Exit Sub
    
ErrSub:
    Screen.MousePointer = 0
    MsgBox "保存できませんでした。", 16, "画面保存"
    Err.Clear
    Resume Next
    
End Sub

投稿時間:2003/03/30(Sun) 20:57
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^2: 実行画面を(一部コード訂正)
   Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
   キーを押したら
  次の解放の処理を必ずして下さい。(押したままになっています)
   Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP, 0)

   VBでは変数名等にあまり漢字は使わない方がいいかと思います。

投稿中の下記コードに誤りがありました。訂正します。
  誤り
  'スクリーン全体をクリップボードにコピー
    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
  正解
  'スクリーン全体をクリップボードにコピー
    Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP, 0)

  又、ピクチャボックスをかえさずに直接クリップボードから保存できるようです。

    MyFileName = App.Path & "\" & Format$(Now, "yymmddhhmmss") & ".BMP"
    '表示データーをビットマップ形式のデーターで保存
    Set PicData = Clipboard.GetData
    Call SavePicture(PicData, MyFileName)
 

投稿時間:2003/03/31(Mon) 00:18
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^2: 実行画面を・・・(完成しました(^^)
 昔の記憶をたどると、95とNTでは、bScan に設定する値が逆になっていたと記憶しています。
最近のOSは、どうなっているかわかりませんが、自宅のXPでは以下のようになっています。
すべての実行するOSで動作の確認をしておいたほうがいいと思います。

  フルスクリーン
    Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)

  アクティブウィンドウ
    Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP, 0)

 クリップボードを使わない方法も、以下のマイクロソフトの技術情報は画面をピクチャ
ボックスに取り込んで印刷していますが、印刷する代わりにファイルに書き出せばいいと
思います。

http://support.microsoft.com/default.aspx?scid=kb;ja;161299

投稿時間:2003/03/31(Mon) 15:33
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 実行画面を・・・(完成しました(^^)
> すべての実行するOSで動作の確認をしておいたほうがいいと思います。

 VK_SNAPSHOT の動作がOSによって違うとは知りませんでした。
 Shift キーはXPではASCII値・スキャンコード間でコードを変換しないと
 うまく動作しないと言う事は知っていたのですが
 以前から何か変だなとは思っていたのですが、WEBでもそのような事はみかけなかった
 ので、ありがとうございました。これですっきりしました。

投稿時間:2003/03/31(Mon) 21:06
投稿者名:HB
Eメール:
URL :
タイトル:
Re^3: 実行画面を・・・(完成しました(^^)
花ちゃん、Starfishさん、再度のアドバイス有難うございます。
訂正の件、すべてのDOSでのチェックの件、了解です。
また、「PictureBoxに取り込まないで保存する」件、試験してみます。
後日、報告します(^^)

投稿時間:2003/03/31(Mon) 21:43
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^4: 実行画面を・・・(完成しました(^^)
> また、「PictureBoxに取り込まないで保存する」件、試験してみます。
> 後日、報告します(^^)

No.3319 の投稿にUPしなおしておきましたので試して下さい。
MSChartやMSFlexGridの画面等はMSのサンプル(Starfishさんの紹介された)のようにAPIを
使用しないとクリップボードには正しくコピーされないようです。

投稿時間:2003/04/01(Tue) 01:04
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^5: 実行画面を・・・(完成しました(^^)
> MSChartやMSFlexGridの画面等はMSのサンプル(Starfishさんの紹介された)のようにAPIを
> 使用しないとクリップボードには正しくコピーされないようです。

 一部のOCXでは、printformメソッドに対応していないので、printformでは
正常に印刷されません。が、keybd_eventでハードコピーをクリップボードに
コピーしたときは、そういうことはないと思いますが。

投稿時間:2003/04/01(Tue) 01:46
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^6: 実行画面を・・・(完成しました(^^)
フォローありがとうございます。又又トチッテしまったようですね。m(__)m

投稿時間:2003/04/01(Tue) 10:35
投稿者名:HB
Eメール:
URL :
タイトル:
Re^7: 実行画面を・・・(完成しました(^^)
花ちゃん、 Starfishさん、ありがとうございます(^^)

No.3319のアクテブウインドの保存とピクチャーBoxを使わない方法で 再構築しました。
OSはWindowsXPなので、問題なく動作しました(^^♪
ただ、OSの違いによる動作についてはデバッグ環境の問題でチェック出来ていません。
今回は、WindowsXP限定にしましたのでこれで問題ないかと思います。
かさねがさね有難うございましたm(__)m