VBSでクリップボードのデータを抽出する

VBSでコピペしたクリップボードのデータを操作しようと思いました。
ただ調べるとWSHのShellでは、クリップボードを扱う事が出来ないので、
InternetExplorerのClipbordDataオブジェクトを利用します。


ただ1つ注意点があってこのままでは動作しません。

現在のXP SP2+IE6やIE7などの環境ではセキュリティが厳しくなっていて、
どうもこのままのコードでは動作しない。setData()で常にfalseが返ってきて失敗してしまう。
"about:blank"では、インターネットゾーンが適用されるため、
インターネットゾーン設定の「スクリプトによる貼り付け処理の許可」が無効にされている(デフォルト)ので、
clipboardDataは常に失敗になってしまうようだ。

WSHでのクリップボードアクセス - ardarimの日記

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の設定を変えずにはうまくいきませんでした。
またぼちぼち調べて挑戦してみます。