クリップボード経由でデータをどうにかする関数
選択文字列内容を拾ってどうにかしたり、任意のウィンドウに文字列をセットしたり、とスクリプト内でクリップボードを利用する機会は結構多いわけですが。そのたびに待避やらリストアやらのコード書くのがかったるくなってきたのでまとめ関数作ってみました。
最初は待避とリストア、それぞれ別関数にしようかと思ったんだけど面倒なのでもう全部コミで。
実行モードはビット単位でフェーズチェックしており、必要なフェーズだけ指定実行できるようになってます。
一度に複数ビット指定可能なので 待避〜リストアまで全部一括ってのでも問題ないです。
OmitCrLfはExcelのセルデータから文字取得したい時に使うといいかも。
セルデータの末尾に必ずついてくるCRLFがウザイのでオプションにしてみた。
- ClipUty(mode, pastedata="", OmitCrLf=0, SelectAll=0, SecToWait=0.5)
- クリップボード経由でデータ取得したり貼り付けたりする関数
#c:: ;サンプル1: 選択文字列取得テスト getdata := ClipUty(0x0b) msgbox, 取得文字列=%getdata% クリップボード=%Clipboard% return #p:: ;サンプル2: 指定データ貼り付けテスト pstdata := "貼り付けテスト" ClipUty(0x0d,pstdata) msgbox, 貼付け文字列=%pstdata% クリップボード=%Clipboard% return #g:: ;==== サンプル3: 選択文字列をGoogleで検索 === SerchData := "http://www.google.com/search?num=50&hl=ja&ie=Shift_JIS&oe=Shift_JIS&q=" ;-- クリップボード履歴ソフト常駐チェック --- DetectHiddenWindows, On Winget,cToolPID, PID, ahk_class tooltips_class32 if (cToolPID != "") { WinGet,p,ProcessName,ahk_pid %cToolPID% if (p != "Charu3.exe") && (p != "tmc.exe") ;Charu3 or TomoClip cToolPID = } if (cToolPID = "") Winget,cToolPID, PID, ahk_class CLCLTooltip ;CLCL if (cToolPID = "") Winget,cToolPID, PID, ahk_class TfrmAbout ;ClipOut2000 if (cToolPID = "") Winget,cToolPID, PID, ahk_class CLISM if (cToolPID = "") Winget,cToolPID, PID, ArtTips if (cToolPID = "") Winget,cToolPID, PID, クイックスマイリー2 if (cToolPID = "") Winget,cToolPID, PID, ToClip for Windows ;クリップボード履歴ソフトがいない時は自力で退避しとく if (cToolPID = "") ClipUty(0x01) ;--- 検索文字列取得 --- SerchData := SerchData . ClipUty(0x02,"",1) ;コピー ;--- ブラウザでサーチ --- IfWinExist, ahk_class WTL:Donut { ;(Un)Donut起動中はDonutのアドレス欄へ貼付け ;※本当はこんな面倒なことせんでも Run,donut.exe %SerchData% とかでOK WinActivate ControlFocus , Edit2 ClipUty(0x04,SerchData) ;ペースト Send,{Enter} } else ; Dounut 非起動中はIE起動してサーチする。 Run,IEXPLORE.EXE %SerchData% ;--- クリップ履歴ソフトがいない時はクリップボード内容をリストアしとく --- if (cToolPID = "") ClipUty(0x08) return ClipUty(mode, pastedata="", OmitCrLf=0, SelectAll=0, SecToWait=0.3) ;----------------------------------------------------------------------- ; クリップボード経由でデータ取得したり貼り付けたりする関数 ; 対象: AHK v1.0.34以降 2005.09.22 ; ; in mode ビットの論理和 ; 例) 選択内容取得 0x0B (退避 -> コピー -> リストア) ; データ貼り付け 0x0D (退避 -> ペースト -> リストア) ; bit0(1) : クリップボード内容退避 ; bit1(2) : コピー ; bit2(4) : ペースト ; bit3(8) : クリップボードリストア ; (mode 0x04 ペースト用) ; pastedata ペーストデータ ; (mode 0x02 コピー用) ; OmitCrLf 1:LFおよび行末CRを自動除去 ; SelectAll 1:全てのクリップボードデータ取得 0:テキストのみ ; SecToWait ClipWaitのタイムアウト時間 ; ; 戻り値 コピーで取得したデータ(テキストのみ)(mode 0x02用) ;------------------------------------------------------------------------- { static clipsave ;--- クリップボード内容退避 --- if (mode & 0x01) { ;クリップボード内容がEXCELデータ時はテキストだけ保存 (Excelハング対策) hWnd := DllCall("GetClipboardOwner",Int) h := A_DetectHiddenWindows DetectHiddenWindows, On WinGet,ClipOwner,ProcessName,ahk_id %hWnd% ifNotEqual,h,ON, DetectHiddenWindows,%h% ifEqual ClipOwner,EXCEL.EXE, SetEnv,clipsave,%Clipboard% else SetEnv,clipsave,%ClipboardALL% } ;--- クリップボードに選択内容を取得 --- if (mode & 0x02) { Clipboard = Send,^c ClipWait, %SecToWait% err := ErrorLevel ifEqual,SelectAll,1, SetEnv,result,%ClipboardALL% else SetEnv,result,%Clipboard% if (!SelectAll) && (OmitCrLf) { StringReplace, result, result, `r,, All ;LF除去 StringRight,l,result,1 ifEqual,l,`n, StringTrimRight,result,result,1 ;末尾CR除去 } } ;--- 指定データ貼り付け --- if (mode & 0x04) { Clipboard := pastedata Send,^v Sleep,200 ;ちょっと待つ } ;--- クリップボードへ待避内容リストア --- if (clipsave != "") && ( (mode & 0x08) || (mode & 0x02 && err=1) ) { Clipboard := clipsave clipsave = } return result }