先日のエントリの続きです。残念ながら現状はタイトルのように言わざるを得ません。
jigendaddy.hatenablog.com
まずは固有名詞出力時のコードを見てください。
RegWrite, REG_MULTI_SZ, HKEY_CURRENT_USER, SOFTWARE\Renka, BUF, %Clipboard% IniRead, str , naginata_tmp.ini, kigou, meisi Clipboard := str Gui, Add, Edit ,Multi Gui,Show,Minimize Gui,Cancel Send,^{v} RegRead, buf, HKEY_CURRENT_USER, SOFTWARE\Renka, BUF buf := RegExReplace(buf, "`n$") Clipboard := buf Return
既存のデータをレジストリに保存し固有名詞の出力処理が終わり次第書き戻しています。なぜタイトルのような結論に至ったのか、そして処理に使用しないGUIウィンドウを呼び出している理由を説明します。
前回のエントリにいただいたコメントでiniファイルの文字コードがShift_JISなら書き出し自体は可能であることはわかりました。問題はいかにクリップボードの既存データを保護するかです。AHKwiki(公式)にはこういうコードが記載されています。
ClipSaved := ClipboardAll ;クリップボードの全内容を保存
クリップボード - AutoHotkey Wiki
;クリップボードを経由した処理(例)
Send,^c
Run,http://www.google.co.jp/search?q=%Clipboard%
Clipboard := ClipSaved ;クリップボードの内容を復元
ClipSaved = ;保存用変数に使ったメモリを開放
これをコピペすると正常に機能しませんでした。公式を擁護するわけではありませんが、このコード自体が間違っているわけではありません。選択面の括弧囲みにはこのコードを使わせていただいています。それではなぜ機能しなかったのか。
コードを弄っているうちに処理の途中でMsgboxを入れるとなぜか意図通り機能することが確認できました。ならばスレッドの割り込みが問題に関わっている可能性があります。そこで同一のスレッドからアクセスが制限されているという発想に行き着きました。
この設定に関わらず、実行中のスレッドはダイアログ(MsgBox, InputBox, FileSelectFile, FileSelectFolder) が表示された段階で割り込み可能となる。
Thread - AutoHotkey Wiki
対策としてダミーウィンドウを最小化状態で起動させることで割り込みを発生させ、何もせずそのまま閉じることにしました。当初のスレッドと割り込みから復帰したスレッドが別物であると勘違いを誘う狙いです。アクティブにする必要はありませんので前回のように色を透明にする処理は不要です。
まだ残る問題はレジストリを使用することの是非ですが、ひとまずいいとします。公式のようにdatファイル(≒テキストファイル)を生成すべきかもしれませんがこれはこれで抵抗のあるやり方です。レジストリを使いたくない方は言ってください。また考えます。
追記
よくあることですが、日をまたぐと上のコードが機能しなくなっていました。いただいたコメントを参考にダミーウィンドウを出すタイミングを変更したら動きました。
RegWrite, REG_MULTI_SZ, HKEY_CURRENT_USER, SOFTWARE\Renka, BUF, %Clipboard% IniRead, str , naginata_tmp.ini, kigou, meisi Clipboard := str Send,^{v} Gui, Add, Edit ,Multi Gui,Show,Minimize Gui,Cancel RegRead, buf, HKEY_CURRENT_USER, SOFTWARE\Renka, BUF buf := RegExReplace(buf, "`n$") Clipboard := buf Return
ウィンドウを作る→起動する→閉じるの3行で50ミリ秒以上要している計算です。単にSleepが必要なだけなのかもしれません。もちろんこれもまたすぐ動かなくなる可能性は十分考えられますがひとまずいいとします。