VBSでクリップボードのデータを抽出する
VBSでコピペしたクリップボードのデータを操作しようと思いました。
ただ調べるとWSHのShellでは、クリップボードを扱う事が出来ないので、
InternetExplorerのClipbordDataオブジェクトを利用します。
ただ1つ注意点があってこのままでは動作しません。
現在のXP SP2+IE6やIE7などの環境ではセキュリティが厳しくなっていて、
どうもこのままのコードでは動作しない。setData()で常にfalseが返ってきて失敗してしまう。
"about:blank"では、インターネットゾーンが適用されるため、
インターネットゾーン設定の「スクリプトによる貼り付け処理の許可」が無効にされている(デフォルト)ので、
clipboardDataは常に失敗になってしまうようだ。
SP3+IE6でももちろん駄目でした。
そこでまず下記の設定をします。
IEを立ち上げて「ツール」⇒ 「インターネットオプション」⇒ 「セキュリティ」⇒
「インターネットのレベルのカスタマイズ」を選択して「スクリプトによる貼り付け処理の許可」の設定を有効にします。
その設定をした上で下記のように実装するとクリップボードのデータを扱う事が出来ます。
コピペした内容をテキストに出力して、デスクトップに作成します。
Option Explicit Dim clipBoard ' クリップボード Dim savePath ' 保存先パス Dim saveFileName ' 保存対象ファイル Dim newFile ' 新規ファイル Dim objFso ' ファイルシステムオブジェクト Dim objShell ' シェルオブジェクト Dim objIe ' objIeオブジェクト(IE6) Dim data ' クリップボードのデータ Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") Set objIe = WScript.CreateObject("InternetExplorer.Application") ' 空白ページを開く objIe.Navigate "about:blank" ' クリップボードにある内容を取得 Set clipBoard =objIe.Document.ParentWindow.ClipboardData data = clipBoard.getData("text") ' 保存先(デスクトップ) savePath = objShell.SpecialFolders("Desktop") & "\" saveFileName = "copyData.txt" ' 前回分のファイルを削除 If objFso.FileExists(savePath & saveFileName) Then objFso.DeleteFile savePath & saveFileName End If Set newFile = objFso.OpenTextFile(savePath & saveFileName, 8, True) newFile.WriteLine Time newFile.WriteBlankLines(1) newFile.WriteLine data newFile.Close Set objIe = Nothing Set objFso = Nothing Set objShell = Nothing MsgBox "完了"
さらに調べていたらこちらの方が
「InternetExplorer.Application」を使わずにクリップボードの内容を取得されていました。
オブジェクトに"HtmlFile"なるものがあるのを、検索してたまたま見付けた。
よくわからんが、htmlファイルを仮想的?に作成するっぽい。
それをIEオブジェクトの代わりに使ったらクリップボードの内容を取得できた。
こっちの方がIEを使うより軽くて早い気がする。
InternetExplorer.Applicationを使わずにクリップボードの内容を取得 - Domo-Domo
という事で「HtmlFile」バージョンです。
ただこの実装方法でもIEの設定は変えてやらないと実行できませんでした。
Option Explicit Dim objHtml ' HTMLファイルオブジェクト Dim clipBoard ' クリップボードのデータ Dim savePath ' 保存先パス Dim saveFileName ' 保存対象ファイル Dim newFile ' 新規ファイル Dim objFso ' ファイルシステムオブジェクト Dim objShell ' シェルオブジェクト Set objHtml = CreateObject("htmlfile") Set objShell = CreateObject("WScript.Shell") Set objFso = CreateObject("Scripting.FileSystemObject") ' クリップボードにある内容を取得 clipBoard = objHtml.ParentWindow.ClipboardData.getData("text") ' 保存先(デスクトップ) savePath = objShell.SpecialFolders("Desktop") & "\" saveFileName = "copyData.txt" ' 前回分のファイルを削除 If objFso.FileExists(savePath & saveFileName) Then objFso.DeleteFile savePath & saveFileName End If Set newFile = objFso.OpenTextFile(savePath & saveFileName, 8, True) newFile.WriteLine Time newFile.WriteBlankLines(1) newFile.WriteLine clipBoard newFile.Close Set objFso = Nothing Set objShell = Nothing Set objHtml = Nothing MsgBox "完了"
WSHでのクリップボードアクセス - ardarimの日記さんの同エントリ内で
execWBはホストIEを直接操作するので、表示中のページのゾーン設定の影響を受けない。
とあったので色々試行錯誤してみたのですが、IEの設定を変えずにはうまくいきませんでした。
またぼちぼち調べて挑戦してみます。