□技術メモ - VBS - クリップボードの画像をファイルに出力する ※管理人の個人的な技術メモです。このページの内容を実行した結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○PrintScreen についてまとめ ・PrintScreenキーに関連したショートカットには主に以下がある。 PrintScreen スクリーンショット(フルスクリーン)を取得する。 Alt + PrintScreen スクリーンショット(アクティブウィンドウ)を取得する。 Window + PrintScreen スクリーンショット(フルスクリーン)を取得して、png形式で保存する。 ・スクリーンショット(アクティブウィンドウ)を取得して、任意の形式のファイル名で保存するショートカットがあればいいのだが、 現状ではないので(2018.08.20現在)、これをthin環境で実現する方法について考察する。 -------- 〇VBS, JS について ・Win10では、VisualBasic, JScript いずれもランタイム等をインストールをすることなく実行できる。他にもインストール不要な言語はあるらしい。 ・VB6 は、以前は .exe ファイルを実行するのにランタイムのインストールが必要だったが、WinXP 以降は不要になった。 ・JScriptがインストール不要になったのは、1996年にIE3に搭載されてかららしい。 ・VbScriptを実行するには、TEXT形式のファイルの拡張子を .vbs として、これを実行すればよい。 JScriptの場合は拡張子を .js として、これを実行すればよい。 -------- ○IEの設定、およびTypeName関数について ・vbsでは直接clipboardを扱う方法がないらしいので、IEオブジェクトを経由してclipboardを扱う必要がある。 IEではセキュリティの関係上、スクリプトによる貼り付けについて機能を制限しているがこれを許可する必要がある。 インターネットオプション→セキュリティ→カスタマイズ から スクリプトによる貼り付けを許可する。 ・オブジェクトの型を確認するには、TypeName関数を使用する。 -------- 〇クリップボードから文字列を取得する MsgBox("クリップボードから文字列を取得します") Dim objHTML Dim clipText Set objHTML = CreateObject("htmlfile") clipText = Trim(objHTML.ParentWindow.ClipboardData.GetData("text")) MsgBox(clipText) -------- 〇クリップボードに文字列をセットする MsgBox("クリップボードに文字列をセットします") Dim objIE Dim objDoc Dim objWindow Dim objClip Dim objText Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate("about:blank") Set objDoc = objIE.Document Set objWindow = objDoc.ParentWindow Set objClip = objWindow.ClipBoardData ''Set objClip = objIE.Document.ParentWindow.ClipBoardData ''これでも良い ''objClip.ClearData ''不要と思われる objClip.SetData "text", "こんにちは" MsgBox("型:" & TypeName(objClip)) -------- 〇HTMLDataTransferについて (調査中) ・上記のコードで表示される objClip の型ですが、 わからないことが多いです。 -------- 〇クリップボードの画像をファイルに出力する(MSペイントにsendKeyする方法) ・MSペイントでテンプレートファイルを開き、sendKeyすることでファイル出力することができる。 本当は直接ファイル出力したいが、とりあえずこの方法について確認する。 ・vbsでビットマップのテンプレートを生成する (サンプル) ・vbsでMSペイントにsendkeyしてファイル出力する (サンプル) -------- 〇クリップボードの画像をファイルに出力する(VB6から変換する場合) ・Webサイトなどを見る限り、クリップボードの画像をファイルに直接出力するのは難しいように思えるが、 vbs以外で出力可能な言語はあるかどうか思い出してみると、VB6で該当するコードがあることに気が付く。 そこで、VB6 → VB.net というコード変換を行い、参考になるコードがあるか調べてみる。 ・VB6→VB.net の変換は、VB2008までに同梱されていた VBUpgrade.exe を使えばよい。 書式は以下の通り。VB6 のプロジェクト prj1.vbp が変換されて C:\VB2\prj1 に出力される。 VBUpgrade.exe C:\VB1\prj1\prj1.vbp /Out C:\VB2\prj1 ''==================== ''VB6のコード ''==================== ''----> Attribute VB_Name = "Module1" Option Explicit Public Sub putImage() Dim strDate As String Dim strPath As String Dim picData As Picture '----時刻 strDate = Format(Now, "YYYYMMDD_HHMMSS") '----パス strPath = App.Path strPath = strPath & "/" & strDate & ".bmp" '----出力 If Clipboard.GetFormat(vbCFBitmap) Then Set picData = Clipboard.GetData Call SavePicture(picData, strPath) End If End Sub ''<---- ''VBUpgrade.exe で変換すると以下の通り。 ''==================== ''VB.net のコード ''==================== ''----> Option Strict Off Option Explicit On Module Module1 Public Sub putImage() Dim strDate As String Dim strPath As String Dim picData As System.Drawing.Image '----時刻 strDate = VB6.Format(Now, "YYYYMMDD_HHMMSS") '----パス strPath = My.Application.Info.DirectoryPath strPath = strPath & "/" & strDate & ".bmp" '----出力 If My.Computer.Clipboard.ContainsImage() Then picData = My.Computer.Clipboard.GetImage() 'UPGRADE_WARNING: SavePicture は、System.Drawing.Image.Save にアップグレードされ、新しい動作が指定されました。 '詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"' 'をクリックしてください。 Call picData.Save(strPath) End If End Sub End Module ''<---- -------- 〇JScriptによるClipBoardの処理 (調査中)