クリップボード経由でデータをどうにかする関数

選択文字列内容を拾ってどうにかしたり、任意のウィンドウに文字列をセットしたり、とスクリプト内でクリップボードを利用する機会は結構多いわけですが。そのたびに待避やらリストアやらのコード書くのがかったるくなってきたのでまとめ関数作ってみました。
最初は待避とリストア、それぞれ別関数にしようかと思ったんだけど面倒なのでもう全部コミで。
実行モードはビット単位でフェーズチェックしており、必要なフェーズだけ指定実行できるようになってます。
一度に複数ビット指定可能なので 待避〜リストアまで全部一括ってのでも問題ないです。

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
}