#概要
VBScriptを使って、クリップボードからテキストを取り出したいという話。
結論としては、Clipboard.GetText メソッド (System.Windows.Forms)でクリップボードからテキストを取り出して標準出力に出し、VBScriptでそれを受けるという方法でできたようだ。
- Clipboard.GetText メソッド (System.Windows.Forms) - @MSDN
- maruton's memorandum: [Script][VBS]コマンド実行(WSHShell.Exec)
2017.08.21 追記
vbs + C#と違い、コンソールが一瞬表示されてしまうデメリットはありますが、vbs単独版(内部でpowershell利用)をつくりました。
Set exec = CreateObject("WScript.Shell").Exec("powershell.exe -sta -Command Add-Type -Assembly System.Windows.Forms; [System.Windows.Forms.Clipboard]::GetText()")
exec.StdIn.Close
WScript.Echo exec.StdOut.ReadAll
参考
#他
Hey, Scripting Guy! クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますかに、Internet Explorer(COM)経由でクリップボードからテキストを取得する方法が記載されている。
この方法だと、クリップボードからテキストを取り出す程度のために毎回IEが起動するので重いし、
↓のポップアップが出てしまうので若干おいしくない。
クリップボード→標準出力
コンソールアプリケーションで以下のコードをビルドする。
今回は、ConsoleApplication1.exeというファイルができるようにビルドした。
コンソールアプリでのクリップボードの使用について - 質問・相談ならMSN相談箱に書かれているとおり、[STAThreadAttribute]をMain関数の前に入れないと動かないようだ。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; //参照設定にも追加
namespace ConsoleApplication1
{
class Program
{
[STAThreadAttribute]//←デフォルトでは追加されないので注意
static void Main(string[] args)
{
string str = Clipboard.GetText();
Console.WriteLine(str);
}
}
}
標準出力からの取り出し
ConsoleApplication1.exeと同じフォルダ(パスが通ったフォルダ)に以下のスクリプト(test.vbs)
を作成した。
Dim wsh
Set wsh = CreateObject("WScript.Shell")
Dim exec
Set exec = wsh.Exec("ConsoleApplication1.exe")
str = exec.StdOut.ReadAll
WScript.Echo str
#結果
test.vbsの内容をコピーして、test.vbsをダブルクリックすると、以下のポップアップが表示され、
クリップボードのテキストを取得できていることが確認できた。
#備考
コピーしたものよりも改行が多い気がする(Console.WriteLine等の影響だと思う)が、とりあえずそのままにする。