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>
セットアップ
- 上のスクリプトを適当な名前 (たとえば copy_and_search.wsf) で保存
- 改良版 Dynamic Wrapper (DW957??.ZIP) をダウンロード、解凍して INSTALL.BAT を管理者として実行
- DWClipboard.vbs (下記) を copy_and_search.wsf と同じフォルダに置く*1
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 さんに感謝。