WSH で選択文字列を Google 検索 (改)

SFC mini は落ちるので Dynamic Wrapper を使って書き直した。

<package>
	<job id="search">
		<comment>
			コピーして Web 検索
			引数に "http://www.google.com/search?q=" とかを渡すべし
		</comment>
		<script language="VBScript" src="DWClipboard.vbs"></script>
		<script language="JScript">
			args = WScript.Arguments;
			sh   = WScript.CreateObject("WScript.Shell");
			cb   = Clipboard();
			
			sh.SendKeys("^c");
			WScript.Sleep(100);
			text = cb.Text
			text = text.replace(/^\s+|\s+$/g, "");
			text = text.replace(/\s+/g, " ");
			text = encodeURIComponent(text)
			sh.Run(args(0) + text);
		</script>
	</job>
</package>

セットアップ

  1. 上のスクリプトを適当な名前 (たとえば copy_and_search.wsf) で保存
  2. 改良版 Dynamic Wrapper (DW957??.ZIP) をダウンロード、解凍して INSTALL.BAT を管理者として実行
  3. DWClipboard.vbs (下記) を copy_and_search.wsf と同じフォルダに置く*1

使い方

文字列を選択した状態で次のようなコマンドを実行する。引数はお好きなように。

copy_and_search.wsf "http://www.google.com/search?q="

DWClipboard.vbs

' Dynamic Wrapper を使って WSH でクリップボード操作
' http://d.hatena.ne.jp/Fio/20050920/wsh をクラス化改造したもの

Class DWClipboard
	Private DW
	
	Public Sub Clear()
		hRet = DW.OpenClipboard(0)
		hRet = DW.EmptyClipboard
		hRet = DW.CloseClipboard
	End Sub
	
	Public Property Let Text(sText)
		Const CF_TEXT = 1
		Const GMEM_DDESHARE = &H2000
		If sText = "" Then Exit Property
		hRet = DW.OpenClipboard(0)
		strlen = DW.lstrlen(sText)
		hText = DW.GlobalAlloc(GMEM_DDESHARE, strlen + 1)
		pText = DW.GlobalLock(hText)
		Call DW.lstrcpy(pText, sText)
		Call DW.SetClipboardData(CF_TEXT, hText)
		Call DW.GlobalUnlock(hText)
		hRet = DW.CloseClipboard
	End Property
	
	Public Property Get Text()
		Const CF_TEXT = 1
		hRet = DW.OpenClipboard(0)
		hText = DW.GetClipboardData(CF_TEXT)
		If hText = 0 Then
			sRet = ""
		Else
			pText = DW.GlobalLock(hText)
			sRet = GetString(pText)
			Call DW.GlobalUnlock(hText)
		End If
		hRet = DW.CloseClipboard
		Text = sRet
	End Property
	
	Private Function GetString(TmpAddressOfString)
		TmpI = 0
		TmpString = ""
		Do While True
			TmpCode = DW.Peek(TmpAddressOfString + TmpI)
			If TmpCode = 0 Then
				Exit Do
			ElseIf ((&H81 <= TmpCode) and (TmpCode <= &H9F)) or ((&HE0 <= TmpCode) and (TmpCode <= &HFC)) Then
				TmpI = TmpI + 1
				TmpCode2 = DW.Peek(TmpAddressOfString + TmpI)
				TmpString = TmpString & Chr(TmpCode * 256 + TmpCode2)
			Else
				TmpString = TmpString & Chr(TmpCode)
			End If
			TmpI = TmpI + 1
		Loop
		GetString = TmpString
	End Function
	
	Private Sub Class_Initialize
		Set DW = CreateObject("DynamicWrapper")
		DW.Register "user32", "OpenClipboard", "i=l", "f=s", "r=l"
		DW.Register "user32", "GetClipboardData", "i=l", "f=s", "r=l"
		DW.Register "user32", "SetClipboardData", "i=ll", "f=s", "r=l"
		DW.Register "user32", "EmptyClipboard", "f=s", "r=l"
		DW.Register "user32", "CloseClipboard", "f=s", "r=l"
		DW.Register "kernel32", "GlobalLock", "i=l", "f=s", "r=l"
		DW.Register "kernel32", "GlobalUnlock", "i=l", "f=s", "r=l"
		DW.Register "kernel32", "lstrlen", "i=r", "f=s", "r=l"
		DW.Register "kernel32", "lstrcpy", "i=lr", "f=s", "r=l"
		DW.Register "kernel32", "GlobalAlloc", "i=ll", "r=l"
		DW.Register "kernel32", "GlobalSize", "i=l", "r=l"
		DW.Register "kernel32", "GlobalFree", "i=l", "r=l"
	End Sub
	
	Private Sub Class_Terminate
		Set DW = Nothing
	End Sub
	
End Class

Function Clipboard
	set Clipboard = new DWClipboard
End Function

*1:DWClipboard.vbs は Fio さん作 http://d.hatena.ne.jp/Fio/20050920/wsh を扱いやすいようにクラス化したものです。Fio さんに感謝。