ID:???前に雑記を書いていたサイトが完全に消滅してしまったので、AutoHotkey関連の記事をこちらに再掲載することにする。内容は当時のままなので、現在のAutoHotkeyとは異なっている場合があるかも。■AutoHotkey(http://www.autohotkey.com/)キーボード・マウス・ジョイスティックにいろいろな機能を割り当てるソフト。任意の操作に他の操作を割り当てたり、プログラム起動やウィンドウ操作などを割り当てられる。その他、スクリプトで色々なことができる模様。NT系でしか使えない機能がいくつか有る。ソース公開あり(C++)。スタートメニューに登録されるほか、拡張子「.ahk」に関連付けされる。割り当てられるホットキーは、Windows側で使用されているもの(Win+Rなど)も含めほぼ全て。Windowsのホットキーを無効化することも可能。修飾キーなしの単独キーにも割り当てられる。NT系では、通常キーの組み合わせにも割り当てられる。「Ctrl+Shift」などにも割り当て可能。日本語キーボードには対応していないが、スキャンコードを直接指定できるので変換キーとかも指定可能。入力に反応しつつ、入力はそのままアクティブウィンドウに渡すこともできる。操作に機能を割り当てるほか、タイマーで自動実行されるように設定することも可能。特定のキーストロークに反応して特定の動作をさせることもできる。way」と入力するというスクリプトを記述し、短縮入力みたいなことも実現できる。設定が面倒臭そうだが、なかなか面白そうだ。説明が英語なんで辛いが、色々弄ってみる価値はありそうだ。■AutoHotkey(http://www.autohotkey.com/)を弄ってみたとりあえず、こいつだけでCtrlCapsLockの入れ替えが出来ないか試してみる。AutoHotkeyは管理者権限がなくても使用できるっぽいので、これが出来れば大学のPCで使えたりして便利そうだ。一般キーをCtrlキーにすることは出来たが、何故かLock系のキーではうまく行かない。キーが押されたらCtrlキー押し下げを発生させ、キーが離されるのを待ってCtrlキー押上を発生させているのだが、CapsLockが押されたのを見てCtrl押し下げを発生させると、その後CapsLockが離されてもAutoHotkeyには押されているように見えてしまう。うまく何とかする方法が見つからず、挫折。あと、Ctrlの方はキーリピートが発生しないので、自前でCapsLockをリピートさせる必要が有り面倒。次に、VxEditorでダブルクリックの単語選択の後選択範囲が変えられない問題を改善することを試みる。マウスボタンが押されているかを調べるコマンドがなくて断念。GetKeyStateで取得できた。2ストロークキーくらいならできるだろうと思い、作った。Emacsのキーバインドはこの二つしか知らん。InputChar=sSend,^s}returnそんな感じで、色々と限界があるようだが、とりあえずホットキーに機能を割り当てるツールとしては比較的柔軟性が高くて便利なのではなかろうか。■AutoHotkey(http://www.autohotkey.com/)をもう少し弄ってみたキーボードタイプ時にサウンドを鳴らす~*a::~*b::~*c::;;;;;略~*x::~*y::~*z::SoundPlay,D:\app\System\AutoHotkey\typesound.wavreturn「~」はイベントを取得しつつ、入力はそのままスルーするという指定。「*」は他に修飾キーが押されていても反応するという指定。例のように、ホットキーラベルを並べて書いてその後ろにreturnで終わるルーチンを書くと、複数のホットキーにまとめて一つのルーチンを割り当てられる。tooltips_class32cy-=%th%ToolTip,%Message%,%cx%,%cy%Menu,Tray,NoStandardMenu,Tray,Add,開く(&O),menuDefaultMenu,Tray,Default,開く(&O)returnmenuDefault:MsgBox,aaaExitAppreturnシステムトレイのあたりにツールチップが表示され、トレイアイコンをダブルクリックするとメッセージボックスを出して終了するスクリプト。なんかを通知したいときにでも使えるかも。MsgBox,aaaの部分にRunでプログラムを起動するコマンドを書くとか。classnameとするとウィンドウクラスがclassnameのウィンドウを指定できる。「A」とするとアクティブウィンドウ。自前メニュー作製とかツールチップウィンドウ表示とか、結構いろいろなことができる。このソフトでやることでも無いような気がする。一つのソフトにまとめられた方が便利ではあるが。■AutoHotkey(http://www.autohotkey.com/)日本語ドキュメント勝手に公式サイトのドキュメントを落としてきて改造して作ってみた。ホットキー割り当てやスクリプトの解説などを書いた。元のドキュメントを参考に、色々と付け足したり削ったりして、HTMLの見易さも改善した。コマンドの解説はまだ途中。DMonkey布教ページ(http://lukewarm.s41.xrea.com/)の方もこのくらい頑張りたいところ。マウスボタンが押されているかはGetKeyStateで取得するんだった。■WinTabMod(http://www12.plala.or.jp/yoshi223/WinTabMod/index.html)Explorerシェルには、Win+Tabを押すとタスクバーのボタンに順にフォーカスが移り、Enterを押すことでそのウィンドウをアクティブにできるというよくわからん機能が存在する。WinTab一回で右隣や左隣をアクティブに出来れば便利なのに、何故かそうではない。WinTabModを使うと、このとなりのタスクボタンをアクティブにするという機能が実現できる。非常駐で、ランチャなどから実行して使う。引数付きで起動すると前のボタンが選択される。AutoHotkey(http://www.autohotkey.com/)にでも登録して使うと便利かと思ったが、Windows2000専用だった。2kとXPではタスクバーの構造が違うんだそうだ。TClockのサイトの記事(http://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html)によると、タスクバーの構造はしょっちゅう変わっているらしい。AutoHotkeyで同じようなことが出来ないかやってみる。XPのタスクボタンはツールバーで出来ているようだ。ウィンドウメッセージのTB_系のメッセージでツールバーを色々と操作できる。TB_BUTTONCOUNTでボタンの数が、TB_ISBUTTONCHECKEDで選択状態かが取得できる。TB_ISBUTTONCHECKEDの引数に指定するのがボタン番号じゃなくてコマンド番号になっている。TB_COMMANDTOINDEXでコマンド番号からボタン番号を取得できるが、逆はない。TB_GETBUTTONでTBBUTTON構造体を取得してコマンド番号を得られるが、AutoHotkeyは構造体を扱うような複雑なメッセージ処理は出来ない。仕方ないので、コマンドIDを一つずつ見ながら、TB_COMMANDTOINDEXでボタン番号を取得することにする。TB_BUTTONCOUNTで得る値は実際に表示されているボタンの数の2倍になっており、ウィンドウごとに2つのボタンが割り当てられている。最初にウィンドウが表示されると、コマンドID0と1、ボタンID0,1に割り当てられ、以降順次割り当てられていき、ウィンドウが閉じられると、対応するコマンドIDは欠番になり、新たなウィンドウは一番小さい空いているIDのところに割り当てられるようだ。TB_BUTTONCOUNT、TB_COMMANDTOINDEX、TB_ISBUTTONCHECKEDで選択されているボタン番号を取得できるようになった。あとは、Win+Tabを必要な回数押してEnterを押すキーストロークを発生させれば、ウィンドウ切替が実現できる。思ったら、時々キー操作がうまく届いていなくて、アクティブウィンドウにEnterが送られて予期せぬ動作をすることがある。そこで、タスクバーに直接キー操作を送ることに。タスクバーにフォーカスをあわせて左右矢印1回押せば左右のボタンにフォーカスが行くことに気付いた。これなら、メッセージのやり取りとかなしにウィンドウが切り替えられてしまう。今までの苦労はなんだったのか。Shell_TrayWndreturn修飾キーつきのホットキーだとうまく動作しない。修飾キーを離す動作を加えてやる必要がある。■AutoHotkey(http://www.autohotkey.com/)用マウスジェスチャスクリプトmousegesture.zip(http://hp.vector.co.jp/authors/VA026691/mousegesture.zip)適当に作ってみた。右クリックをしながら、マウスを動かすか、左・中央ボタンを押すと動作する。普通に右クリックすれば右クリックになるし、タイムアウトのようなものも設定したから、右D&Dも使用できる。StrokeItと比べると微妙にジェスチャの認識具合が違うが、大体うまいこと認識する。困ったことに、マウスホイールのジェスチャが使えない。GetKeyStateではホイールの状態が取得できないからだ。WheelUpのようなホットキーを登録すればいいのだが、これをやるとRButtonのホットキーが右ボタンを離したときに発動するようになってしまう。ことジェスチャはタイマーで動かすか。マウス移動以外のジェスチャはボタン単独でホットキーにして、右ボタンが押されていなければ通常の動作、押されていればジェスチャ発動ということにした。その他色々直して、ジェスチャ実行後に右ボタンを離したときの動作とかを改善した。AutoHotkeyのメニューが表示されていると、ホットキーイベントが潰されてしまい、マウス操作が効かなくなってしまう。スクリプトでメニューを出す場合、ホットキーを無効化してやればいいが、タスクトレイメニューはそうは行かない。タスクトレイ右クリック時に実行されるサブルーチンを指定できればよいのだが。■AutoHotkey(http://www.autohotkey.com/)用マウスジェスチャスクリプトmousegesture.zip(http://hp.vector.co.jp/authors/VA026691/mousegesture.zip)微妙に改良。1行書き足すだけで除外ウィンドウなどを追加できるようにした。タイムアウトの仕組みを変更。今までは、右ボタン押し下げから一定時間で無条件にタイムアウトにしていたが、一定時間マウスの移動が閾値以下だったらタイムアウトになるようにした。これで、比較的ゆっくりな入力も認識できる。StorkeItで使っていた機能を追加してみたところ、今まで外部スクリプトを呼び出して実現していた動作がこのスクリプト内で完結できるようになってすっきりした。AutoHotkeyのメニューやダイアログが表示されている間、マウスフックのホットキーが動作しなくなってしまう問題は未解決。ジェスチャ開始時にホットキーを有効にして、終了時に無効にする方法を試してみたが、一部ウィンドウで何故か右クリックメニューが表示されてしまう。一瞬右ボタンのフックが外れて右ボタン押し下げ状態が発生してしまうとかが原因のような気がする。右ボタンを押しながら左ボタンを押すジェスチャのために、左クリックをフックしているのだが、ペイントソフトなどでドラッグ開始時に明らかな引っ掛かりを感じる。前述の右クリックが誤動作する問題がなければ、ジェスチャ中だけホットキーを有効にすることで回避できるのだが。■AutoHotkey(http://www.autohotkey.com/)用Ctrlの2連打でプログラムを起動まめFile4α版の掲示板でで出たので作ってみた。A_TickCountとりあえず2連打のみ。3連打になるともう少し面倒になる。2連打と3連打を両方使えるようにするのは更に面倒。2連打の後に一定時間以内の3度目が押されるかどうか待機してみて、押されたかどうかで動作を分岐しなきゃならない。個人的には、ホットキーは欲しいけど、フックが必要なものは外部ツール任せでいいんじゃないかと思う。あと、ドロップオープンの拡張子カスタマイズはそういえば欲しかったな。■AutoHotkey1.0.17(http://www.autohotkey.com/)キーボードやマウスやジョイパッドのボタンにいろいろな機能を割り当てられて、スクリプトを駆使すれば様々な常駐ユーティリティの機能をこれ一つでどうにか出来そうなツールがバージョンアップした模様。エディットコントロールのキャレット位置を変数として取得できるようになったらしい。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)作ったAutoHotkeyは割りと新しいソフトで、日本での知名度はほとんどなく、日本語の解説サイトが無いので、作ってみることに。以前作った日本語解説をアップロード。ホットキー割り当てやスクリプトの説明のあたりは大体日本語化してある。xreaの新しいアカウントを取ろうと思ったが、すでに満員だったので、仕方なく布教ページのアカウントに同居。アクセス少ないサイトだし、ソフトの布教サイトは全部ここにまとめてしまおうかな。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新Hotstring(http://lukewarm.s41.xrea.com/AutoHotkey/Hotstrings.htm)の日本語解説を書いた。この機能を使えば、特定の文字列がタイプされたときに別の文字列に置換される略称入力のようなことが簡単に実現できる。日本語の文章を書いている分にはあまり役に立たないが、プログラミングの入力省力化に使えるかもしれない。Delphiには、略称を入力するとif..else..などよく使う構造を入力して次に入力するべき位置にカーソルを移動してくれる機能が有ったような気がする。入門者向けチュートリアルっぽい物を書こうと思ったが、途中で飽きた。適当にでっち上げた矢印キー割り当て設定が意外と便利だったが、もともと矢印キーが近いキーボードなんで意味なし。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新コマンドの解説を少しずつ日本語化する。一覧の説明を合わせて修正するのが面倒なので、DMonkeyスクリプトでコマンドごとのページからコマンド名とコマンド概要を抽出してHTML化出来るようにした。あとでジャンル別インデックスの生成も出来るようにしておこう。nnnnn}」という形式で指定すると入力できることを知った。そこで、Shift_JISの文字列をSendコマンドで入力できる形式に変換するスクリプトを書いてみた。簡単な顔文字程度ならうまく行ったが、少し長いテキストを入力しようとしたらやたらと崩れる。普通にクリップボード経由で貼りつけた方がよさそうだ。この機能は、Altキーを押しながらテンキーで数値を入力することでそのコードの文字を入力できるというWindowsの仕様を利用しているらしい。そんな機能が有るとは。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新コマンド一覧生成スクリプトを改良して、カテゴリ別一覧を作成した。フレームで左右に分けたページも作ってみた。If系コマンドのあたりの日本語解説を書いた。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)コマンド説明の日本語化を行う。Menuの説明がやたらあって苦しんだが、何とか片付けた。残る大物はProgressくらいだが、小物コマンドが大量にあるので先は長い。■窓コン(http://member.nifty.ne.jp/hayazo/)特定のウィンドウに対して、閉じるなどの操作を行ったり、ウィンドウメッセージを送信したりできるツール。なにやらWM_COMMANDで使うコマンドIDを調べる機能がついている。AutoHotkeyのヘルプにはWinspectorSpy(http://www.windows-spy.com/)というツールで調べる方法が書いてあったが、少しややこしい。窓コンでは、起動して「作成」ボタンを押し、「新規作成」ウィンドウで「取り込み」ボタンを押し、調べたいウィンドウで調べたいコマンドの操作を実行するだけでコマンドIDが表示されるのでとても簡単。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新ダイアログなどのウィンドウを表示するコマンドの説明を書いた。Progressコマンドの説明がやたら長くて大変だった。WM_COMMANDで使うコマンドIDを調べる方法を書いた。Hacker(http://www.users.on.net/johnson/resourcehacker/)で実行ファイルのリソースを調べる方法とか、AutoHotkeyのスクリプトを使う方法とかを用意したが、窓コンで調べた方が楽そうだ。■AutoHotkey(http://www.autohotkey.com/)1.0.18かなり頻繁に更新されているようだ。Gesture(http://lukewarm.s41.xrea.com/AutoHotkey/myscripts/#mousegesture)スクリプトでAutoHotkeyのメニューが操作できなくなる問題が直った。メインウィンドウのタイトルバーを操作するとおかしくなる。マウスフックが有効になっているだけで常にペイントソフトなどで引っかかるようになった気がする。・Process特定の実行ファイルのプロセスが存在するかをチェックしたり、起動するのを待ったり、終了したり、プライオリティを変更したりできるコマンドが追加プロセスを操作できるようになったのは面白い。機能ごとに別のコマンドにせずProcessコマンドのサブコマンドになっているのか。下のほうの簡単なコマンドの説明を書いただけ。なんか190近くあって気が遠くなる。掲示板の書き込み権限とスレたて権限を間違えて設定していたことに気付いた。通りで書き込みがまったく無いわけだ。直しても無いだろうが。機能のバージョンアップで追加されたコマンドの説明ページを用意しつつ日本語化。Processコマンドの説明を見たところ、Runコマンドで起動したプロセスのPIDを取得したり、WinGetコマンドで任意のウィンドウの親プロセスのPIDを取得したりできるらしい。これを利用すれば、アクティブなウィンドウのプロセスの優先度を変更したりとか、色々と使い道が広がりそうだ。■AutoHotkey(http://www.autohotkey.com/)用タスクバーのIMEツールバーを消すMSIME2002のツールバーはひたすら邪魔臭い。IMEWatcherがあればほとんどの機能は代替できる。WindowsXPのSP1では、なぜかツールバーを完全に消すことが出来ない。詳細なテキストサービスをOFFにすればIMEWatcherの機能で消すことが可能だが、これをやると何故かTClockのタスクバーフラット化が効かなくなってしまう。そこで、自力でIMEツールバーのウィンドウを消すことにする。今までは、適当にツールをでっち上げて使っていたのだが、AutoHotkeyでもできそうだと思いやってみたら出来た。Shell_TrayWndこいつをスクリプトの上のほうに書いてスタートアップに登録。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)、おすすめ外部ツール(http://lukewarm.s41.xrea.com/AutoHotkey/tools.htm)のページ作成CraftLaunchのサイト(http://hp.vector.co.jp/authors/VA012411/)でキー操作変換ツールが公開されてたので見に行ったら、コマンドラインから送られたファイルをウィンドウにドロップするツールがあることに気付いた。対象ウィンドウはリスト画面が出て選択するほか、コマンドラインから指定することもできる。AutoHotkeyでもうまい具合に使えた。そんなわけで、AutoHotkeyから呼び出して使うと便利そうなツールを紹介するページを作った。他に何を載せるかは未定。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新ウィンドウ関連コマンドの日本語説明を書いた。数は多かったが、引き数の説明が使いまわせたため割と楽だった。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新ウィンドウグループコマンドの説明を書いた。機能自体が意味不明で困った。GroupCloseが前に実行したコマンドによって動作が変わったりする。Announcements(http://www.autohotkey.com/forum/viewforum.php?f=6)α版とβ版が公開されてる。β版らしきPre-1.0.19Changesでは、Runコマンドで起動失敗ダイアログを抑制する機能などが追加される。α版では、なにやら柔軟なGUIを表示できるようになるらしい。説明を書くのが面倒そうだ。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新ファイル関連コマンドの説明を日本語化。ウィンドウ関連と同じくらい多かったが、同じくらい使い回しが効いたので何とか終わった。後、キーボード関係とかも片付けた。これで少なくとも半分は終わったような気がする。■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新いろいろとコマンドの説明を日本語化。その他」「設定」の一部だけだ。なんかEnvUpdateが動作しない。SetEnvironmentVariableでプロセス固有の環境変数を変更しているのに、WM_SETTINGCHANGEで反映させることはできないような気がする。そもそも環境変数を反映させることができてもあんまりうれしくない。WM_SETTINGCHANGEをブロードキャストしてほかのレジストリ設定を反映させるようなコマンドが欲しいところだ。数値計算関係コマンドの説明を日本語化。