XREA.COM Logo XREA.COM Ad

旧雑記サルベージ

1管理人 ★:06/09/06 16:57 ID:???
前に雑記を書いていたサイトが完全に消滅してしまったので、AutoHotkey関連の記事をこちらに再掲載することにする。
内容は当時のままなので、現在のAutoHotkeyとは異なっている場合があるかも。
2unnamed.ahk:06/09/06 16:58 ID:???
2004年07月03日
■AutoHotkey(http://www.autohotkey.com/)

キーボード・マウス・ジョイスティックにいろいろな機能を割り当てるソフト。
任意の操作に他の操作を割り当てたり、プログラム起動やウィンドウ操作などを割り当てられる。
その他、スクリプトで色々なことができる模様。
NT系でしか使えない機能がいくつか有る。
英語。ソース公開あり(C++)。
インストーラー付き。スタートメニューに登録されるほか、拡張子「.ahk」に関連付けされる。

割り当てられるホットキーは、Windows側で使用されているもの(Win+Rなど)も含めほぼ全て。
Windowsのホットキーを無効化することも可能。
修飾キーなしの単独キーにも割り当てられる。
NT系では、通常キーの組み合わせにも割り当てられる。「Ctrl+Shift」などにも割り当て可能。
日本語キーボードには対応していないが、スキャンコードを直接指定できるので変換キーとかも指定可能。
入力に反応しつつ、入力はそのままアクティブウィンドウに渡すこともできる。
操作に機能を割り当てるほか、タイマーで自動実行されるように設定することも可能。

特定のキーストロークに反応して特定の動作をさせることもできる。
例えば、単独の「[」をホットキーにして、直後の入力が「btw」だったらBackspace*4で「[btw」を削除したあと「by the way」と入力するというスクリプトを記述し、短縮入力みたいなことも実現できる。
設定が面倒臭そうだが、なかなか面白そうだ。

説明が英語なんで辛いが、色々弄ってみる価値はありそうだ。
3管理人 ★:06/09/06 17:00 ID:???
2004年07月06日
■AutoHotkey(http://www.autohotkey.com/)を弄ってみた

とりあえず、こいつだけでCtrlCapsLockの入れ替えが出来ないか試してみる。
AutoHotkeyは管理者権限がなくても使用できるっぽいので、これが出来れば大学のPCで使えたりして便利そうだ。
とりあえず、一般キーをCtrlキーにすることは出来たが、何故かLock系のキーではうまく行かない。
キーが押されたらCtrlキー押し下げを発生させ、キーが離されるのを待ってCtrlキー押上を発生させているのだが、CapsLockが押されたのを見てCtrl押し下げを発生させると、その後CapsLockが離されてもAutoHotkeyには押されているように見えてしまう。
うまく何とかする方法が見つからず、挫折。
あと、Ctrlの方はキーリピートが発生しないので、自前でCapsLockをリピートさせる必要が有り面倒。

次に、VxEditorでダブルクリックの単語選択の後選択範囲が変えられない問題を改善することを試みる。
マウスボタンが押されているかを調べるコマンドがなくて断念。何故だ。
GetKeyStateで取得できた。

2ストロークキーくらいならできるだろうと思い、作った。
Emacsのキーバインドはこの二つしか知らん。
^c::
    Input,InputChar,C I L1 T2,{Esc},x,s
    if ErrorLevel=Match
    {
        if InputChar=x
            Send,!{F4}
        if InputChar=s
            Send,^s
    }
    return


そんな感じで、色々と限界があるようだが、とりあえずホットキーに機能を割り当てるツールとしては比較的柔軟性が高くて便利なのではなかろうか。
4管理人 ★:06/09/06 17:01 ID:???
2004年07月10日
■AutoHotkey(http://www.autohotkey.com/)をもう少し弄ってみた

キーボードタイプ時にサウンドを鳴らす
~*a::
~*b::
~*c::
;;;;;略
~*x::
~*y::
~*z::
SoundPlay,D:\app\System\AutoHotkey\typesound.wav
return
「~」はイベントを取得しつつ、入力はそのままスルーするという指定。
「*」は他に修飾キーが押されていても反応するという指定。
例のように、ホットキーラベルを並べて書いてその後ろにreturnで終わるルーチンを書くと、複数のホットキーにまとめて一つのルーチンを割り当てられる。

#Persistent

Message=メッセージ
WinGetPos,wx,wy,ww,wh,ahk_class Shell_TrayWnd
ControlGetPos,cx,cy,,,TrayNotifyWnd1,ahk_class Shell_TrayWnd
cx+=%wx%
cy+=%wy%
CoordMode,ToolTip,Screen
ToolTip,%Message%,%cx%,%cy%
WinGetPos,tx,ty,tw,th,ahk_class tooltips_class32
cy-=%th%
ToolTip,%Message%,%cx%,%cy%

Menu,Tray,NoStandard
Menu,Tray,Add,開く(&O),menuDefault
Menu,Tray,Default,開く(&O)
return

menuDefault:
MsgBox,aaa
ExitApp
return
システムトレイのあたりにツールチップが表示され、トレイアイコンをダブルクリックするとメッセージボックスを出して終了するスクリプト。
なんかを通知したいときにでも使えるかも。
MsgBox,aaaの部分にRunでプログラムを起動するコマンドを書くとか。

ウィンドウ系のコマンドでWinTitleとなっているところは、ahk_class classnameとするとウィンドウクラスがclassnameのウィンドウを指定できる。
「A」とするとアクティブウィンドウ。


自前メニュー作製とかツールチップウィンドウ表示とか、結構いろいろなことができる。
しかし、敢えてこのソフトでやることでも無いような気がする。
まあ、一つのソフトにまとめられた方が便利ではあるが。
5管理人 ★:06/09/06 17:01 ID:???
2004年07月12日
■AutoHotkey(http://www.autohotkey.com/)日本語ドキュメント

勝手に公式サイトのドキュメントを落としてきて改造して作ってみた。
ホットキー割り当てやスクリプトの解説などを書いた。
元のドキュメントを参考に、色々と付け足したり削ったりして、HTMLの見易さも改善した。
コマンドの解説はまだ途中。

かなり頑張った。
VxEditor & DMonkey布教ページ(http://lukewarm.s41.xrea.com/)の方もこのくらい頑張りたいところ。

マウスボタンが押されているかはGetKeyStateで取得するんだった。
6管理人 ★:06/09/06 17:02 ID:???
2004年07月18日
■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回押せば左右のボタンにフォーカスが行くことに気付いた。
これなら、メッセージのやり取りとかなしにウィンドウが切り替えられてしまう。
今までの苦労はなんだったのか。

とりあえず出来たもの。
Numpad2::
    ControlFocus,ToolbarWindow322,ahk_class Shell_TrayWnd
    ControlSend,ToolbarWindow322,{Right}{Enter},ahk_class Shell_TrayWnd
return

Numpad1::
    ControlFocus,ToolbarWindow322,ahk_class Shell_TrayWnd
    ControlSend,ToolbarWindow322,{Left}{Enter},ahk_class Shell_TrayWnd
return

修飾キーつきのホットキーだとうまく動作しない。
多分、修飾キーを離す動作を加えてやる必要がある。
7管理人 ★:06/09/06 17:03 ID:???
2004年07月23日
■AutoHotkey(http://www.autohotkey.com/)用マウスジェスチャスクリプト

mousegesture.zip(http://hp.vector.co.jp/authors/VA026691/mousegesture.zip)

適当に作ってみた。
右クリックをしながら、マウスを動かすか、左・中央ボタンを押すと動作する。
普通に右クリックすれば右クリックになるし、タイムアウトのようなものも設定したから、右D&Dも使用できる。
StrokeItと比べると微妙にジェスチャの認識具合が違うが、大体うまいこと認識する。

困ったことに、マウスホイールのジェスチャが使えない。
GetKeyStateではホイールの状態が取得できないからだ。
~RButton & WheelUpのようなホットキーを登録すればいいのだが、これをやるとRButtonのホットキーが右ボタンを離したときに発動するようになってしまう。
いっそのことジェスチャはタイマーで動かすか。

直した。
とりあえず、マウス移動以外のジェスチャはボタン単独でホットキーにして、右ボタンが押されていなければ通常の動作、押されていればジェスチャ発動ということにした。
その他色々直して、ジェスチャ実行後に右ボタンを離したときの動作とかを改善した。

しかしまだ問題が。
AutoHotkeyのメニューが表示されていると、ホットキーイベントが潰されてしまい、マウス操作が効かなくなってしまう。
スクリプトでメニューを出す場合、ホットキーを無効化してやればいいが、タスクトレイメニューはそうは行かない。
タスクトレイ右クリック時に実行されるサブルーチンを指定できればよいのだが。
8管理人 ★:06/09/06 17:03 ID:???
2004年07月25日
■AutoHotkey(http://www.autohotkey.com/)用マウスジェスチャスクリプト

mousegesture.zip(http://hp.vector.co.jp/authors/VA026691/mousegesture.zip)
微妙に改良。
1行書き足すだけで除外ウィンドウなどを追加できるようにした。

タイムアウトの仕組みを変更。
今までは、右ボタン押し下げから一定時間で無条件にタイムアウトにしていたが、一定時間マウスの移動が閾値以下だったらタイムアウトになるようにした。
これで、比較的ゆっくりな入力も認識できる。

StorkeItで使っていた機能を追加してみたところ、今まで外部スクリプトを呼び出して実現していた動作がこのスクリプト内で完結できるようになってすっきりした。


AutoHotkeyのメニューやダイアログが表示されている間、マウスフックのホットキーが動作しなくなってしまう問題は未解決。
ジェスチャ開始時にホットキーを有効にして、終了時に無効にする方法を試してみたが、一部ウィンドウで何故か右クリックメニューが表示されてしまう。
一瞬右ボタンのフックが外れて右ボタン押し下げ状態が発生してしまうとかが原因のような気がする。

右ボタンを押しながら左ボタンを押すジェスチャのために、左クリックをフックしているのだが、ペイントソフトなどでドラッグ開始時に明らかな引っ掛かりを感じる。
前述の右クリックが誤動作する問題がなければ、ジェスチャ中だけホットキーを有効にすることで回避できるのだが。
9管理人 ★:06/09/06 17:05 ID:???
2004年08月06日
■AutoHotkey(http://www.autohotkey.com/)用Ctrlの2連打でプログラムを起動

まめFile4α版の掲示板でで出たので作ってみた。
変数名が適当。
~Ctrl::
if A_TickCount
とりあえず2連打のみ。
3連打になるともう少し面倒になる。
2連打と3連打を両方使えるようにするのは更に面倒。
2連打の後に一定時間以内の3度目が押されるかどうか待機してみて、押されたかどうかで動作を分岐しなきゃならない。

個人的には、ホットキーは欲しいけど、フックが必要なものは外部ツール任せでいいんじゃないかと思う。
あと、ドロップオープンの拡張子カスタマイズはそういえば欲しかったな。
10管理人 ★:06/09/06 17:06 ID:???
2004年08月09日
■AutoHotkey1.0.17(http://www.autohotkey.com/)

キーボードやマウスやジョイパッドのボタンにいろいろな機能を割り当てられて、スクリプトを駆使すれば様々な常駐ユーティリティの機能をこれ一つでどうにか出来そうなツールがバージョンアップした模様。
エディットコントロールのキャレット位置を変数として取得できるようになったらしい。
11管理人 ★:06/09/06 17:06 ID:???
2004年08月12日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)作った

AutoHotkeyは割りと新しいソフトで、日本での知名度はほとんどなく、日本語の解説サイトが無いので、作ってみることに。
とりあえず以前作った日本語解説をアップロード。
ホットキー割り当てやスクリプトの説明のあたりは大体日本語化してある。

xreaの新しいアカウントを取ろうと思ったが、すでに満員だったので、仕方なく布教ページのアカウントに同居。
もともとアクセス少ないサイトだし、ソフトの布教サイトは全部ここにまとめてしまおうかな。
12管理人 ★:06/09/06 17:07 ID:???
2004年08月13日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

Hotstring(http://lukewarm.s41.xrea.com/AutoHotkey/Hotstrings.htm)の日本語解説を書いた。
この機能を使えば、特定の文字列がタイプされたときに別の文字列に置換される略称入力のようなことが簡単に実現できる。
日本語の文章を書いている分にはあまり役に立たないが、プログラミングの入力省力化に使えるかもしれない。
確かDelphiには、略称を入力するとif..else..などよく使う構造を入力して次に入力するべき位置にカーソルを移動してくれる機能が有ったような気がする。


入門者向けチュートリアルっぽい物を書こうと思ったが、途中で飽きた。
適当にでっち上げた矢印キー割り当て設定が意外と便利だったが、もともと矢印キーが近いキーボードなんで意味なし。
13管理人 ★:06/09/06 17:07 ID:???
2004年08月15日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

コマンドの解説を少しずつ日本語化する。
一覧の説明を合わせて修正するのが面倒なので、DMonkeyスクリプトでコマンドごとのページからコマンド名とコマンド概要を抽出してHTML化出来るようにした。
あとでジャンル別インデックスの生成も出来るようにしておこう。

Sendコマンドでは2バイト文字は入力できないものと思っていたが、「{ASC nnnnn}」という形式で指定すると入力できることを知った。
そこで、Shift_JISの文字列をSendコマンドで入力できる形式に変換するスクリプトを書いてみた。
簡単な顔文字程度ならうまく行ったが、少し長いテキストを入力しようとしたらやたらと崩れる。
普通にクリップボード経由で貼りつけた方がよさそうだ。

この機能は、Altキーを押しながらテンキーで数値を入力することでそのコードの文字を入力できるというWindowsの仕様を利用しているらしい。
そんな機能が有るとは。
14管理人 ★:06/09/06 17:07 ID:???
2004年08月16日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

コマンド一覧生成スクリプトを改良して、カテゴリ別一覧を作成した。
フレームで左右に分けたページも作ってみた。
If系コマンドのあたりの日本語解説を書いた。
15管理人 ★:06/09/06 17:07 ID:???
2004年08月17日

■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)

コマンド説明の日本語化を行う。
Menuの説明がやたらあって苦しんだが、何とか片付けた。
残る大物はProgressくらいだが、小物コマンドが大量にあるので先は長い。
16管理人 ★:06/09/06 17:08 ID:???
2004年08月18日
■窓コン(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を調べる方法を書いた。
Resource Hacker(http://www.users.on.net/johnson/resourcehacker/)で実行ファイルのリソースを調べる方法とか、AutoHotkeyのスクリプトを使う方法とかを用意したが、窓コンで調べた方が楽そうだ。
17管理人 ★:06/09/06 17:09 ID:???
2004年08月19日
■AutoHotkey(http://www.autohotkey.com/)1.0.18

かなり頻繁に更新されているようだ。

気になった変更内容。

・なんかホットキーを押したときに修飾キーが押されたままになることがある問題に対処したらしい
CapsLockCtrl入れ替えスクリプトが動くようになるかと思ったが、駄目っぽい
なぜかShiftで試したら動いた

・マウスボタンホットキーを修正
Mouse Gesture(http://lukewarm.s41.xrea.com/AutoHotkey/myscripts/#mousegesture)スクリプトでAutoHotkeyのメニューが操作できなくなる問題が直った。
しかしまだメインウィンドウのタイトルバーを操作するとおかしくなる。
マウスフックが有効になっているだけで常にペイントソフトなどで引っかかるようになった気がする。

・if var [not] between value1 and value2
変数が範囲内にあるかをチェックするコマンドが追加

・if var [not] in value1,value2,...
変数の値が列挙したうちのどれかと同じであるかをチェックするコマンドが追加

・A_ThisMenuItemPos
メニューの何番目のコマンドが実行されたかを調べられる変数が追加

・Process
特定の実行ファイルのプロセスが存在するかをチェックしたり、起動するのを待ったり、終了したり、プライオリティを変更したりできるコマンドが追加


プロセスを操作できるようになったのは面白い。
しかし、何故に機能ごとに別のコマンドにせずProcessコマンドのサブコマンドになっているのか。


■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)少し更新

下のほうの簡単なコマンドの説明を書いただけ。
なんか190近くあって気が遠くなる。

掲示板の書き込み権限とスレたて権限を間違えて設定していたことに気付いた。
通りで書き込みがまったく無いわけだ。
多分直しても無いだろうが。
18管理人 ★:06/09/06 17:09 ID:???
2004年08月20日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)少し更新

機能のバージョンアップで追加されたコマンドの説明ページを用意しつつ日本語化。
Processコマンドの説明を見たところ、Runコマンドで起動したプロセスのPIDを取得したり、WinGetコマンドで任意のウィンドウの親プロセスのPIDを取得したりできるらしい。
これを利用すれば、アクティブなウィンドウのプロセスの優先度を変更したりとか、色々と使い道が広がりそうだ。
19管理人 ★:06/09/06 17:10 ID:???
2004年08月24日
■AutoHotkey(http://www.autohotkey.com/)用タスクバーのIMEツールバーを消す

MSIME2002のツールバーはひたすら邪魔臭い。消す。
IMEWatcherがあればほとんどの機能は代替できる。
しかし、WindowsXPのSP1では、なぜかツールバーを完全に消すことが出来ない。
詳細なテキストサービスをOFFにすればIMEWatcherの機能で消すことが可能だが、これをやると何故かTClockのタスクバーフラット化が効かなくなってしまう。
そこで、自力でIMEツールバーのウィンドウを消すことにする。
今までは、適当にツールをでっち上げて使っていたのだが、AutoHotkeyでもできそうだと思いやってみたら出来た。
WinWait,ahk_class Shell_TrayWnd
Control,Hide,,CiceroUIWndFrame1,ahk_class Shell_TrayWnd

こいつをスクリプトの上のほうに書いてスタートアップに登録。
20管理人 ★:06/09/06 17:11 ID:???
2004年08月25日
■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から呼び出して使うと便利そうなツールを紹介するページを作った。
他に何を載せるかは未定。
21管理人 ★:06/09/06 17:11 ID:???
2004年08月28日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

ウィンドウ関連コマンドの日本語説明を書いた。
数は多かったが、引き数の説明が使いまわせたため割と楽だった。
22管理人 ★:06/09/06 17:11 ID:???
2004年08月31日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

ウィンドウグループコマンドの説明を書いた。
機能自体が意味不明で困った。
GroupCloseが前に実行したコマンドによって動作が変わったりする。
23管理人 ★:06/09/06 17:12 ID:???
2004年09月06日
■AutoHotkey - Announcements(http://www.autohotkey.com/forum/viewforum.php?f=6)

α版とβ版が公開されてる。
β版らしきPre-1.0.19Changesでは、Runコマンドで起動失敗ダイアログを抑制する機能などが追加される。
α版では、なにやら柔軟なGUIを表示できるようになるらしい。
説明を書くのが面倒そうだ。
24管理人 ★:06/09/06 17:12 ID:???
2004年09月08日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

ファイル関連コマンドの説明を日本語化。
ウィンドウ関連と同じくらい多かったが、同じくらい使い回しが効いたので何とか終わった。
後、キーボード関係とかも片付けた。
これで少なくとも半分は終わったような気がする。
25管理人 ★:06/09/06 17:13 ID:???
2004年09月11日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新
いろいろとコマンドの説明を日本語化。
残るは「数値計算」「文字列」「その他」「設定」の一部だけだ。

なんかEnvUpdateが動作しない。
SetEnvironmentVariableでプロセス固有の環境変数を変更しているのに、WM_SETTINGCHANGEで反映させることはできないような気がする。

そもそも環境変数を反映させることができてもあんまりうれしくない。
せっかくだからWM_SETTINGCHANGEをブロードキャストしてほかのレジストリ設定を反映させるようなコマンドが欲しいところだ。
26管理人 ★:06/09/06 17:13 ID:???
2004年09月13日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

数値計算関係コマンドの説明を日本語化。
残り18コマンド。やっと9割できた。
27管理人 ★:06/09/06 17:13 ID:???
2004年09月16日
■AutoHotkey(http://www.autohotkey.com/)1.0.19

GUI関係のテストが続いていたが、正式版としてリリースされた。

・GUIコマンド追加
説明書くのがしんどい。
GUIといっても、DMonkeyのVCLオブジェクトほどには多機能ではない。
情報入力用のフォームなどが主な用途のような感じ。
コンボボックスが出せるので、VxEditor用dmsで使ってるような入力補完ウィンドウみたいのも出来るかもしれない。

配布ファイルのパスを削ったら旧バージョンが落とせることに気づいた。
Index of _kodi_ahk(http://home.tampabay.rr.com/kodi/ahk/)
28管理人 ★:06/09/06 17:14 ID:???
2004年09月18日
■cat-walk(http://peko5.hp.infoseek.co.jp/index.html)
ソフトウェア関連っぽい日記などのあるWiki。
AutoHotkeyを流行らせるページがリンクされてた。
29管理人 ★:06/09/06 17:14 ID:???
2004年09月19日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

Ver1.0.19で追加されたGUIコマンドの日本語説明を書いた。
大量に説明があってきつかった。

今のところ、タイトルバーのないウィンドウなどは作れないので、コンボボックスによる入力補完ウィンドウのようなものを作るには不満がある。
しかし、コントロールのサイズを指定しなくても適当にうまいことレイアウトしてくれるので、設定の入力画面などを作るのはかなり楽に出来そう。
コンソールプログラムのフロントエンドを作るなどの用途には、HSPやDMonkeyなどのスクリプト言語より便利かも。

一部の設定では、CheckBoxやRadioのキャプションの幅の自動調節がおかしくなるような気がする。
30管理人 ★:06/09/06 17:14 ID:???
2004年09月20日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

文字列関係のコマンドの説明を書いた。
残りは設定関連だけだ。
31管理人 ★:06/09/06 17:15 ID:???
2004年09月22日
■AutoHotkey __ View topic - Pre-1.0.20 Changes(http://www.autohotkey.com/forum/viewtopic.php?t=873)

ウィンドウ内のコントロールのリストを得る機能とウィンドウをリサイズ可能にする機能が追加。
リサイズできるのはいいが、DelphiのVCLのAnchor属性とかAlign属性のようにリサイズに合わせてコントロールの位置やサイズを調整してくれる機能がないのであまり意味ないような。
32管理人 ★:06/09/06 17:15 ID:???
2004年10月01日
■AutoHotkey Changes & New Features(http://www.autohotkey.com/changelog/)

1.0.20キター

変更点は、

○追加
・「WinGet,OutputVar,ControlList,A」のようにして、ウィンドウのコントロール一覧を取得できるようになったらしい。

・Sendコマンドで{LButton}のようにしてマウスボタン操作も送れるようになったらしい

○改良

・MsgBoxのTimeoutに変数参照を使えるように

・Menuの名前の文字数上限を100から260に増やし、若干メモリ効率が上がったらしい

・Menu,Addが高速化したらしい


○修正
・if var between/in/containsのMatchListの2番目にコマンドして有効なものが指定されると、一致時のコマンドとして解釈されてしまう問題の修正

・なにやら「$Tab::」とAlt+Tab関係で修正したらしい
SetTimerが10ミリ秒ごとに実行できるようになったらしい

・file-pattern and registry loops でサブフォルダにもぐるとA_Indexが1に戻ってしまうのをやめた

・メインウィンドウのコマンドIDが変わったのでWM_COMMANDで操作するときは修正が必要らしい

・スクリプトのExe化でバージョン情報を含めなくしたらしい。
ResourceHackerでバージョン情報を追加できる。
EmEditorとMED用の編集モード設定を同梱ファイルに追加

○GUI関係の修正

・GuiのButtonを連打したときになにやらおかしくなるのが直ったらしい

・GuiのPictureで背景として使っている場合にマウスクリックを乗っ取られないようにした

・Menuでメニューバーを変更したとき、即座に反映されるようになったらしい

・ウィンドウ数の上限を5から10に増やした

・GuiのRadioBoxでグループのうち1つだけに変数を割り当てたとき、チェックの入ったボタンの番号が格納されるようになった(0ならチェックなし、1なら1つ目……)

・Guiコマンドを含むスクリプトは、デフォルトで常駐勝つ複数起動不可になるようになった(今までは、GUIコマンドを使った時点で常駐にだけなっていた)

・Gui,fontにUnderlineを追加

・GUI,+resize/-resizeを追加

・GUI,Addにxs,ysオプションを追加。
なにやらウィンドウをセクションとして分割してレイアウトされるようになったらしい

・A_GuiControlEventで現在のスレッドがどのGUIのどんなイベントで呼び出されたかを参照できるように
ListBoxとかでダブルクリックされたのがわかるようになったらしい

・GuiControl and GuiControlGetコマンドが追加されたらしい
いろいろと操作・情報取得できる

説明修正するのが面倒だ
33管理人 ★:06/09/06 17:15 ID:???
2004年10月03日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新
1.0.20で更新された部分の説明を書いた。
34管理人 ★:06/09/06 17:15 ID:???
2004年10月13日
■AutoHotkey v1.0.21 released(http://www.autohotkey.com/forum/viewtopic.php?t=1057&sid=7ca61dec2ad881c1b321e70e2c267621)

いろいろと修正・変更されてた。

以下、変更点(意訳)

・ホットストリングが動作しない場合があるのを修正
・ProgressコマンドでXPのビジュアルスタイルを使っていると色が変えられないのを修正
・ControlSendで修飾キー関連がいろいろと修正された模様
・ToolTipがマルチモニタ環境の第2モニタ以降に表示できるように
・PixelGetColorでカラーコードを16進数表記で取得するように変更
・付属のWindowSpyを改良
・InputコマンドでCtrl+アルファベットキーを取得できるように
 なぜかCtrl+Aならアスキーコードの「1」が取得されるという仕様
・ControlGetでコントロールの拡張スタイルを取得できるように
・GUIコマンドのビジュアルスタイル関連修正、その他見た目関係の修正
・GuiControlでコントロールの内容を空にすることができるように
・DropDownList、ComboBoxの行数が指定されなかった場合、画面に収まる大きさに広がるように修正
・すべてのコントロールに変数を関連付けられるように
 GuiControl、GuiControlGetでコントロールを指定するのが容易になった
・"Gui Submit"、GuiControlGet.で、DropDownList、ComboBox、ListBoxの選択項目名でなく選択番号を取得できるように
・Gui Flashでウィンドウをタスクバー上で点滅させられるように
・Gui +/-Themeでビジュアルスタイル適用の有無を設定可能に
・GuiControlで既存のコントロールのオプションやスタイルを設定可能に
・ListBoxで複数選択を可能に
・GUIコマンドで各種スタイル、拡張スタイルを設定可能に


GUI関連がいろいろと改良されてる。
タイトルバーなしウィンドウはまだか。
35管理人 ★:06/09/06 17:16 ID:???
2004年10月17日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新
1.0.21の更新部分の日本語説明を書こうとドキュメントを見ていたら、Gui,+/-Optionでタイトルバーなしウィンドウを作れるようになってることに気づいた。
これでコマンドラインランチャや単語補完入力などを作れるかもしれない。
そのほか、拡張ウィンドウスタイルなども指定できるので、かなり自由度が高まってるような気がする。


ためしにコマンドラインランチャを作ってみたが、コンボボックスがオートコンプリートしてくれないことに気づいた。
Delphiなら標準機能で付いているのだが、Windowsの標準機能ではなかったのか。
これじゃ「ファイル名を指定して実行」と変わらない。
Gui,+ToolWindow -caption
Gui,add,ComboBox,vComboInput x0 y0 w200 r16,notepad|mspaint|msconfig
Gui,add,Button,default gGUIEnter

return

#r::Gui,Show,w200 h18

GuiEnter:
Gui,submit
Run,%ComboInput%
return

GuiEscape:
Gui,Cancel
return
36管理人 ★:06/09/06 17:17 ID:???
2004年10月19日
■AutoHotkey Pre-1.0.22 Changes(http://www.autohotkey.com/forum/viewtopic.php?t=1073&sid=0af2269ac856ea2069cfb5058d679943)

CD/DVDドライブのトレイを排出・格納できるDriveコマンドが追加
システムのいろいろな情報を取得できるSysGetコマンドが追加

光学ドライブトレイの操作ソフトはいくつか存在するけど、なかなか思い通りに動作するものが無かったりする。
AutoHotkeyのスクリプトでなら、いろいろな挙動を実現できていいかも。

起動するとトレイを開いて、その後何か操作をするとトレイを戻すスクリプトを作ってみた。
Drive,Eject,G:
Sleep,2000
Loop
    If A_TimeIdlePhysical
なかなかよい。
37管理人 ★:06/09/06 17:17 ID:???
2004年10月23日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)ダウンロード版

とりあえずHTMLファイルだけZIPにした。
コマンドのインデックス生成DMS実行後に、xcopyでコピーしてSpeeeeedで広告部分除去してNoahで圧縮してLFUでアップロードすることに。
CHM形式のヘルプも作ろうと思ったが、ヘルプましんが思ったように動かないんでやめた。
元のフォルダとツリー定義とキーワード定義を渡すだけで変換できるようなのがあればやるのだが。
38管理人 ★:06/09/06 17:17 ID:???
2004年10月25日
■AutoHotkeyのパフォーマンス

AutoHotkeyの言語仕様はずいぶんと単純だが、パフォーマンスはどのくらいだろうか。
とりあえずDMonkeyとUWSCと比較してみた。(手元にあったTickCountで多分高精度に経過時間を測れるスクリプト言語)
1から6万までを足す計算をやらせてみる。

DMonkey
s=0;
c=(new Win32).getTickCount();
for(i=1;i
当環境では大体1.5秒だった。

UWSC
DEF_DLL GetTickCount():long:kernel32
s=0
c=GetTickCount()
for i=1 to 60000
    s=s+i
next
msgbox(GetTickCount()-c)
大体1.6秒弱。

AutoHotkey
SetBatchLines,-1
s=0
c=%A_TickCount%
Loop,60000
s+=%A_Index%
t=%A_TickCount%
t-=%c%
MsgBox,%t%
大体0.078秒程度になる。

単純な処理の場合、AutoHotkeyはかなり速い。
計算式を複数の命令に分けて書かないといけないので、その分不利になることはあるかもしれないが、遅くて困るということはあまりなさそうだ。

なお、WSHのJScriptも試したところ、TickCountが無いので正確なところはわからないが、AutoHotkeyと同様にほんの一瞬で終了した。

■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)RSS

設定関係コマンドの日本語説明の残りを書き上げ、現正式版時点でのすべてのコマンドの日本語説明を完成させた(多分)。

mkrss.dmsを使ってRSSを作成することに。
更新作業を自動化したBATファイルに組み込む。
39管理人 ★:06/09/06 17:18 ID:???
2004年10月26日
■AutoHotkeyのパフォーマンス2

メモリ使用量を調べてみる。
1万個の変数を動的に作成し、メモリ使用量と処理時間を調べる。

SetBatchLines,-1
s=0
c=%A_TickCount%
Loop,10000
v%A_Index%=%A_Index%
t=%A_TickCount%
t-=%c%
MsgBox,%t%

ループを実行した場合、2843ミリ秒の時間がかかり、メモリ使用量は1MBほど増えた。
変数1つ100バイトくらいか?
メモリを確保するのには結構時間がかかるらしい。
変数に空の値を代入するようにしたら、メモリ使用量の増分は300KBくらいになった。

DMonkey
w32=new Win32;
a=new Array;
s=0;
c=w32.getTickCount();
for(i=1;i
3078ミリ秒で、172MBほど増える。
オブジェクトはかなりメモリを食うようだ。
new String(i)をi.toString(10)とすると、500KBくらいしか増えなかった。
代入する値をnullにすると300KBくらい。

UWSC
DEF_DLL GetTickCount():long:kernel32
Dim a[10000]
c=GetTickCount()
for i=1 to 10000
    a[i]=""+i
next
msgbox(GetTickCount()-c)
438ミリ秒。配列は最初に宣言するため、速い。
メモリは400KBほど増える。
代入する値を空の文字列にしても同じくらい。


次に、巨大なスクリプトを読み込ませてみる。
DMonkeyの連番展開スクリプトを用いる。

AutoHotkey
v=[0-1000]
MsgBox,aaa
展開部分のコードを抜かしたときと比べ、300KBほど増える。
なお、1001行の後に昨日の60000回足すスクリプトを実行してみたが、実行時間に差は無かった。

DMonkey
a=[0-1000];
alert('aaa');300KBほどの増加。

UWSC
a=[0-1000]
msgbox("")100KBほど増える。


そんなわけで、たくさん変数を作ったり、長いスクリプトを常駐させても、現実的にはメモリ消費量が増えすぎて困るということはなさそうだ。
ただ、StringSplitコマンドで行数の多い文字列を分割すると、大量に変数が作られてしまうので、常駐スクリプトではこのコマンドの使用は避けたほうがいいだろう。
40管理人 ★:06/09/06 17:18 ID:???
2004年10月27日
■AutoHotkey(http://www.autohotkey.com/)1.0.22

・ToolTipがXPで表示できない不具合修正
・マウスの左ボタンのホットキーでポップアップメニューを表示したときの不具合修正
・SetKeyDelayで押してから離すまでの間の時間を設定可能に
・GetKeyState, KeyWait, Input, and hotkeys でvkFFとかいうのが使えるようになったらしい
・FileMoveDirでコピーが可能に
・WinGetで最小化・最大化状態が取得可能に
・WinGetでプロセス名を取得することが可能に
・Driveコマンドで光学ドライブのトレイ操作が可能に
・DriveGetコマンドで光学ドライブ所状態が取得可能に
・A_ScreenWidth and A_ScreenHeight,で画面解像度が取得可能に
・A_AhkVersion変数追加
・SysGetコマンドでシステムのいろいろな情報が取得可能に
・GUIのPictureコントロールでPNG/ICOなどGDI+エンジンがサポートする形式を使用可能に
・GuiControl,Textでチェックボックスに「0」「-1」「1」をテキストとして設定可能に
・Guiにタブコントロールが追加
・そのほか、GUI関係の修正

そんなわけで、WinGetでプロセス名が取得可能になったのは便利かも。
41管理人 ★:06/09/06 17:18 ID:???
2004年11月02日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

1.0.22で追加/更新されたコマンドの説明を書いた。
Tabコントロールの説明が多くて苦労した。
42管理人 ★:06/09/06 17:18 ID:???
2004年11月04日
■AutoHotkey Pre-1.0.23 Changes(http://www.autohotkey.com/forum/viewtopic.php?t=1189&sid=11103392786bd75b8d727644971a3743)

タブコントロールがいろいろ修正されたほか、ホットキー動作中にホットキーをON/OFFしたときの挙動が改良された。
これにより、マウスジェスチャスクリプトが大幅に簡略化できる。
また、通常字に左ボタンをフックしなくなるので、ペイントソフトなどで引っ掛かりがあるということもなくなる。

今までは、右クリック中に他のマウスボタンのホットキーをON/OFFすると、なぜか右クリックが一瞬離されてしまい、ジェスチャが正確に入力できなかった。
そこで、マウスボタンのホットキーは常に有効にしておいて、右ボタンが押されているかどうかで通常のボタン操作動作かジェスチャ動作かを分岐していた。

今回の変更で、右クリック中に他のマウスボタンのホットキーをON/OFFしてもそのままジェスチャを入力できるようになった。
マウスボタンのホットキーは右ボタンを押している間だけ有効にすればよく、マウスボタンのホットキー内に通常の動作を発生させるコードを書く必要がなくなった。

■AutoHotkeyマウスジェスチャスクリプト改良

http://lukewarm.s41.xrea.com/AutoHotkey/up/file/003.zip

とりあえず改良したものをアップロード。
作りかけの設定GUIも入れておいた。
mginiedit.ahkで作成したmg.iniをmgini2ahk.ahkで処理すると、マウスジェスチャスクリプトが出力されるという寸法。

アプリケーションルールでは、ルールに含めるウィンドウタイトル、ウィンドウクラス、プロセス実行ファイル名を列挙できる。
アプリケーションルールは優先順位を設定できる。
ジェスチャルールでは、ひとつのルールに複数のジェスチャを登録できる。
円を書くようなジェスチャは、↑→↓←だけでなく→↓←↑や↓←↑→や←↑→↓も同じルールに登録しておけば認識しやすくなるかもしれない。

mginiedit.ahk実行中に何かジェスチャを行うと、アプリケーションルールとジェスチャルールの編集画面の入力欄にそのときのウィンドウタイトル、ウィンドウクラス、プロセス実行ファイル名、ジェスチャが入力され、追加ボタンで一覧に追加できる。

メイン画面でアプリケーションルールやジェスチャルールを選択すると、選択したルールに割り当てられているスクリプトが表示され、編集できる。

続きは週末に作るかもしれないので、何か意見があれば流行らせるページの掲示板あたりに。
http://lukewarm.s41.xrea.com/test/read.cgi/ahkbbs/1092315284/
43管理人 ★:06/09/06 17:18 ID:???
2004年11月05日
■Vector新着より
WSChanger(WindowsNT_2000_XP_ユーティリティ)(http://www.vector.co.jp/soft/winnt/util/se347032.html)
指定したウィンドウのウィンドウスタイルを無理やり変更してしまうツール。

AutoHotkeyのGUIではウィンドウスタイルを設定できるが、効果が今ひとつわからないというときはこのツールで試してみるといいかも?
44管理人 ★:06/09/06 17:18 ID:???
2004年11月07日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)インクリメンタルサーチ

フレーム版コマンドリファレンスにJavaScriptでインクリメンタルサーチ機能をつけた。
インプットボックスにテキストを入力すると、先頭が一致するコマンドが下にリスト表示される。
インプットボックスにフォーカスがあるままEnterキーを押すと、最初の一致項目を開く。
検索部分にフォーカスがある場合、上下キーは画面のスクロールではなく、項目間のフォーカス移動になる。

あと、ついでにコマンド種別の見出しをクリックすると下位項目を折りたためるようにした。

IE以外で動くかは不明。低スペック環境でも使い物にならないかも。

■マウスジェスチャスクリプトGUI進捗状況
とりあえず、メイン画面のINI読み書きだけ作った。
45管理人 ★:06/09/06 17:19 ID:???
2004年11月08日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)
マウスジェスチャスクリプト
設定GUIスクリプトは多分完成。
設定からスクリプトを作成するスクリプトはとりあえず動いたがあまり試してない。

インクリメンタルサーチ
部分一致検索に対応した。
大量にあると遅いので、オプションとする。
そのうち、キーワード類をソートして列挙しておいて、変数などもまとめて検索できるようにしたい。
46管理人 ★:06/09/06 17:23 ID:???
2004年11月09日
■AutoHotkey用マウスジェスチャ(設定GUI付き)
http://lukewarm.s41.xrea.com/AutoHotkey/myscripts/mousegesture.zip

完成したような気がする。
とりあえず、スクリプトが出力され正常に動作した。
まだ十分にテストしてない。

設定画面の画像。
http://lukewarm.s41.xrea.com/AutoHotkey/myscripts/mousegesture.png


ジェスチャ中にCPUパワーの約半分を食うので、Sleepの時間を調整してやる必要がありそうだ。
あと、Optionで#NoTrayIconをつけるように設定できるようにもしたい。
ウィンドウタイトルのつづりが1文字抜けてたり、いろいろと間違っているので修正が必要。
47管理人 ★:06/09/06 17:24 ID:???
2004年11月10日
■AutoHotkey(http://www.autohotkey.com/)1.0.23
いろいろ更新されている。

・Windows9x系でも、ホットキーの「$」でホットキーサブルーチン内から同じキー操作が送られたときに再帰呼び出しになるのを回避することが可能に
・ PixelGetColor and PixelSearch でBBGGRR形式でなくRRGGBB形式で取得するオプションを追加
・Menu,Showでマウスカーソル位置でなく任意の位置に表示する機能を追加
・HotkeyのOn/Off動作の改善
・WinGetでウィンドウスタイルを取得可能に
・ A_ProgramFiles and A_WinDir for 変数追加
・WinSet, Bottomでウィンドウを最背面に移動可能に
・WinSet, Transparent, Offでウィンドウの透過モードを完全にOffにできるように
・WinSet TransColorでウィンドウの指定の色だけを透過させることが可能に
・GUI,Addでwp+n and hp+n オプションで前のコントロールの大きさからの相対値で大きさを指定可能に
・A_Gui and A_GuiControl変数でGUI関連イベントの呼び出し元を特定可能に
・GuiControl,Fontでフォントを変更可能に
・Slider,Progress,Hotkeyコントロール追加
48管理人 ★:06/09/06 17:24 ID:???
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

マウスジェスチャスクリプトにループ毎に挿入されるSleepの長さを設定する機能と、トレイアイコンの非表示を設定する機能を追加。
その他、細かい表示の修正。

1.0.23がリリースされたので、変更されたところの説明を書こうと思ったが、GUIのProgress、Sliderコントロールの説明が多くて挫折。
GUIコマンドの説明が肥大しすぎているので、コマンドやコントロールごとにページを分けようと思う。

とりあえず、書き直したところだけアップロード。
49管理人 ★:06/09/06 17:24 ID:???
2004年11月12日
■AutoHotkeyを流行らせるページ(http://lukewarm.s41.xrea.com/AutoHotkey/)更新

GUIのスライドバーとプログレスバーの説明を書いた。
Guiコマンドの説明が増えすぎているので、サブコマンドごとにページを分けた。
Addサブコマンドはさらにコントロールごとに分けた。


・今後の構想
キーワード、URL、コメントの組をファイルに列挙しておき、フレーム型インデックスのインクリメンタルサーチに埋め込んで検索できるようにする。
さらに、Speeeeedの置換リストを生成して、HTML中のキーワードにリンクをつけるようにする。
50管理人 ★:06/09/06 17:24 ID:???
2004年11月20日
■xrea.comのs101サーバが募集開始

Perl/PHP/Python/RubyなどのCGIやMySQL/PostgreSQLなどのデータベースを使用でき、広告の挿入を手動で行うようにもできるパワーユーザー向けな感じの無料Webスペースの新規募集が開始された。
AutoHotkeyのページを移転すべく取得。
なんかs70あたりから募集しているところ見てないんだが、有料会員用に使われたとかだろうか?
そういえば、このあたりのサーバはたまに見かけたことがあるがどこも広告がなかったような気がする。

移転するときは.htaccessに「Redirect permanent /AutoHotkey/ http://lukewarm.s101.xrea.com/」みたいに追加すればいいのかな
とりあえず301が来て飛ばされた。

2chブラウザのほうが301を追跡してくれなくて困る。


とりあえず大体できたような気がする。
http://lukewarm.s101.xrea.com/(http://lukewarm.s101.xrea.com/)
51管理人 ★:06/09/06 17:25 ID:???
2004年11月27日
■AutoHotkeyマウスジェスチャスクリプト更新

http://lukewarm.s101.xrea.com/myscripts/mousegesture.zip

2chのマウスジェスチャスレで右D&Dをどうするかの話題があった。
http://pc5.2ch.net/test/read.cgi/software/1082888350/868-896

このスクリプトや、参考にしたStrokeItでは、ジェスチャ中に一定時間カーソルを動かさないとジェスチャがキャンセルされ、普通のD&Dになる。
小さな目標に右D&Dする場合などは、目標にカーソルがあっていることを確かめている間にタイムアウトになるので、ストレスは感じにくい。
なお、開始位置からまったく動かないでいると、タイムアウトは発生しない。(ホイール系操作を使いやすくするため)

一方マウ筋では、右ボタンを押した直後にカーソルを動かさないでいた場合にしかタイムアウトにならないらしく、ストレスを感じやすくなっている模様。
スレッド内では、右+中クリックなどに「ジェスチャ開始位置から終了位置まで右D&Dする」という動作を割り当てることで解決する案が示されていた。

マウスジェスチャスクリプトでは、どのジェスチャパターンにもマッチしなかった場合、単に終了位置で右クリックをする仕様になっていた。
ここを、開始位置から終了位置まで右D&Dすると言う動作に変更することに。
一致しないジェスチャのときだけこんなことされても役に立つかどうかは不明だが。

MouseClickDragを使ってみたら、まめFile4間でのD&Dでなぜか右D&Dのメニューが出ずに左D&Dの動作になってしまう。エクスプローラでは反応さえしない。
MouseClick,MouseMoveを組み合わせて、最後にボタンを放す前にSleepを入れることでまともな動作になった。
しかし、Sleep,0では駄目で、Sleep,1でなければうまく行かなかった。

原因はよくわからんが、WM_DROPFILESではどのボタンでドラッグされていたかがわからないので、実際にボタンが押されていることを何らかの方法で監視して知る必要があるからだろうか。


ボタンを離す直前にカーソルの動きがあったかどうかなどでジェスチャかD&Dかを判別するというのはどうだろうか。
52管理人 ★:06/09/06 17:25 ID:???
2004年11月29日
■AutoHotkey Pre-1.0.24 Changes(http://www.autohotkey.com/forum/viewtopic.php?t=1282&start=30&sid=7c18d71b785fd01a4d702c9912d6bf25)

久しぶりにいろいろと更新された模様。
FileGetShortcutでショートカットファイルの情報を取得可能に。
FileCreateShortcut で「実行時の大きさ」を指定するオプションが追加されたりした。
A_Language, A_ComputerName, A_UserNameその他変数がいろいろ追加
FormatTimeでタイムスタンプを指定フォーマットの文字列に変換可能に
その他GUI関連の変更
53管理人 ★:06/09/06 17:26 ID:???
2004年12月09日
■AutoHotkey(http://www.autohotkey.com/)1.0.24

久しぶりに正式版に。

・2chスレで話題になっていた""で囲まれたスペースを含むコマンドラインパラメータがおかしくなる問題が直っている模様。
・"Drive Lock" and "Drive Unlock"で光学ディスクドライブのトレイをロックできるようになったらしい。
・Sortでランダムソート(シャッフル?)ができるようになったらしい
・TransformでUnicode変換ができるようになったとか。
・変数いろいろ追加
・FormatTimeで日付変換を指定書式に変換
・GUIでウィンドウが移動したときのイベント、ファイルがドロップされたときのイベントが指定可能に
54管理人 ★:06/09/06 17:26 ID:???
2004年12月19日
■AutoHotkey用マウスジェスチャスクリプト(http://lukewarm.s101.xrea.com/myscripts/index.html#mousegesture)更新

なんか複数のアプリケーションルールを登録すると、設定の適用に失敗するというので調べてみた。
Loop,PARSEのデリミタがカンマではなく改行になっているところがあった。
修正したらなおったっぽい。
55管理人 ★:06/09/06 17:26 ID:???
2004年12月21日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)更新
ようやく1.0.24更新分の説明を書いた。

・TransformでUnicode変換
なんかクリップボード→Unicode文字列変数/Unicode文字列変数→クリップボードの変換しかできないようで使い道は微妙。

・FormatTime
ロケールを指定できたりしてかなり高機能。
説明を書くのがしんどかった。
GUIコマンドと合わせて時計などを作るのが楽になるだろう。

・GUI関連の改良
ウィンドウへのファイルドロップを受け取れるようになったし、PictureコントロールがEXE/DLLアイコンリソースを表示できるようになったので、ボタン型ランチャが作れそう。

■AutoHotkey Community __ View topic - Pre-1.0.25 Changes(http://www.autohotkey.com/forum/viewtopic.php?t=1555&sid=f8206599e1f77f5598c93c82a1c548dc)
なんかいろいろと更新されているらしい。
各種修正のほか、パフォーマンスがいろいろと改善されている。
また、テキストファイルを丸ごと読み込むFileReadコマンドが追加された。
56管理人 ★:06/09/06 17:26 ID:???
2004年12月31日
■AutoHotkeyでCygwinのXWinをどうにかする

暇だったのでCygwinの全パッケージをインストールしてXWindowsを弄ってみた。
XWinのマルチウィンドウモードで、余計なコンソールウィンドウを出さず、すべてのウィンドウを閉じたらXWin.exeも終了してくれるようなスクリプトが欲しかったが、.batや.shで作るのが面倒だったのでAutoHotkeyでやることに。
とりあえずこんな感じになった。
\tmp\.X11-unix\X0の削除はなくてもいいような気がするが、いくつかのサイトで見かけたので入れておく。
Xwinの終了は、タスクトレイアイコンのメニューで「Exit」を選んだときの動作にした。
いちいち確認ダイアログが出るが、ここで終了をキャンセルしておけば次回実行時にXWinの起動待ち時間をなくせる。
後、強制終了だとタスクトレイアイコンが残ってしまう。
#NoTrayIcon
DetectHiddenWindows,On
EnvSet,DISPLAY,localhost:0.0
EnvSet,CYGWIN_ROOT,D:\cygwin
EnvSet,PATH,%CYGWIN_ROOT%\bin;%CYGWIN_ROOT%\usr\X11R6\bin;%PATH%
IfWinNotExist,ahk_class cygwin/x
{
    IfExist %CYGWIN_ROOT%\tmp\.X11-unix\X0
    {
        FileSetAttrib,-S,%CYGWIN_ROOT%\tmp\.X11-unix\X0
        FileDelete,%CYGWIN_ROOT%\tmp\.X11-unix\X0
    }
    Run,XWin.exe -multiwindow -clipboard -emulate3buttons,,Hide
    Run,rxvt -sr -e bash,,Hide
    WinWait,D:\cygwin\bin\rxvt.exe
    WinWaitClose,D:\cygwin\bin\rxvt.exe
    SendMessage,0x111,200,,,ahk_class cygwin/x
}
else
{
    Run,rxvt -sr -e bash,,Hide
    ExitApp
}
57管理人 ★:06/09/06 17:27 ID:???
2005年01月12日
■AutoHotkey(http://www.autohotkey.com/)1.0.25

いろいろと細かい修正が多い。
なんか数値を扱う部分で計算式を使用できるようになったらしい。
次はサブルーチンで引数と返り値が使えるようになるらしい。
58管理人 ★:06/09/06 17:27 ID:???
2005年01月17日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)更新

1.0.25の説明を書いた。
コマンドの説明の変更箇所が大量にあってしんどかった。
半分以上が引数に式を使えるようになったことの説明だった。
多分、式を指定できるようになったのは数値を単独で指定するタイプの引数すべてだろうから、式の説明の部分にその旨を書いて後は省略することにした。
59管理人 ★:06/09/06 17:27 ID:???
2005年02月04日
■AutoHotkey(http://www.autohotkey.com/)1.0.25.13

最近細かいバージョンアップが続いていたが、どうでもいい修正が主だったので無視していた。
今回の更新では、GUIウィンドウ周りの機能が追加された模様。
GUIウィンドウに対して最小化や最大化などの操作をできるようになったほか、使用不可ウィンドウ化や常に最前面表示などにするオプションや、他のウィンドウ関連コマンドで操作するためにLastFoundWindowに記憶する機能などが追加された。
60管理人 ★:06/09/06 17:27 ID:???
2005年02月11日
■AutoHotkey(http://www.autohotkey.com/changelog/)1.0.26

なにやらマイナーバージョンアップを繰り返していたが、ようやくメジャー(?)バージョンアップが。

追加機能は、
・SendMessageでahk_id 0xFFFF(HWND_BROADCAST)を指定すると全ウィンドウにメッセージをブロードキャストされるように
・PixelSearchで高速検索を行うfastオプションが追加
・指定画像ファイルと同じ画像が画面上にあるかを検索するImageSearchコマンド追加
・WinGetで透過関連を取得可能に
・WinSet,Redrawで任意ウィンドウを強制再描画させられるように
・WinSetおよびControlで任意ウィンドウのStyle・ExStyleを変更可能に
・チェックボックスのチェックの有無を「Checked1」「Checked0」のように指定可能に。「Checked%chk%」のようにして使うと便利らしい。

色々と便利そうだ。
特にWinSetのスタイル関連。
61管理人 ★:06/09/06 17:27 ID:???
2005年02月15日
■AutoHotkey(http://www.autohotkey.com/)1.0.27

GUIウィンドウの数の上限が大幅に増えていた。
62管理人 ★:06/09/06 17:28 ID:???
2005年02月23日
■AutoHotkeyv1.0.28 released(http://www.autohotkey.com/forum/viewtopic.php?t=2480&sid=bb86d282e3bb0de2a27964f84c1768a8)

ホットキーに押し上げイベントが追加された。
また一歩繭に近づいた。
しかし、
*CapsLock::Send,{LCtrl Down}
*CapsLock up::Send,{LCtrl Up}
とやってもCapsLockCtrl入れ替えは実現できず。
やはりフックでは無理なのか?

ウィンドウ指定でプロセスIDを指定するahk_pidが追加。
プロセス名や実行ファイルパスを指定する機能はまだか。

SoundBeepでビープ音を鳴らせるように?

SoundPlayでシステムのメッセージ音を鳴らせるように

FileAppendでテキストを指定しなかった場合、からのファイルを作成するか、既存のファイルの更新日時を更新するように。

その他修正

忙しいので流行らせるページはしばらく更新できない。
63管理人 ★:06/09/06 17:28 ID:???
2005年03月01日
■AutoHotkey v1.0.29(http://www.autohotkey.com/forum/viewtopic.php?t=2571&sid=d7fa5e237ebba85a1161571b63983b6b)

クリップボードのテキスト以外のデータも読み書きできるようになったらしい。
クリップボードの内容の変更に反応する機能はいつ付くのか。
64管理人 ★:06/09/06 17:29 ID:???
2005年03月11日
■AutoHotkeyのサイト更新中

2ヶ月放置してたんで死ぬほどある。
とりあえず所感。

・ClipboardAll
多分一時的にクリップボードの内容を退避したいときのためのものだろうが、かなり中途半端な感じ。

・ahk_group
ControlSendやSendMessageでは一括処理できない模様。中途半端だ。
65管理人 ★:06/09/06 17:29 ID:???
2005年04月03日
■今日こそAutoHotkeyのページを更新する

しばらく本体が更新されていないので、この隙に日本語説明の更新を追いつかせたい。

WinMergeがいつの間にか行内の変更箇所の表示に対応していた。
これでRekisaと併用しなくてもかなり楽に変更箇所がわかる。

とりあえず終わった。
66管理人 ★:06/09/06 17:29 ID:???
2005年04月09日
■AutoHotkey(http://www.autohotkey.com/)v1.0.31

・なにやら引数と返り値とローカル変数を使える関数がついたらしい。

・タイマーのスレッドが実行中にそのタイマー自身をリセットできないのを修正
仕様じゃなかったのか。

・式中の文字列内の「(」「)」で構文解析がおかしくなるのが直ったらしい。

・GuiControlでEditのReadOnly属性を変更できるように

・式中で不正な名前の変数が参照されたとき実行時エラーにするように

・式中の文字列の結合の優先度を下げたりした

・「Array%i%」のような動的変数名参照を1000倍くらい高速に

・大量のコントロールがあるときのGuiControl GuiControlGetのパフォーマンスを改善

・ANDやORを多く含む式の処理を高速化

・細かな変数を大量に使用するスクリプトのメモリ使用が減ったっぽい

・A_LineNumber A_LineFileで現在実行中のファイル名・行番号を取得可能に

・#ClipboardTimeout指令でクリップボードにアクセスするときの最大待ち時間を指定可能に



忙しいのに説明書くのしんどいなと思っていたら、なにやらバグだらけらしくしばらく様子見することに。
67管理人 ★:06/09/06 17:30 ID:???
2005年04月13日
■AutoHotkeyのページのスクリプト仕様(http://lukewarm.s101.xrea.com/Scripts.htm#functions)に関数の説明を追加

最近追加された関数機能の説明を書いた。
新学期やゴールデンウィーク進行で色々と忙しいが、なぜかやった。今は反省している。

関数内では、デフォルトですべての変数がローカル変数になる。
同じ関数内で共有されるスタティック変数も存在する。
期待していなかったが、再帰呼び出しも可能な模様。
しかし、なぜか39回再帰呼び出しをすると、不正終了してしまう。


長くなったのでファイルを分割したい。
式の説明なども分割したい。
各ページのリンクを修正するのが面倒なので後回し。
68管理人 ★:06/09/06 17:31 ID:???
2005年04月29日
■AutoHotkeyのページ(http://lukewarm.s101.xrea.com/)更新

したかも。
とりあえず最新版に対応。
DL版も更新した。

WinMergeでの作業を効率化するスクリプトを作った。
表示しているコマンドをAutoHotkey同梱のCHMヘルプで開いたり、エディタで対応ファイルを開いたり、ワンキーで保存して閉じたり、フォーカスを移動せずに差分表示を横スクロールできるようにしたりして快適になった。
69管理人 ★:06/09/06 17:31 ID:???
2005年05月06日
■AutoHotkey(http://www.autohotkey.com/)1.0.32

なんか微妙に改良されてた。
次はDLLの関数が呼べるようになるらしい。
構造体のポインタ渡しとかがどうなるか。
70管理人 ★:06/09/06 17:32 ID:???
2005年05月14日
■AutoHotkey(http://www.autohotkey.com/)1.0.33
DLL呼び出し機能が追加された模様。

とりあえず、引数を与えて返り値を得る基本的な機能は備わっている。
DMonkeyのDynaCallと違い、整数や浮動小数点値などの変数へのポインタを直接送ることができる。(DMonkeyの場合、要素が整数値一つのStructオブジェクトを作成して送ったりする必要があった)
構造体を扱うことはできない模様。
代わりに文字列としてメモリ領域を確保して、Transformコマンドなどでデータの書き換え・読み出しを行えば可能かと思ったが、文字列のヌル文字以降が削除されてしまったり、構造体メンバに文字列や構造体へのポインタが含まれる場合に対応できなかったりしてダメっぽい。


とりあえず、プロセスIDを指定して実行ファイルパスを得る関数を作った。
getLastError()
{
    return DllCall("GetLastError")
}
getProcessHandle(pid)
{
    return DllCall("OpenProcess","Int",0x001F0FFF,"Int",0,"Int",pid,"Int")
}
getProcessExeName(pid)
{
    hModule=0
    dwNeed=0
    l=0
    max:=VarSetCapacity(s,256)
    hProcess:=getProcessHandle(pid)
    if(DllCall("psapi\EnumProcessModules","Int",hProcess,"Int*",hModule,"Int",4,"UInt*",dwNeed,"Int")0)
    {
        l:=DllCall("psapi\GetModuleFileNameExA","Int",hProcess,"Int",hModule,"Str",s,"Int",max,"Int")
    }
    StringLeft,s,s,l
    DllCall("psapi\CloseProcess","Int",hProcess)
    return s
}


とりあえず説明を一部日本語化した。
DllCall()関数(http://lukewarm.s101.xrea.com/commands/DllCall.htm)
71管理人 ★:06/09/06 17:32 ID:???
2005年05月17日
■AutoHotkeyでプロセスメモリ書き換え
027.zip(http://lukewarm.s101.xrea.com/up/file/027.zip)
他のプロセスが所有するメモリを書き換える関数を作ってみた。
WriteProcessMemoryで割と簡単にできた。

ゲームなどの改造コードの実行に使える。
ホットキー割り当てやタイマー実行が柔軟に出来るのでそれなりに便利そうだ。
メモリ検索は作ってないので、改造コードを得るにはスペシャルねこまんま57号(http://www.vector.co.jp/soft/win95/hardware/se254476.html)などを使う。
72管理人 ★:06/09/06 17:33 ID:???
2005年05月26日
■AutoHotkey(http://www.autohotkey.com/)1.0.34

3番目の数字があがっているがマイナーバージョンアップらしい。
色々と修正されているらしい。
1.0.33.01とあわせた変更点。

・SuspendやHotkeyでジョイスティックホットキーのON/OFFがうまく行かないことがあるのを修正
・Transform,Derefで組み込み変数や環境変数を参照できないのを修正
・IE3以上がないWin95/NTでプログラムを起動できないのを修正
・ListLinesのなにやら正しく全部表示されない不具合が修正されたっぽい
・GUIの複数行エディットコントロールでESCを押したとき、GuiEscapeの割り当てられていないウィンドウは閉じないようにしたっぽい
・#LAltと#RAltでスタートメニューが出るのを修正
・GuiControlでデフォルトボタンなどに関連した不具合を修正
・GuiControlでTab上のPictureのリロード時の再描画を修正
・VarSetCapacity()を式の中で使ったときの動作を修正
・DllCallで関数名の後にAが付く関数のAをいつでも省略できるように修正
・DllCallで引数の型を引用符で囲まなくていいように修正(「*」つきのものは、代わりに「P」をつける)
・余りを無視した割り算を行う「//」演算子を追加
・組み込み関数を色々と追加

色々な言語で行コメントの開始に使われる「//」が割り算に使われるのはややこしい。
あと、割った余りを返す「%」のような演算子がないのも中途半端。

組み込み関数が色々と追加されたのは、いちいち自分で定義しなくて良くて楽。
73管理人 ★:06/09/06 17:33 ID:???
2005年06月01日
■AutoHotkey(http://www.autohotkey.com/)1.0.35

・SendコマンドでAltGr文字を送れないのを修正
AltGrってのがよくわからんが、こんな感じのものらしい(http://office.microsoft.com/ja-jp/assistance/HP052590631041.aspx)

・関数で省略可能引数を定義可能に
省略可能引数には、デフォルト値としてtrue,false,空文字列,数値のどれかを指定する模様。

・Tabコントロールの動作を修正

・Editコントロールで入力内容が変化したときにgラベルが実行されるように修正

・DateTimeコントロールとMonthCalコントロールを追加
1行入力欄型の日付時刻入力コントロールと、カレンダーコントロール。

・UpDownコントロールを追加
値を増減させる矢印ボタンの付いた数値入力用コントロール。

次はリストビューコントロールを追加する予定らしい。
ツリーは無いのか。
74管理人 ★:06/09/06 17:34 ID:???
2005年06月13日
■AutoHotkey(http://www.autohotkey.com/)1.0.35.10

なんかクリップボードの内容が変更されたときに実行されるOnClipboardChange(http://www.autohotkey.com/docs/misc/Clipboard.htm#OnClipboardChange)サブルーチンを設定できるようになったらしい。
コマンドでラベルを割り当てるOnExit(http://www.autohotkey.com/docs/commands/OnExit.htm)と違って、ラベルとして記述するらしい。
75管理人 ★:06/09/06 17:34 ID:???
2005年06月28日
■AutoHotkey v1.0.36(http://www.autohotkey.com/forum/viewtopic.php?t=4197&sid=1f65e2172fb5ad56d0fa3cb2b60a04aa)

GUIウィンドウに右クリックメニューをつけられるように
リストビューコントロールが追加
など
76管理人 ★:06/09/06 17:35 ID:???
2005年08月29日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)を適当に更新した
4ヶ月くらい放置していた。
とりあえず、GUI関係以外の変更点を大体書いた。
77管理人 ★:06/09/06 17:35 ID:???
2005年08月30日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)を適当に更新した
ListView以外のGUI関係の更新箇所に対応した。
78管理人 ★:06/09/06 17:35 ID:???
2005年09月01日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)を適当に更新した
とりあえず1.0.37.05分の変更点まで追いついた。
ListViewがややこしくてしんどい。
そのうちツリービューも出てくるのだろうか。

■見つけたサイト

なまず日記(http://www.tierra.ne.jp/~aki/diary/)
AutoHotkeyについて書いてあった。
ファンとか言われてるけど、実はあんまり使ってない。
ファンというと塊魂の新しいほうを思い出す。

eamatの日記(http://d.hatena.ne.jp/eamat/)
AutoHotkeyについての記述がある。
メモリリークがあるのではないかということらしい。
79管理人 ★:06/09/06 17:36 ID:???
2005年09月03日
■AutoHotkey v1.0.38(http://www.autohotkey.com/forum/viewtopic.php?t=5219&sid=0db1500df2a140e44c3a0e0506887e93)
なんか任意のウィンドウメッセージに応答する関数を設定する機能がついた模様。
これでGUI関連の対外のイベントは対応できそう。
とりあえず、こんな感じでウィンドウ全体をドラッグ可能なウィンドウの本物が作れる。

onLbuttonDown(wp,lp,msg,sender){
    SendMessage,0x0112,0xF011,0,,ahk_id %sender%
}
OnMessage(0x201,"onLbuttonDown")
Gui,add,text,,aaaaaaaaaaaaaaaaa`naaaaaaaaaaaaa
Gui,-Caption
Gui,Show
80管理人 ★:06/09/06 17:36 ID:???
2005年09月06日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)を適当に更新した
OnMessageとかの説明を書いた。
更新処理スクリプトを実行するのを忘れてて、コマンド一覧などが更新されてなかったので更新した。

OnMessageだが、ウィンドウの閉じるボタンを押したときのWM_SYSCOMMANDなど、なぜか捕らえられないメッセージがある模様。
また、コントロールをクリックしたときなども、種類によってはコントロールではなくウィンドウに送られたものとして補足されることがある。

IsLabel関数でラベルが存在するかどうかを調べることができるようになった。

GuiCloseやOnClipboardChangeのように特別な名前のラベルとして記述するものと、SetTimerやOnExitのようにイベントにラベルを割り当てるもの、OnMessageのように関数を割り当てるものが混在していてややこしい。


ほかウィンドウへのメッセージの監視は、SetWindowsHookExを使って別途用意したDLLの関数を登録すればできなくはなさそう。
フックプロシージャが呼ばれたら、AutoHotkeyのメインウィンドウにSendMessageで通知して、必要なら関数で情報を取得するとか。
81管理人 ★:06/09/06 17:37 ID:???
2005年09月09日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)を適当に更新した
とりあえず現行のバージョンに追いついた。

なにやら、仮想キーコードでホットキーを指定することができるようになった模様。
これで、なぜかIMEのOnとOffが別のキーイベントとして取得されるようになる。
こんな感じで、IMEの状態をキャレット位置に表示することもできなくはない。
~vkF3::ToolTip,直,%A_CaretX%,% A_CaretY+14
~vkF4::ToolTip,あ,%A_CaretX%,% A_CaretY+14

しかし、未確定文字列がある状態で半角/全角キーを押しても、この2つのホットキーが交互に実行されてしまう。
そして、未確定文字列を消してから半角/全角キーを押すと、一度だけ直前のホットキーではないほうが実行される。2度目からはまともになる。
そんなわけで、不完全すぎてあまり役には立たない。
82管理人 ★:06/09/06 17:37 ID:???
2005年10月03日
■音読み漢字一打鍵入力「色波弐〜いろはに〜」(http://iroha2.rona.nomaki.jp/)

よく分からんが特殊なかな入力方式を実現するAutoHotkeyスクリプトらしい。
83管理人 ★:06/09/06 17:37 ID:???
2005年10月12日
■AutoHotkey(http://www.autohotkey.com/)1.0.40

「a::b」のように記述することでキー割り当てを変更できる機能が追加された。
修飾キーとの組み合わせやキーリピートなども考慮された完全なリマップが簡単な記述で実現できるらしい。
まだ日本語環境では、CapsLockとCtrlの入れ替えはできない模様。
84管理人 ★:06/09/06 17:37 ID:???
2005年10月18日
■AutoHotkey メモ - Principia(http://principia.s54.xrea.com/index.php?AutoHotkey%20%A5%E1%A5%E2)

アクセスログより。
85管理人 ★:06/09/06 17:38 ID:???
2005年10月24日
■AutoHotkeyでBREGEXP.DLLを使う
作った。
BREGEXP(http://lukewarm.s101.xrea.com/myscripts/index.html#bregexp)
とりあえず、マッチした文字列とパターンの()内にマッチしたサブマッチ文字列を得る関数と、置換を行う関数を作った。
マッチ結果は、グローバル変数の偽配列として格納することにした。
全てのマッチ文字列を検索する関数も作った。
マッチした文字列ではなく、マッチ部分の位置を得る機能も作ろうと思ったが、面倒なんでやめた。
TransとかSplitも面倒なんで作っていない。

BREGEXPでは、処理結果を構造体として保持する。
AutoHotkeyでは構造体は使えないので、保持されたメモリ領域から値を取り出す処理を記述してやる必要がある。
ヘルプにそれらしいコードがあったが、やけに冗長なのでRtlMoveMemoryというAPIを使って代用した。
自前で確保した変数からの取り出しは上手くいったが、BREGEXPの構造体から値を取り出そうとすると0xC0000005番のエラー(メモリのアクセス違反)になる。
どうやら、AutoHotkeyが関数呼び出しのたびにBREGEXP.DLLを開放してしまっているのが悪いらしい。
自前でLoadLibrary/FreeLibraryを行うようにしたら、正常にアクセスできるようになった。
86管理人 ★:06/09/06 17:38 ID:???
2005年11月08日
■Shiftキーを短く押したときに動作するホットキー
Ctrlキーは元の位置とCapsLockの位置の両方にないと不便なので、AutoHotkeyでMS-IME95互換の英字入力トグルを実現しようと思って作ってみた。
なお、Sendで送信している{vkF2sc070}(ひらがな/カタカナ)キーにはATOKのカスタマイズで英字モードOn/Offを割り当てている。

試作一号
~LShift::return
~Lshift Up::
    if((A_PriorHotkey="~LShift")&&(A_TimeSincePriorHotkey
とりあえず作ってみた。
大文字を入力するときに押していたShiftを放したときにも誤作動すると困るので、短く押したときにだけ動作するようにした。
しかし、なぜか長く押したときにも発生する。
どうやら、ShiftキーのキーリピートでLShiftのイベントが繰り返し発生していたのが原因。
しかし、Shiftを押しながら他のキーを押したときには発生しない。
他のキーが押された時点でキーリピートが終了するための模様。
図らずも希望の動作に近いものができた。
    

試作二号
ls_state=0
~LShift::
    if ls_state=0
        ls_state=1
    else
        ls_state=2
return

~Lshift Up::
    if((ls_state=1)&&(A_TimeSincePriorHotkey
Shiftを長く押したときには発生しないようにしてみようと思い、キーリピートでのイベントを区別するようにしてみた。
Shiftを押してないときは0、最初にShiftを押すと1になり、キーリピートでのイベントでは2になる。
放すときに1なら動作を行い、0に戻す。


とりあえず大体うまくいった気がしたが、ATOKのShift+アルファベットキーで英字入力になる機能をShiftで解除する奴と重複して発生してしまうという問題が。
ATOKの方が通常入力に戻した後さらに切り替えを行って再び英字入力になってしまう。
仕方ないのでCtrlに割り当てることにした。
マウスジェスチャなどが生成するキーボードイベントで誤作動しないように、物理的な押し下げ状態をチェックするようにした。

最終版
ls_state=0
~LCtrl::
    if ((ls_state=0)&&GetKeyState("LCtrl","P"))
        ls_state=1
    else
        ls_state=2
return


~LCtrl Up::
    if((ls_state=1)&&(A_TimeSincePriorHotkey
87管理人 ★:06/09/06 17:39 ID:???
2005年11月21日
■AutoHotkeyでmigemo.dllを使用する(http://lukewarm.s101.xrea.com/myscripts/index.html#migemo)

なんとなく作ってみた。

migemoは正規表現を生成するだけなので、別途BREGEXP.DLLも使用する。
以前DMonkeyで作ったことがあるので特に苦労はしなかった。
BREGEXP.DLLを使用する関数は以前作ったが、新たに書き起こしてひとまとまりの関数群とした。

とりあえず、対象文字列がパターンに一致するかどうかを調べる関数だけ作った。
サンプルとして一覧をインクリメンタルサーチで絞り込むスクリプトを用意した。


■GetSystemPowerStatusでバッテリ容量を取得するAHK
036.zip(http://lukewarm.s101.xrea.com/up/file/036.zip)

以前作ったが忘れていた。
適当に実験的に作ったものなので、あまり実用性はない。
結果は適当に文字列として格納されるので、条件判断などに使いにくい。
88管理人 ★:06/09/06 17:39 ID:???
2005年12月05日
■色々

なまず日記(2005-12-04)(http://www.tierra.ne.jp/~aki/diary/?date=20051204#p01)
IMEの状態を表示するAutoHotkeyスクリプト。
なにやら細かいカスタマイズが可能になっているらしく凄いこだわりようだ。


http://www5d.biglobe.ne.jp/~takirin/lineage/line_tips/tips_autohotkey.html(http://www5d.biglobe.ne.jp/~takirin/lineage/line_tips/tips_autohotkey.html)
リネージュでマウスの第4,5ボタンを活用するためのAutoHotkey解説らしい。
89管理人 ★:06/09/06 17:40 ID:???
2006年01月02日
■AutoHotkeyでActiveXを利用しようと思ったけど面倒なんでやめた

C言語でCOMクライアント(http://www.asahi-net.or.jp/~kv8s-yjm/another/yja001.htm)というページを見つけたので、DllCallでActiveXを呼び出せないかと思い立つ。
とりあえず内容を見たところ、COMインターフェイスを作成すると、メソッドに対応する関数へのポインタの配列が作成されるらしい。
メソッドを呼び出すには、関数のポインタを元に関数として呼び出しを行う必要がある。
C言語などなら普通にできることだが、AutoHotkeyにはDLL名と関数名を元に呼び出しを行うDllCallしかないので、ポインタだけわかっても何の役にも立たない。
このようなスクリプト言語のために、関数のポインタと引数を与えて関数を呼び出すAPIが用意されていそうな気がするのだが、軽く調べた限りでは見つからない。
同様の関数を自前で作ってDLLにすることも考えたが、面倒なんであきらめることにした。
そのうちAutoHotkey自体に機能が搭載されることに期待する。
90管理人 ★:06/09/06 17:40 ID:???
2006年01月18日
■AutoHotkeyで一番手前のウィンドウを一番後ろに持って行く

Zオーダー順のウィンドウ切り替えを行いたい。
一番後ろのウィンドウを手前に持って来るには、WinActivateBottomを使用すればよいが、手前のウィンドウを後ろに送るのがうまくいかない。
WinSet,Bottom,,Aでアクティブウィンドウを後ろに送った後、WinActivateで一番手前のウィンドウをアクティブにすればいいはずだが、これでは常に最前面に居座っているタスクバーがアクティブ化されてしまう。
ExcludeTitleに「ahk_class Shell_TrayWnd」を設定してやれば、タスクバー以外で一番手前のウィンドウを対象にできるかと思ったが、どうしてもうまくいかない。
ExcludeTitleは「ahk_class」などが使えないという中途半端な仕様だったことを思い出した。
タスクバーにはタイトルがないので、ExcludeTitleでは除外できない。
仕方ないので、「WinSetTitle,ahk_class Shell_TrayWnd,,XABCDTrayWindowEFGH」のようにして無理矢理タイトルを設定してExcludeTitleで指定できるようにしてやった。
タスクバーにはタイトルバーがないので、タイトルを設定しても見た目に変化はない。
その他、特に副作用はない模様。
91管理人 ★:06/09/06 17:40 ID:???
2006年01月20日
■AutoHotkey(http://www.autohotkey.com/)1.0.41

「{」や「}」をLoopやIf〜、else、関数定義の最初の行と同じ行に書けるようになった。
ただし、Ifは「If(式)」のスタイルのみ、Loopは「Loop,回数」の奴のみ。
JavaScript系などでは、一行にまとめて書くのが好きだったので、この変更はありがたい。

A_AhkPathという変数でAutoHotkey.exeのパスを知ることができるようになった。
時々必要になるので便利だ。

#IfWinActive/Existという指令で、特定のウィンドウのアクティブ/存在時のみ有効になるホットキーを設定できるようになった。
従来だと、IfWinActiveコマンドで分岐して除外したいウィンドウには元々のキーをSendするか、アクティブウィンドウを監視してホットキーの有効・無効を切り替えるなどの方法があったが、割り当てるキーが増えるといちいち記述するのが面倒だった。
この指令を使用すれば、条件を1行書くだけで済む。

ただし、あるソフトがアクティブの時は動作A、その他の場合は動作Bというように、同じホットキーに条件によって別の機能を割り当てるようなことには使えない。
特定のソフト使用時のみ起動しておくスクリプトなどでは便利そう。

AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)は、とりあえず今回の変更部分の日本語説明を書いた。
#IfWinActive(http://lukewarm.s101.xrea.com/commands/_IfWinActive.htm)
92管理人 ★:06/09/06 17:40 ID:???
2006年01月21日
■AutoHotkeyでタスク切り替えを作ってみた

作ってみることに。
とりあえず、Alt+Tabに表示するウィンドウをどう判定するかを考える。
フォルダオプションなどのダイアログなど、タスクバーに表示されないのにAlt+Tabに表示されるウィンドウがあったり、色々と謎が多い。

やっかいなのがDelphi製のソフトのTApplicationというクラス名のウィンドウ。
可視ウィンドウ扱いで、タスクバーにはこのウィンドウのタイトルが表示されるが、実際には大きさがゼロで画面には表示されない。
VxEditorなど、TApplicationが不可視になっているものもある。
Alt+Tabのリストには、実際に見えているウィンドウが表示されるが、中にはTApplicationがAlt+Tabのリストに表示されているらしいものもあってややこしい。

とりあえず、ウィンドウスタイルが条件になっているのだろうと思い、条件を調べることに。
全てのウィンドウスタイルと拡張スタイルについて、そのスタイルを持つ可視ウィンドウの一覧を列挙するというスクリプトを作成し、Alt+Tabの表示と比較してみたところ、とりあえずWS_DISABLEDになっていると表示されないことがわかった。
WS_EX_TOOLWINDOWはAlt+Tabに表示されないという説明があったが、WS_EX_TOOLWINDOWでもAlt+Tabに表示されるものがあるので当てにならない。


結局よくわからないので、、適当にそれっぽい物を組み合わせることに。
WS_POPUPを除外すれば大体正しくなるが、フォルダオプションのダイアログなどが表示されなくなってしまうので、WS_POPUPなウィンドウで除外したくないものに共通しているスタイルを探したところ、0x80(DS_MODALFRAME)がそれっぽかった。
微妙にAlt+Tabとは違う気がするが、面倒なんでこれでいいことにする。


リストの表示には、とりあえずリストビューを使ってみる。
せっかくだから、ウィンドウのアイコンを表示できるようにしてみる。
AutoHotkeyの標準機能では、ファイルからアイコンを追加することしかできないが、ImageList_AddIconというAPIでアイコンハンドルを指定して追加することができるらしい。
アイコンハンドルは、WM_GETICONメッセージで取得する方法と、GetClassLongというAPIでGCL_HICONを調べる方法があるらしいが、取得できる場合とできない場合がある。
両方試して、それでも駄目なら大きいアイコンで代用するようにしたら、ほとんどのウィンドウのアイコンを取得できるようになった。

そんなわけで、とりあえず作ったもの。
ついでだからウィンドウスタイルなども表示し、プロセス名でソートするようにしてみた。
WinGet,w,List,,,joijpouhpoijjjjjjj
Gui,Margin,0,0
Gui,Font,s9
Gui,Add,ListView,w800 r%w% vLv gLvEvent AltSubmit,HWND|Title|Class|Pid|ProcessName|Style|ExStyle
himl:=IL_Create(w,w,0)
LV_SetImageList(himl,1)
cnt=0
Loop,%w%{
    id:=w%A_Index%
    SetFormat,Integer,H
    WinGet,s,Style,ahk_id %id%
    SetFormat,Integer,D
    if((!(s&0x08000000))&&((s&0x80)|| !(s&0x80000000))){
        cnt++
        WinGet,e,ExStyle,ahk_id %id%
        WinGet,pid,PID,ahk_id %id%
        WinGet,pn,ProcessName,ahk_id %id%
        WinGetClass,c,ahk_id %id%
        WinGetTitle,t,ahk_id %id%
        i:=DllCall("GetClassLong",UInt,id,Int,-34)
        if(i=0)
        {
            i:=DllCall("SendMessage",UInt,id,UInt,0x7F,UInt,0,UInt,0,UInt)
            if(i=0)
            {
                i:=DllCall("SendMessage",UInt,id,UInt,0x7F,UInt,1,UInt,0,UInt)
            }
        }
        icon:=DllCall("ImageList_AddIcon",Int,himl,Int,i,Int)+1
        LV_Add("Icon" . icon ,id,t ,c,pid,pn,s,e)
    }
}
LV_ModifyCol()
LV_ModifyCol(2,300)
LV_ModifyCol(3,120)
LV_ModifyCol(5,"Sort")
h:=20+cnt*13
GuiControl,Move,LV,h%h%

Gui,Show,AutoSize
return


LvEvent:
If(A_GuiEvent="Normal"){
    LV_GetText(id,A_EventInfo,1)
    WinActivate,ahk_id %id%
    ExitApp
}
return
93管理人 ★:06/09/06 17:41 ID:???
2006年01月23日
■AutoHotkeyでタイトルバーのクリックした場所によって分岐させる

AutoHotkeyのスレッドで話題に上がっていた奴。
WM_NCHITTESTという奴でどの座標がどんな部分かを調べられるらしい。
どうもAutoHotkeyのSendMessageは当てにならないので、DllCallで直に呼んでやったらうまくいった。
この間のアイコンの奴もそんな感じだった。
どっかの日本語マニュアルで座標はクライアント座標系で寄越せとか書いてあったが、手元の少し古いMSDNの英語リファレンスにはrelative to the upper-left corner of the screenとあったのでそのようにした。

返り値による分岐では、IsLabelとGoToで擬似的にswitch-caseのような感じにしてみた。


~MButton::
CoordMode,Mouse,Screen
MouseGetPos, x, y, id
a:=DllCall("SendMessage",UInt,id,UInt,0x84,UInt,0,UInt,x | y


以前、マウスクリックメッセージをOnMessageで処理してウィンドウの好きな場所をドラッグできるようにする方法を考えたが、これもWM_NCHITTESTを処理すれば数行で済むらしい。
しかし、WM_NCHITTESTはウィンドウ上をマウスカーソルが通過している間中送られてくるので、スクリプト側で処理すると無駄に重くなる気がする。
まあ、試したところCPU使用率は1%位にしかならなかったので、気にするほどではないか。

OnMessage(0x84,"OnHitTest")
Gui,add,Text,,aaaaaaaa`nbbbbbbb
Gui,Show
OnHitTest(w,l){
    return 2
}
94管理人 ★:06/09/06 17:41 ID:???
2006年01月26日
■AutoHotkeyで"タスクトレイに最小化"

AutoHotkeyでは、タスクトレイアイコンは通常一つだけしか持てない。
しかし、Shell_NotfyIconというAPI関数を使えばアイコンを作成できる。
作成したアイコンを操作すると、アイコン作成時に関連づけたウィンドウに指定した番号のメッセージが送られ、作成時に指定したアイコンIDと操作の内容が通知される。
これをOnMessageで捉えて、アイコンIDや操作に応じた動作を行えばよい。

とりあえず、このあいだのタイトルバーをホイールクリックする奴と、その前のウィンドウのアイコンを取得する奴と合わせて、タイトルバーをホイールクリックすると擬似的にタスクトレイに格納するというのを作ってみた。
格納したウィンドウは、トレイアイコンの何らかのクリック動作で復元される。
右クリックではメニューを出すようにしようかと思ったが、「復元」以外にコマンドが要らない気がするのでやめた。
プログラムが終了するときには自動的にすべてのアイコンを復元するようにした。

ホイールクリックのホットキーでは、MButtonをMButton upにし、カーソル下のウィンドウがアクティブかどうかをチェックする動作を加えた。
これにより、タイトルバー上でホイールを押し下げた後、タイトルバー外までカーソルを移動してから放すことで、キャンセルが行えるようになった。
クリック系の動作としてはこれが望ましい。

Shell_NotfyIconでは、いちいち構造体で情報を与えてやらないとならない。
Shell32.dllのバージョンによっては拡張機能が利用できるらしいが、とりあえず一番古くて簡単な奴を使うことにした。
なぜか操作を通知するメッセージの番号が指定できるようになっている。
AutoHotkeyのアイコンでは0x404が使われているようだが、標準アイコンの操作イベントはどうでもいいので、別の番号を指定して自分で作成したアイコンの分だけをOnMessageで捉えるようにした。

操作通知メッセージのlParamで通知される操作内容の番号の意味が載っている資料がなかった。
第1ビットがマウスボタンの押し上げフラグかと思ったが、違うらしい。
とりあえず、
0x200がカーソルが通過した
0x201:左ボタンを押した
0x202:左ボタンを放した
0x203:左ダブルクリック
0x204:右ボタンを押した
0x205:右ボタンを放した
0x206:右ダブルクリック
0x207:中ボタンを押した
0x208:中ボタンを放した
0x209:中ダブルクリック
までは調べた。
第4,5ボタンは利かないっぽい。
なんで0x200番からなのかはよくわからん。

CreateStruct(size)
{
    return DllCall("GlobalAlloc",UInt,0,UInt,size,UInt)
}
DestroyStruct(pStruct){
    DllCall("GlobalFree",UInt,pStruct,UInt)
}
StructSetInt(pStruct,offset,val){
    DllCall("RtlMoveMemory", UInt,pStruct+offset, UIntP,val, Int,4)
}
StructSetStr(pStruct,offset,val){
    DllCall("RtlMoveMemory", UInt,pStruct+offset, Str,val, Int,StrLen(val)+1)
}

numTrayIcon=0
Process,Exist
pid:=ErrorLevel
DetectHiddenWindows,On
WinGet,myhwnd,id,ahk_pid %pid% ahk_class AutoHotkey
DetectHiddenWindows,Off

OnMessage(0x405,"OnTrayIconEvent")
OnExit,RestoreFromTrayAll
return

GetWindowIcon(hwnd){
    i:=DllCall("GetClassLong",UInt,hwnd,Int,-34)
    if(i=0)
    {
        i:=DllCall("SendMessage",UInt,hwnd,UInt,0x7F,UInt,0,UInt,0,UInt)
        if(i=0)
        {
            i:=DllCall("SendMessage",UInt,hwnd,UInt,0x7F,UInt,1,UInt,0,UInt)
        }
    }
    return i
}

;引数にアイコンハンドルを指定
;自動的にIDが割り振られて返される
CreateTrayIcon(hicon,tooltip){
    global numTrayIcon,myhwnd
    ret=0
    StringLeft,tooltip,tooltip,63
    pnid:=CreateStruct(88)
    StructSetInt(pnid,0,88)
    StructSetInt(pnid,4,myhwnd)
    StructSetInt(pnid,8,11+numTrayIcon)
    StructSetInt(pnid,12,7)
    StructSetInt(pnid,16,0x405)
    StructSetInt(pnid,20,hicon)
    StructSetStr(pnid,24,tooltip)
    if(DllCall("Shell32.dll\Shell_NotifyIcon",UInt,0,UInt,pnid,UInt)){
        numTrayIcon++
        ret:=numTrayIcon
    }
    DestroyStruct(pnid)
    return ret
}
;引数にIDを指定
DeleteTrayIcon(id){
    global myhwnd
    pnid:=CreateStruct(88)
    StructSetInt(pnid,0,88)
    StructSetInt(pnid,4,myhwnd)
    StructSetInt(pnid,8,10+id)
    ret=0
    if(DllCall("Shell32.dll\Shell_NotifyIcon",UInt,2,UInt,pnid,UInt)){
        ret=1
    }
    DestroyStruct(pnid)
    return ret
}
MinimizeToTray(hwnd){
    global
    local t,ti
    WinGetTitle,t,ahk_id %hwnd%
    ti:=CreateTrayIcon(GetWindowIcon(hwnd),t)
    TrayIcon%ti%:=hwnd
    WinHide,ahk_id %hwnd%
}
RestoreFromTray(id,activate=1){
    global
    local hwnd
    hwnd:=TrayIcon%id%
    if(hwnd!=0){
        DeleteTrayIcon(id)
        WinShow,ahk_id %hwnd%
        if(activate){
            WinActivate,ahk_id %hwnd%
        }
        TrayIcon%id%:=0
    }
}
OnTrayIconEvent(w,l,m,h){
    ;マウスボタンが放されたとき解放
    if(l=0x202||l=0x205||l=0x20a){
        RestoreFromTray(w-10)
    }
}

RestoreFromTrayAll:
    Loop,%numTrayIcon%{
        RestoreFromTray(A_Index,0)
    }
    ExitApp
return

~MButton up::
    CoordMode,Mouse,Screen
    MouseGetPos, x, y, h
    If(WinActive("ahk_id " . h) && DllCall("SendMessage",UInt,h,UInt,0x84,UInt,0,UInt,x | y <<16,UInt)=2){
        MinimizeToTray(h)
    }
return
95管理人 ★:06/09/06 17:41 ID:???
2006年01月27日
■タスク切り替えの奴の改良
038.zip(http://lukewarm.s101.xrea.com/up/file/038.zip)

色々と改良した。

ウィンドウが非アクティブになったら終了するようにした。
WM_ACTIVATEをOnMessageで捕らえて、非アクティブ化だったら終了する。

ウィンドウのスタイルなどを色々と変更。
タイトルバーを無くして、タスクバーに表示されなくし、常に最前面に表示するように。
リストでは、一旦タイトルでソートしてからプロセス名でソートし、Z順位にかかわらず同じ並びになるようにした。

リストビューをポイントして選択しクリックで決定する奴にした。
なぜか、決定時にAutoHotkeyのイベントが発生するのが遅いので、自前でリストビューの決定通知を受け取るようにした。
リストビューの項目が決定された場合、WM_NOTIFYで情報が送られてくる。
詳細は構造体に格納されているので、RtlMoveMemoryで取り出して判定することに。

イメージリストは、アイコンのサイズがシステムに依存しているようなので、自前でImageList_Createを行ってフォントサイズに合わせたアイコンサイズにするようにした。
ついでに、大きいアイコンとフォントのバージョンを作成した。
大きい方がマウスで選択しやすくて良いが、表示速度や画面の専有面積などが気になる。

更に、常駐版を作成した。
常駐版では、2回目以降の表示の際、ウィンドウのZ順位が他のウィンドウの下になっていて、一旦可視状態になってから最前面に移動するのが鬱陶しいので、SetForegroundWindowでZ順位を一番上にしてから表示させるようにした。
リストビューの項目の幅などはすべて固定にして、ウィンドウ表示時の処理をできるだけ削減したら、かなり一瞬で表示されるようになった。
割り当てるホットキーは、せっかく5ボタンマウスを買ったのに未だ使い道の定まっていないXButton1に割り当ててみた。
ついでに、XButton1を放したときにリスト上なら決定、リスト外ならキャンセルを行うようにした。
更に、MButtonで選択ウィンドウを閉じるという機能も付けた。
かなり便利な感じになった。
96管理人 ★:06/09/06 17:41 ID:???
2006年01月30日
■AutoHotkeyで起動したプロセスの標準入出力を読み書き
039.zip(http://lukewarm.s101.xrea.com/up/file/039.zip)

作ることに。

CreatePipeでパイプを作って、それをセットしてCreateProcessしてやればいいらしい。
とりあえず見つけた資料に従って作成した。
なぜか、CreateProcessが失敗する。
なぜか知らんが、STARTUP_INFOを0で埋めて作成するようにしたらうまくいった。
資料のコードは0で初期化されることを前提に書かれていたようだ。

CreateProcessで使うPROCESS_INFOにプロセスハンドルやIDが入るらしい。
こちら側で使うためのパイプハンドルをどこに保持しておくかで迷ったので、とりあえずこいつの後ろに12バイト余計に確保して、そこに置いておくことにした。
関数利用側は、このPROCESS_INFOのポインタだけを保持しておけばいいことになる。

入力への書き込みは適当に作ったら動いた。
しかし、sortのようなプログラムにテキストデータを与えるときは、入力の終わりを知らせてやらないと、出力を行ってくれない。
とりあえず、入力のハンドルを閉じたら、出力を開始してくれたので、入力ハンドルだけを閉じる関数を用意した。

パイプからデータが送られてくるときの動作がよくわからない。
入力待ちで相手プロセスの出力が停止していることと、出力の最中でデータの途中までがパイプに入っていることをどうやって見分けるのか?
とりあえず、PeekNamedPipeでパイプに残ったデータの量を調べて、50ミリ秒の間増加しなければ出力が停止しているとみなすことにした。

とりあえず、これでcmd.exeとかと対話できるようになった。
使う機会があるかは不明。

pingのように小出しに出力を行うプログラムは、終了を待ってから一気に読みたいので、GetExitCodeProcessで終了まで待つ関数を用意した。



作成途中、関数がエラーを返すことがあったので、GetLastErrorでエラーコードを調べようとしたが、常に127番になってしまう。
調べてみたら「指定したプロシージャが見つかりません」と言うことらしい。
DllCall自体は成功しているので不審に思い、「DllCall("kernel32.dll\GetLastError")」としてみたところ、エラーコードが変わった。
どうやら、モジュール名を指定してやらないと、デフォルトのモジュールを一つずつ調べて当該関数が呼び出せるかを試しているらしい。
効率化したい場合は、必ずモジュール名を指定してやった方がいいようだ。

しかし、モジュール名を指定してやってもなお、DllCall内で何らかのエラーが発生しているようで、GetLastErrorで正しいエラーコードを知ることができない。
困ったもんだ。
97管理人 ★:06/09/06 17:43 ID:???
2006年02月02日
■AutoHotkeyスクリプトの高速化
SendMessageには、コマンドで送る方法とDllCallで送る方法がある。
どちらが速いのか。
コマンドの方では、「ahk_id %hwnd%」の解釈が行われるが、遅くならないのか?
以下のスクリプトで試してみた。
Process,Exist
pid:=ErrorLevel
DetectHiddenWindows,On
WinGet,myhwnd,id,ahk_pid %pid% ahk_class AutoHotkey
SetBatchLines,-1

tc:=A_TickCount
Loop,20000{
    DllCall("SendMessage",UInt,myhwnd,UInt,0x0,UInt,0,UInt,0,UInt)
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,20000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
}
l2:=A_TickCount-tc

結果は、1079対172でコマンドの方が圧倒的に速かった。

次に、コマンドの方でLastFoundWindowを利用したらどうなるかを調べた。
tc:=A_TickCount
Loop,200000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
}
l1:=A_TickCount-tc
DetectHiddenWindows,On
IfWinExist,ahk_id %myhwnd%
{
DetectHiddenWindows,Off
    tc:=A_TickCount
    Loop,200000{
        SendMessage,0,0,0
    }
    l2:=A_TickCount-tc
}
234対125で、LastFoundWindowを使った方が高速なことがわかった。

しかし、わざわざIfWinExistを1行増やすと、その分遅くなるはずである。
以下のようにして、内側で何回ウィンドウ操作を行ったら、IfWinExistを使った分の元を取れるかを計測した。
tc:=A_TickCount
Loop,100000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
    SendMessage,0,0,0,,ahk_id %myhwnd%
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    IfWinExist,ahk_id %myhwnd%
    {
        SendMessage,0,0,0
        SendMessage,0,0,0
    }
}
l2:=A_TickCount-tc
内側が1回の時、828対859で、IfWinExistを使った方が遅くなった。
しかし、2回にすると、1578対1375でIfWinExistを使った方が速くなる。

次に、DllCallの気になる部分を調べる。
引数の型は「Int」のようにするのと「"Int"」のようにするのがあるが、どっちが速いか。
tc:=A_TickCount
Loop,20000{
    DllCall("SendMessage",UInt,myhwnd,UInt,0x0,UInt,0,UInt,0,UInt)
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,20000{
    DllCall("SendMessage","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0,"UInt")
}
l2:=A_TickCount-tc
1047対296で、文字列として渡した方が圧倒的に速くなる。

次に、モジュール名を省略しなかったらどうなるか。
tc:=A_TickCount
Loop,100000{
    DllCall("SendMessage","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0,"UInt")
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    DllCall("User32.dll\SendMessageA","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0,"UInt")
}
l2:=A_TickCount-tc
1500対1360で、できるだけ詳しく指定した方がほんの少し速くなる。

返り値を得ないとき、最後の返り値の型指定を省略したらどうなるか。
tc:=A_TickCount
Loop,100000{
    DllCall("User32.dll\SendMessageA","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0,"UInt")
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    DllCall("User32.dll\SendMessageA","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0)
}
l2:=A_TickCount-tc
1470対1359で、返り値の型を省略した方がほんの少し速かった。

高速化したDllCallと、SendMessageコマンドで、返り値を変数に格納する速度を計測する。
tc:=A_TickCount
Loop,10000{
    r:=DllCall("User32.dll\SendMessageA","UInt",myhwnd,"UInt",0x0,"UInt",0,"UInt",0)
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,10000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
    r=%ErrorLevel%
}
l2:=A_TickCount-tc
141対94で、やっぱりコマンドの方が速かった。

「var2:=var1」による代入と「var2=%var1%」による代入ではどっちが速いか。
tc:=A_TickCount
Loop,100000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
    r=%ErrorLevel%
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    SendMessage,0,0,0,,ahk_id %myhwnd%
    r:=ErrorLevel
}
l2:=A_TickCount-tc
875対860で、:=の方がごくわずかに速かった。

定数を代入する場合はどうか。
tc:=A_TickCount
Loop,1000000{
    r=100
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,1000000{
    r:=100
}
l2:=A_TickCount-tc
391対390で、ほとんど変わらない。

加算する場合はどうか。
r=0
tc:=A_TickCount
Loop,1000000{
    r+=1
}
l1:=A_TickCount-tc
r=0
tc:=A_TickCount
Loop,1000000{
    r:=r+1
}
l2:=A_TickCount-tc
937対1188で、「+=」の方が速い。

変数をいくつも足すような場合はどうか。
x=200
tc:=A_TickCount
Loop,100000{
    r=100
    r+=%x%
    r+=%x%
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    r:=100+x+x
}
l2:=A_TickCount-tc
足し算の場合、1回の時は985対1015で「:=」の方が遅かった。
しかし、2回足した場合、1547対1188で「:=」の方が速い。

文字列の連結はどうか。
VarSetCapacity(r,100000)
r=
tc:=A_TickCount
Loop,100000{
    r=%r%x
}
l1:=A_TickCount-tc
VarSetCapacity(r,100000)
r=
tc:=A_TickCount
Loop,100000{
    r:=r . "x"
}
l2:=A_TickCount-tc
47対13312で「=」の方が圧倒的に速い。

複雑な式の場合はどうか。
x=200
y=400
z=10
tc:=A_TickCount
Loop,100000{
    r=100
    r+=%x%
    r*=%y%
    r/=%z%
}
l1:=A_TickCount-tc
tc:=A_TickCount
Loop,100000{
    r:=(100+x)*y/z
}
l2:=A_TickCount-tc
266対468で、やはり「:=」は遅かった。

まとめると、
・SendMessageはDllCallでやるよりコマンドでやった方が速い
・同じウィンドウを2回以上操作する場合、毎回「ahk_id %hwnd%」で指定するより、IfWinExistを使ってLastFoundWindowに保持されるようにした方が速い
・DllCallは引数や返り値の型指定を「"」で囲んだ方が速い
・DllCallは関数名の後の「A」やモジュール名を省略しない方が若干速い
・返り値がIntやBoolだったり不要な場合は、返り値の型を省略した方が速い
・変数に変数を代入する場合、「var2=%var1%」による代入より「var2:=var1」による代入の方が速い
・変数に定数を加算する場合、「:=var+1」より「var+=1」の方が速い
・変数に定数+変数を代入する場合、「var=100」「var+=%x%」のようにする方が速い
・定数と2つ以上の変数を足す場合、「var:=100+x+y」の方が速い
・文字列の連結は「var:=var . "str"」より「var=%var%str」とする方が速い
・括弧などを使った複雑な式の場合、「:=式」とするより「var*=」等を使った方が速くなるときがある
98管理人 ★:06/09/06 17:44 ID:???
2006年02月03日
■AutoHotkeyのListViewをいじる

DllCallでImageList_Createを行えば、任意のサイズでアイコンを表示できる。
画像の縮小表示と組み合わせれば、任意のサイズの画像サムネイルが可能かと思って試してみたら、可能だった。

Gui,Add,ListView, w640 h480 r%w% vLv Icon,name
himl:=DllCall("ImageList_Create",Int,256,Int,256,UInt,0x21,Int,w,Int,w,UInt)
LV_SetImageList(himl,0)
n:=IL_Add(himl,"F:\pictures\cats\c22.jpg",0,1)
LV_Add("Icon" . n ,"aaaaaaaa")
Gui,Show


ExtractAssociatedIconAというAPIを使えば、ファイルやフォルダの関連づけアイコンを取得できるらしい。
このAPIにはなぜか呼び出し元プロセスのインスタンスハンドルが必要だが、GetModuleHandleというAPIで取得できるという。
とりあえず試してみたら、確かに関連づけアイコンが取得された。
hinst:=DllCall("GetModuleHandle",UInt,0,UInt)
Gui,Add,ListView, w640 h480 r%w% vLv Icon,name
himl:=DllCall("ImageList_Create",Int,32,Int,32,UInt,0x21,Int,w,Int,w,UInt)
LV_SetImageList(himl,0)
h:=DllCall("Shell32.dll\ExtractAssociatedIconA",UInt,hinst, Str,"F:\pictures\cats\c22.jpg", UShortP,0, UInt)
n:=DllCall("ImageList_AddIcon",Int,himl,Int,h, Int)+1
LV_Add("Icon" . n ,"aaaaaaaa")
Gui,Show,AutoSize

これをこのあいだのタスクリストの奴に組み込んで、何が何でもウィンドウのアイコンを取得できるようにしておくことに。
Alt+Tabの奴とはどうしても違ってしまうが、フォルダオプションのウィンドウなどもアイコンが表示されるようになった。
ALt+Tabの奴はどうやってアイコンを取得しているのだろうか?

■可能な限り正確にマウス下のコントロールを操作する
マウスホイールの操作をカーソル下のコントロールにリダイレクトするツールをAutoHotkeyで再現したい。
カーソル下のウィンドウとコントロールはMouseGetPosで取得できるが、タブブラウザのようなMDIコントロールの子ウィンドウが最大化されている場合などに誤認識が起こる模様。
いつ頃からかAltMethodというパラメータが追加され、MDI子ウィンドウに正確に対応できるようになったが、これを利用すると逆に誤認識を起こす場合がある。
たとえば、HTMLヘルプのウィンドウの「キーワード」ペインのリストなどがそうだった。

このあいだ使ったWM_NCHITTESTでカーソルがコントロール上かを判定して、おかしかったら非AltMethodで取得し直すようにしてみたら、MDIもHTMLヘルプも正確に操作できるようになった。
AltMethodと通常方式の順番を逆にすると、MDIで誤認識する。
*WheelDown::
    CoordMode,Mouse,Screen
    MouseGetPos,x,y,hwnd,ctrl,1
    IfWinExist,ahk_id %hwnd%
    {
        p:=y1
            MouseGetPos,,,,ctrl
    }
    PostMessage,0x020A,0xFF880000,%p%,%ctrl%,ahk_id %hwnd%
return

*WheelUp::
    CoordMode,Mouse,Screen
    MouseGetPos,x,y,hwnd,ctrl,1
    IfWinExist,ahk_id %hwnd%
    {
        p:=y1
            MouseGetPos,,,,ctrl
    }
    PostMessage,0x020A,0x00780000,%p%,%ctrl%,ahk_id %hwnd%
return色々と適当な感じだが、とりあえず大体のコントロールを操作できるようになった。
この例ではfwKeysの処理を省略してあるので、Shift+ホイールでIEコンポーネントの戻る・進むを行うなどの機能が利用できない。


このホイールリダイレクト機能では、正確にカーソルをコントロール上に合わせてやらないとならず、小さなコントロールを操作しづらい。
カーソルがどこにあってもアクティブなコントロールを操作できる通常の動作の方が好きだ。
99管理人 ★:06/09/06 17:44 ID:???
2006年02月06日
■もこ窓(http://tomo.panicode.com/)をAutoHotkeyでパクる
040.zip(http://lukewarm.s101.xrea.com/up/file/040.zip)
ウィンドウを縮小してしまう「もこ窓」のようなものをAutoHotkeyで実現する。

ウィンドウの描画に使っているデバイスコンテキストを取得し、リサイズしながらコピー描画する「StretchBlt」APIを実行すればいいはずなのだが、これだと他のウィンドウに隠れている部分などが正しく描画されない。
もこ窓のソースを見てみたところ、本来のウィンドウを非表示ではなく「完全に透明」にしていた。
試しに真似してみたところ、なぜかウィンドウが見えなくても全体の画像がコピーされた。
GetWindowDCの説明によると、ウィンドウの種類によって取得されるDCが違うらしい。
半透明の時は全体のバッファが格納されたDCが得られるのだろう。

DCへの直接描画は、そのままでは自動で再描画されないので、他のウィンドウに隠されたりすると、その部分が永久につぶれてしまう。
WM_PAINTメッセージをOnMessageで処理して自前で再描画するようにした。

対象ウィンドウのフィルタリングとかは面倒くさいので、このあいだの「タスクトレイに最小化」のようにタイトルバーのホイールクリックで縮小するようにした。

その気になれば縮小ウィンドウを自由にリサイズしたりすることも実現できるが、面倒なんでやめた。
100管理人 ★:06/09/06 17:44 ID:???
2006年02月07日
■AutoHotkey虫眼鏡
041.zip(http://lukewarm.s101.xrea.com/up/file/041.zip)
昨日のStretchBltを応用すれば、画面を拡大することも可能なはずである。
そこで、「拡大鏡」のようなマウスカーソル周辺を拡大するツールを作ってみる。
デスクトップ全体を対象にしたいので、「GetDesktopWindow」でデスクトップ全体のハンドルを得る。
描画はタイマーで行うようにし、基本部分はあっさりできた。

透過ウィンドウのDCが特殊になっていたことを思い出し、自分のウィンドウをTrans,255にしてみたところ、自分のウィンドウが映らず、後ろの映像が拡大されるようになった。
透過ウィンドウは一般ウィンドウ群のDCからは隔離されていて、描画時に合成処理されるのだろう。
更に、拡張スタイルの0x00080000を指定することで、マウスクリックをカーソル下に透過させるようにし、ウィンドウがマウスカーソルに追従するようにしてみた。

AlwaysOnTopで常に最前面に表示されるようにしているが、新たに表示されたメニューなどの最前面ウィンドウに負けてしまう。
そこで、描画時にWinSet,Topで最前面に移動してやるようにした。
とりあえず、メニューより前に表示されるようになった。

そんな感じで、かなり虫眼鏡っぽくなったが、使いやすいかどうかは不明。
101管理人 ★:06/09/06 17:44 ID:???
2006年02月08日
■AutoHotkeyでGUIウィンドウの空いている番号を検索
AutoHotkeyのGUIでは、複数のウィンドウを番号で区別し、99個までのウィンドウを生成できる。
特に指定がなければ、1番のウィンドウが使われる。
複数のスクリプトを組み合わせて使う場合には、番号が衝突しないように修正しなければならない。

いちいち修正しなくていいように、空いている番号で新たにGUIウィンドウを作れるような仕組みを作ることに。
「その番号のウィンドウが存在しなければ、その番号は空いている」とみなすことを考えたが、GUIウィンドウが生成されているかを調べる機能はないし、「Gui,+LastFound」等を行うと、その時点でウィンドウが生成されてしまう。
そこで、あらかじめ自分のプロセスのGUIウィンドウのハンドルを列挙しておき、取得したGUIウィンドウのハンドルがその一覧に無ければ、そのウィンドウは新たに作られたものであると判断するようにした。

newGui(){
    Process,Exist
    mypid:=ErrorLevel
    DetectHiddenWindows,On
    WinGet,h,list,ahk_pid %mypid% ahk_class AutoHotkeyGUI
    DetectHiddenWindows,Off
    Loop,99{
        found=0
        Gui,%A_Index%:+LastFound
        WinGet,hwnd,id
        Loop,%h%{
            if(h%A_Index%=hwnd){
                found=1
                break
            }
        }
        if(found=0){
            return A_Index
        }
    }
    return 0
}

Gui,Add,text,,MyGUI
Gui,Show

w1:=newGui()
Gui,%w1%:Default
Gui,add,text,,DynamicGUI 1
Gui,Show

w2:=newGui()
Gui,%w2%:Default
Gui,add,text,,DynamicGUI 2
Gui,Show
102管理人 ★:06/09/06 17:44 ID:???
2006年02月11日
■AutoHotkey(http://www.autohotkey.com/)1.0.42
アクティブウィンドウなどの条件でホットキーの動作の有無を切り替える機能が改良され、同じホットキーに条件によって別の動作をさせることが可能になったらしい。
103管理人 ★:06/09/06 17:45 ID:???
2006年02月14日
■AutoHotkeyでプログラムファイルの説明などを取得
あまり使い道なさそうだが、とりあえず作ってみた。

/*
fn
ファイルパスを指定
type
以下の何れかを指定
CompanyName 会社名
FileDescription 説明
FileVersion ファイル・バージョン
InternalName 内部名
LegalCopyright 著作権
OriginalFileName 正式ファイル名
ProductName 製品名
ProductVersion 製品バージョン
Comments コメント
LegalTrademarks 商標
PrivateBuild プライベート・ビルド情報
SpecialBuild スペシャル・ビルド情報


MsgBox,% GetStringFileInfo("VERSION.dll","FileDescription")
*/
GetStringFileInfo(fn,type){
    len:=DllCall("VERSION.dll\GetFileVersionInfoSizeA",Str,fn, UIntP,h, UInt)
    vbuf:=DllCall("GlobalAlloc",UInt,0x40,UInt,len,UInt)
    DllCall("VERSION.dll\GetFileVersionInfoA",Str,fn, UInt,h, UInt,len, UInt,vbuf)

    DllCall("VERSION.dll\VerQueryValueA",UInt,vbuf, Str,"\VarFileInfo\Translation", UIntP,inf, UIntP,l)
    DllCall("RtlMoveMemory", UIntP,val, UInt,inf, Int,l, Int)
    SetFormat,Integer,H
    val+=0x100000000
    StringMid,l1,val,8,4
    StringMid,l2,val,4,4
    locale=%l1%%l2%
    StringUpper,locale,locale

    q=\StringFileInfo\%locale%\%type%
    DllCall("VERSION.dll\VerQueryValueA",UInt,vbuf, Str,q, UIntP,inf, UIntP,l)
    VarSetCapacity(buf,l)
    DllCall("RtlMoveMemory", Str,buf, UInt,inf, Int,l)
    DllCall("GlobalFree",UInt,vbuf)
    return buf
}
104管理人 ★:06/09/06 17:45 ID:???
2006年02月17日
■AutoHotkeyを流行らせるページ(http://lukewarm.s101.xrea.com/)更新

ウィンドウの条件ごとに別のホットキーアクションを割り当てられるようになったので、とりあえず#Ifwin...(http://lukewarm.s101.xrea.com/commands/_IfWinActive.htm)とHotkey(http://lukewarm.s101.xrea.com/commands/Hotkey.htm)の部分だけ更新した。
また、My Scripts(http://lukewarm.s101.xrea.com/myscripts/index.html)に今までに作ったスクリプトを適当に掲載した。
ホイールリダイレクトの奴は、fwKeysの部分をちゃんと作って、Ctrl+ホイールとかもリダイレクトされるようにした。
105管理人 ★:06/09/06 17:45 ID:???
2006年02月20日
■AutoHotkey(http://www.autohotkey.com/)1.0.42.03

DllCallを実行した後、「A_LastError」変数でGetLastErrorの値を参照できるようになったらしい。
内容はエラーコードの数値なので、エラーの内容を知るには以下のような感じにする。
なんか知らんが、エラーコードに対応するエラーメッセージをシステムから取り寄せているらしい。
GetError(){
    c:=A_LastError
    VarSetCapacity(buf,512)
    DllCall("FormatMessage", UInt,0x1000, UInt,0, UInt,c, UInt,0x400, Str,buf, UInt,512, UInt,0, UInt)
    return c . " " . buf
}



DllCallの最後に毎回GetLastErrorを行っているようだが、そもそもDllCallの時にLastErrorの値が変わってしまう部分を何とかしてくれればいいような気がするのだが。
106管理人 ★:06/09/06 17:46 ID:???
2006年02月23日
■AutoHotkeyでタスクトレイアイコンを直接操作
TaskTrayIcon.zip(http://lukewarm.s101.xrea.com/myscripts/TaskTrayIcon.zip)
TrayCommand(http://hp.vector.co.jp/authors/VA026310/)のように擬似的にタスクトレイアイコンの操作イベントを発生させたりするために作ってみた。

タスクトレイにアイコンを登録するとき、タスクトレイアイコンの操作イベントが発生したときに通知するウィンドウのハンドルと、そのときに送るウィンドウメッセージの番号、複数のアイコンがあるときに識別するための番号などが登録される。
これらの情報が分かれば、スクリプトからタスクトレイアイコンの操作イベントを発生させることが可能になるはずである。

TrayCommandの動作を見たところ、タスクトレイのアイコンが表示されているToolbarWindow32からTB_GETBUTTONメッセージで情報を取得しているらしい。
TB_GETBUTTONでは、ツールバーの項目の情報を格納した構造体が得られるらしい。
構造体にはdwDataというメンバがあり、アプリケーションが独自に何らかのデータを関連づけておけるようになっている。
おそらく、ここにウィンドウハンドルやアイコンの識別番号、メッセージなどが格納されているのだろう。

構造体のデータ構造がよく分からなかったが、TrayExpandのソースを調べたら見つかった。
Shell_NotifyIconで使われている構造体とは構造が違うようだが、内部データ用の形式だろうか?
このような情報はどこで仕入れてくるのか。
typedef struct _TRAYNOTIFY{
    HWND    hWnd;
    UINT    uID;
    UINT    uCallbackMessage;
    DWORD    dwInfoFlags;
    DWORD    dwDammy;
    HICON    hIcon;
}TRAYNOTIFY;

これで、必要な情報と、ついでにアイコンのハンドルが得られそうだ。

他のプロセスからウィンドウメッセージなどで構造体のデータをやりとりするときは、VirtualAllocExで当該プロセスに共有メモリを確保し、そこにデータを受け取ってからReadProcessMemoryで読み取らなくてはならないらしい。
うっかりGlobalAllocで確保したメモリに受け取ろうとしたら、エクスプローラがメモリアクセスエラーで不正終了してしまった。


アイコンの数については、TB_BUTTONCOUNTメッセージで簡単に取得できる。

そんな感じで、任意のトレイアイコンの情報を取得する関数と、アイコンの数を取得する関数を作成した。
アイコンの数だけループして、条件に一致したときに指定の操作イベントを通知するようにすれば、TrayCommandのように指定したアプリケーションのトレイアイコンを操作することができるようになる。

プロセスの実行ファイルパスを取得する関数をコピーしてくるのが面倒だったので、サンプルでは「WinGet,pn,ProcessName」の結果のプロセス名を使用して判定するようにした。



TrayExpandのようにアイコンを隠す機能も作ろうと思ったが、TB_HIDEBUTTONで非表示にすると、消したアイコンの分のスペースが空いてしまう。
そこで、Shell_NotifyIconで状態を非表示に設定することにした。
これなら、スペースをちゃんと調節してくれる。
Shell_NotifyIconに与える情報は、先ほどの関数で取得したhWndやuIDを使用すればいい。
別のプロセスのアイコンの状態を勝手に変更できてしまうとは、結構いい加減なAPIだ。

ついでに、TB_MOVEBUTTONでアイコンの順番を入れ替える関数も作った。
スタートアップの実行タイミングやプログラムの再起動でアイコンの順番が変わってしまうのは鬱陶しいので便利かも。
107管理人 ★:06/09/06 17:46 ID:???
2006年02月26日
■AutoHotkeyでfenrir風の物を作る
042.zip(http://lukewarm.s101.xrea.com/up/file/042.zip)

パフォーマンス的に可能かどうかを試すために作ってみた。

フォルダをスキャンする部分は、Loopとかを適当に使ってできた。
複数のファイルマスクを指定できるようにするのが面倒だったので、BREGEXP.DLLの正規表現で判別するようにした。
スキャン結果の書き出しでは、FileAppendを使った。
FileAppendは1回ごとに出力先ファイルを開き直すためパフォーマンスが悪いが、ファイルを1行ずつ読む「Loop,Read」でOutputFileを指定しておくと開きっぱなしにしてくれる。
いちいち何かのファイルを開かないと利用できないので困る。
とりあえず、スキャン対象のフォルダをテキストに列挙して、それをLoop,Readし、OutputFileにスキャン結果のファイルを指定するようにした。
DllCallを使えば、開きっぱなしにしたファイルに追記していくこともできるが、DllCallの処理が遅いようなので、できるだけ標準の機能を使うことにした。
スキャン速度は、とりあえずfenrirより劇的に遅いということはなかった。

検索部分では、スペース区切りで列挙されたキーワードの部分一致検索のみを実装した。
入力内容の末尾に文字が追加された場合だけ、前回の検索結果からの絞り込みを行うようにした。
6000ファイルくらいある時でも、それなりの早さで検索できた。

当初、試しにMigemoを付けてみたところ、やたらと遅くなった。
まだ絞り込み検索を行うようになっていなかったのと、入力文字が1文字だけでもMigemoで検索していたのが原因のような気がする。

フォルダ内のファイルを候補として表示する機能も付けた。
数百ファイル程度ならそれなりの速度で展開できる。

一度実行したファイルは、スキャン結果ファイルとは別に書き出しておくようにした。
このファイルでは、Tabで区切ってキーワードを記述できるようにした。
最後のTabより後がファイルパスの本体になる。
検索結果項目を実行するときは、単にRunに引数として与えているだけなので、コマンドライン引数を含めて記述することも可能な気がする。

とりあえず一通りの機能を付けてみた。
起動速度なども、とりあえず実用的な速度になっているような気がする。
fenrirはあまり使っていないので、その他の細かい挙動の違いなどは不明。
108管理人 ★:06/09/06 17:46 ID:???
2006年03月01日
■fenrir風の奴の改良
045.zip(http://lukewarm.s101.xrea.com/up/file/045.zip)
・複数ファイルの選択に対応
Ctrl+上下やCtrl+Space、Shift+上下で複数選択ができるようにした。
AutoHotkeyのListBoxでは、なぜかCtrl+上下が利かない。
とりあえずLB_系のメッセージを使って実現することに。
しかし、入力欄にフォーカスがあると、リストボックスのフォーカスが見えない。
仕方ないので、移動しながら選択を反転するようにした。
通常の動作とは異なってしまうが、とりあえずどこを選択しているのかは分かるようになった。
その他、Ctrl+Aで全選択なども付けた。

コマンドなどの引数展開で、選択ファイルを半角スペース区切りで列挙した物や、改行区切りで列挙した物をセットするようにした。

・アイテムを登録する/aコマンドの追加
・アイテムを削除する/delコマンドの追加
・その他、内部コマンドの追加・修正
内部コマンドのスクリプトはかなりシンプルに書けるので、ユーザーが自分で追加することも簡単だろう。

・コマンドの引数を変数展開するようにした
これにより、「/c %Items%」でアイテムリストをクリップボードにコピーするなど、色々と可能になった。

・/で始まる入力時にコマンドモードに移行するように
・コマンド選択モードの仕様をコマンド名と引数を直接入力するように変更
コマンドモードを割と直感的に使えるようになった。
コマンドモードに移行しても、コマンドの一覧が表示されるだけで、直接入力するのとあまり変わらないが。

・引数付きで実行したコマンドはアイテムに自動登録されるようにした
「/c %Items%」などのコマンドを素早く再実行したいときに便利かも。
内容が短いので検索しにくいかもしれないが。

・入力を行うと絞り込みが行われなくても選択状態が解除されるのを修正
これにより、上下キーでリストから選択を行った後にコマンドを入力して実行できるようになった。

・ディレクトリ展開と他のモードを同時実行可能にした
・「*」と入力するとアイテムリストをリスト表示の上限まで表示する機能
・コマンドやアイテムのWorkingDirも変数展開されるようにした
・INIファイルで任意の変数の値を設定・保存できるようにした
・タスクトレイのメニューを改良
109管理人 ★:06/09/06 17:47 ID:???
2006年03月03日
■fenrir風の奴の改良
046.zip(http://lukewarm.s101.xrea.com/up/file/046.zip)

・Migemo使用時にスキップマッチングを利用できるようにした
Migemoには「改行やスペースの連続」にマッチする正規表現を指定することで改行をまたいだ検索が行われる正規表現を生成するという機能がある。
ここに「[^\\]*」などと指定すると、キーワード中の任意の部分を省略できるスキップマッチングが実現できる。
「ahk」で「AutoHotkey」にマッチしたりするようになる。
検索結果数が増えるため、多少遅くなっているような気がする。


・スキャンデータのリムーバブルドライブ対応
USBメモリなどのリムーバブルドライブや、CD-ROMなどの光学メディアなど、ドライブ文字が変わったりドライブに挿入されているメディアが変わったりする場合に対応できるようにした。
ドライブ文字の代わりにメディアのシリアルナンバーを保存し、実行時に当該メディアを検出してパスを生成する。


・固定ドライブとRAMディスク以外は存在しないファイルを自動削除しないように


・Migemoの辞書の問題のある項目を削除するスクリプトを同梱
面倒なんで正規表現オペレーター文字を含んでいる単語を片っ端から削除することに。
9割方顔文字などのゴミデータなので問題ないだろう。
ついでに、無駄に長い単語も削除するようにした。
「\\」で全角文字を誤検出するので、BREGEXP.DLLで検査するようにした。


・読み込み専用のサブインデックスファイルを指定する機能を追加
LAN上のフォルダなどをインデックス化しておいて、複数のPCから参照したりできるようにした。


・スキャン時に対象フォルダの古いインデックスを削除するようにした


・/scanallコマンドを実装し、scan.txtの仕様を変更した
フォルダごとに個別に正規表現フィルタなどを設定できるようにした。
ついでに、スキャンを行う最低間隔を指定する機能も付けてみた。


・検索を若干高速化
一時リストのメモリをVarSetCapacityであらかじめ確保するようにしたら高速化された気がする。


・フォルダ展開時の駄目文字問題を修正
なんかA_LoopFileNameは自前でパスを区切っているらしく、2バイト目が「\」の全角文字に誤反応しやがるので、スクリプト側で親ディレクトリパスの長さ分削除してファイル名部分を切り出すようにした。


・その他色々修正




色々と修正しようとスクリプトを弄っていたら、GUIウィンドウを表示した直後にメモリアクセス違反で不正終了するようになってしまった。
追加した行を削ると問題なくなり、別の場所に別のコードを追加しても駄目になる。
スクリプトが長くなりすぎた所為で不具合が起こっているのか。

とりあえず、同じ行を10000行ほど並べたスクリプトでGUIウィンドウを表示してみたが、不正終了はしなかった。
発生条件がはっきりしなくて困る。

エラーはGui,Showの中で起こっている模様。
問題のGui,Showのオプションを色々変更してみたところ、エラーが発生しなくなることがあった。
ひとまず表示動作に影響しないパターンを探して、とりあえずエラーはなくせた。
どのような原理でこんな気まぐれな不具合が発生するのか。
110管理人 ★:06/09/06 17:47 ID:???
2006年03月04日
■Visual C++ 2005 Express EditionでAutoHotkeyをビルドする

スクリプトが肥大化してきたら気まぐれで発生するようになった謎のエラーを何とかしたい。
エラー内容を見ると、「0x0000000f」というアドレスを参照しているらしい。
0x00000000ではないということは、構造体へのポインタがnullの時にメンバを参照しようとしているのだろう。

そんなわけで、ソースコードから問題の箇所を探そうとしたが、やたらと長大で挫折した。
デバッグ実行でエラーを発生させて問題の箇所を見つけてみることに。

どうやらVC7向けに作られているらしく、手持ちのVC6.0ではコンパイルできなかったので、無償提供されているVC2005EEを使うことに。
XPのSP2にしかインストールできないということで、サブマシンにインストールする。
DaemonToolsで配布isoイメージをマウントしてインストールを行い、AutoHotkeyのプロジェクトをインポートしてみたが、windows.hがないとか言われてビルドできない。
PlatformSDKがインストールされなかったらしい。
Visual Studio 2005 Express Editions_ Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う(http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/)というページに従ってインストールする。
合わせて50分くらいかかった。

とりあえずビルドを試みると、死ぬほど警告が表示された。
プロジェクトの設定で警告を切ると、いくつかのエラーが残った。
「for(char suffix」という宣言が利いていない問題は、言語の拡張設定で直った。
const char*をchar*に変換できないというエラーは、よく分からないので引数からconstを削除して黙らせた。
宣言の型が指定されていない部分がいくつかあったが、適当にintと書き足したら大人しくなった。

コンパイルは成功するようになったが、リンク時にリソースが重複しているとか言われてビルド完了できない。
設定で埋め込みマニフェストを無効にしたら、とりあえず回避できた。


そんなわけで、とりあえずビルドできたので、問題のあるスクリプトを実行させてデバッグしてみる。
GUIウィンドウが表示されてエラーが発生すると、実行中だった箇所や関数の呼び出し元、変数の内容などの情報が表示された。
思った通り、nullなオブジェクトの関数を呼び出している部分があった。
関数のローカル変数の情報を格納するオブジェクトのアドレスを格納する部分が、不正にnullになっているらしい。
通常は正しいアドレスが格納されていたので、どこかで上書きされてしまっているのだろう。

いつnullになってしまうのか調べるため、ブレークポイントを仕掛けてそのアドレスの変更を監視したところ、strlcpy関数で文字列のコピーを行っているときに上書きされてしまっているらしいことが分かった。
問題の箇所はscript.cppの以下の部分。
VarSizeType Script::GetFileDir(char *aBuf)
{
    char buf[MAX_PATH + 1]; // Uses +1 to append final backslash for AutoIt2 (.aut) scripts.
    char *target_buf = aBuf ? aBuf : buf;
    strlcpy(target_buf, mFileDir, MAX_PATH);    //!!!!!!!!!!!!!!!!!
aBufの指すアドレスにMAX_PATHを足すと、ちょうどnullになってしまった領域をまたいでいる。
aBufとして確保されている領域のサイズを考慮せずにMAX_PATH文字をコピーしてしまっているのが原因らしい。
呼び出し元を追跡すると、その変数の領域は64バイトしか確保されていないらしかった。

strlcpyが元の文字列の終端以降もコピーを行うのは妙な気がするが、Wikipediaの説明には指定されたサイズを超えないとしか書かれていないので、サイズ分丸ごとコピーされても文句は言えない。
と思ったら、よく見たらutil.hの中で自前で定義されていて、strncpyに丸投げされていた。
VCのstrncpyの説明にはコピー元の文字列が短かった場合は残りの部分を\0で埋めると書いてあったので、正しい動作らしい。

そんなわけで、原因はおおよそ特定できたが、改善策を考えるのが面倒なのであきらめた。
作者が適当に修正してくれることを祈る。


スクリプトの方は、適当にダミーの関数を追加したらとりあえず動くようになった。
いつ駄目になるか分からないので困る。
111管理人 ★:06/09/06 17:47 ID:???
2006年03月07日
■AutoHotkey(http://www.autohotkey.com/)1.0.42.06

がんばって英文を書いて公式のバグレポートに報告したところ、strncpyのバグが修正されたようで、問題のあったスクリプトが正常動作するようになった。
112管理人 ★:06/09/06 17:47 ID:???
2006年03月08日
■fenrir風の奴を修正
049.zip(http://lukewarm.s101.xrea.com/up/file/049.zip)

AutoHotkeyのバグが修正されて、エラーを気にせずに機能拡張できるようになったので、いくつか気になっていたところを改良した。

・上下キーでの移動の際、リストの上下をループするように
10個くらい候補があるときに下の方の項目を素早く選択したくなったので、一番上で↑キーを押したら一番下に行くようにした。

・IMEでEnterを押したときにIMEを無視して確定されてしまうのを修正
「/a」コマンドで日本語のタイトルを付けようと思ったら失敗したので気づいた。
ImmGetCompositionStringで変換中の文字列があったら、確定を行わないようにした。

・存在しないファイルを選択したとき、即座にインデックスから削除するようにした
ついでだから、上位フォルダのパスをチェックして、存在しない最上位階層からまとめて削除するようにした。


・「-」を付けると除外検索になるように
ノイズをまとめて消せるようにしたい。
1文字打つごとに前回の結果から絞り込む現在の方式では、「-t」と打った時点でtを含む全ての項目が消されてしまい、「-tx」になっても「tx」を含まずに「t」を含む項目が消えたままになってしまう。
除外検索があるときだけ、全候補から全キーワードで絞り込むようにすることも考えたが、打つたびに候補が増えていくというのは気にくわないのでやめた。
そこで、「-txt 」のようにスペースを打った時点で前の除外ワードによる絞り込みが行われるようにした。

・特殊記号を含むキーワードを検索する「+」記号を追加
「/scan」とか「-dict」のように特殊なキーワードと解釈されてしまう場合に「+/scan」「+-dict」のようにすることで検索できるようにした。

・コマンドの直接入力に引数を入力すると絞り込みが行われてしまう問題を修正
・その他、検索時の問題を修正

■タスクトレイアイコンをキーボードで操作するAutoHotkeyスクリプト
TrayIconList.zip(http://lukewarm.s101.xrea.com/myscripts/TrayIconList.zip)

ノートPCで使うために作った。
プロセス名とツールチップテキストをリスト表示し、キー操作に応じてダブルクリックや右クリックなどの動作を行うように。
左手だけで操作できるように、Tab/Shift+Tabにカーソル移動を、Ctrl+S/D/Rに各クリック操作を割り当てた。
当初は、修飾キー無しのアルファベットキー単独で操作できるようにしようかと思ったが、リストビューの方でインクリメンタルサーチが提供されていることに気づいたので、そっちを生かすことに。

なぜか一部のソフトでメニューにフォーカスが当たらなくて悩んだが、メニューの親ウィンドウにフォーカスをやればアクティブになるようだった。

非常駐でできるだけ高速化することに。
トレイアイコン情報取得は、このあいだ作ったモジュールを使わず、無駄な処理を省くようにした。


タスクトレイアイコン操作(http://lukewarm.s101.xrea.com/myscripts/TaskTrayIcon.zip)のモジュールの方は、ツールチップテキストを取得する関数を追加した。
113管理人 ★:06/09/06 17:48 ID:???
2006年03月09日
■AutoHotkeyシステムモニタ用関数群(http://lukewarm.s101.xrea.com/myscripts/SystemMonitor.zip)

作った。
当初、RegQueryValueExでHKEY_PERFORMANCE_DATAから構造体を取得するという面倒くさそうな話を聞いていたが、PDH.DLLという物のAPIで簡略化できるらしい。
とりあえずサンプルを移植して動かしてみたが、システム全体のCPU使用率が取得できないし、なぜかカウンターを登録するときに以上に時間がかかるし、特定のプロセスIDの状態を監視するのも面倒くさそうで気に入らない。

その後、GetSystemTimes、GetProcessTimes、GlobalMemoryStatus、GetProcessMemoryInfo等を使えば普通に取得できることが分かる。
適当に作った関数でも、十分な速度で動作している模様。

PDH.DLLの存在意義が疑われる。
メモリとかCPU以外の色々な情報を取得したいときには役立つのだろうか?
114管理人 ★:06/09/06 17:49 ID:???
2006年03月10日
■AutoHotkey用システムモニタ用関数群(http://lukewarm.s101.xrea.com/myscripts/SystemMonitor.zip)更新

PDH.DLLのAPIでは様々な情報が取得できるが、.Netの奴の何かなど、訳の分からないものやどうでもいい物が大半だった。
しかし、ディスクのアクセス量なども取得できるらしいので、とりあえず関数を作ってみることに。

取得したい情報はパス文字列で指定しなければならない。
PdhBrowseCountersというAPIで項目を選択するダイアログが出せるとのことなので、それを呼び出す関数を作成した。

とりあえずディスクのアクセス率を取得してみると、それらしい物が取得できた。
アクセス率とアイドル率を足して100にならないなど怪しいところはあるが、気にしないことにする。

次に、ネットワークの使用率を取得してみる。
パス文字列にはネットワークインターフェイスの名前が含まれる。
ネットワークインターフェイスには「MS TCP Loopback interface」というのと、PCに接続されたNICらしき物の2つがある。
実際に必要なのはNICの方だが、PCによって違うので、何らかの方法で取得しなければならない。
PDHのAPIで自動取得できるようにするのは面倒だったので、以下のような方法で取得取得してもらうことにした。
RunWait,cmd /c route print > %tmp%\route.txt,,HIDE
FileReadLine,nic,%tmp%\route.txt,4
StringTrimLeft,nic,nic,32
FileDelete,%tmp%\route.txt
とりあえずパス文字列ができたのでモニタリングしてみたが、なぜか値がおかしい。
テストダウンロードを行っているIrvineの示している転送量の70%くらいの値になってしまう。
Windowsの管理ツールにあるパフォーマンスモニタで監視しても同じなので仕様だろう。

TClockのソースを見たら、ネットワーク転送量はiphlpapi.dllというDLLの関数で取得していることが分かったので、せっかくだから移植してみることに。
データを受け取るのに必要なバッファが10KBくらいあって気持ち悪い。
構造体の定義もややこしく、メンバのアドレスオフセットを計算するのが面倒なんで、VCで適当に「printf("%d\n",(int)(&(st.dwInOctets))-(int)(&st));」のようなコードを書いて実行して調べた。
その他は、他のモニタリング関数と同じような感じで適当に作ったら動いた。

サンプルスクリプトも作ることにした。
ラベルとプログレスバーで情報を表示し、背景を透過して文字だけが浮かんでいる状態にし、最前面に表示するようにした。
とりあえず、取得できる情報を片っ端から表示することに。
HDDの情報は、ドライブの数だけ列挙する。
ついでに、DriveSpaceFree命令などを利用してHDDの空き容量も表示できるようにした。

フォントなどを工夫したら、それなりに見栄えのするシステムモニタができた。
ドライブが7つもあると無闇に縦長になってしまって邪魔だが。
なぜかスクリプトのメモリ使用量が15MBを超えていて、あまり実用性はない。
115管理人 ★:06/09/06 17:50 ID:???
2006年03月12日
■AutoHotkey製コマンドラインランチャーの奴を更新
FileLaunch.zip(http://lukewarm.s101.xrea.com/myscripts/FileLaunch.zip)

飽きてきたので正式版っぽい感じにしてスクリプト公開ページに載せた。

検索機能を少し強化した。

・正規表現検索機能を追加
せっかくBREGEXP.DLLを使っているので、任意の正規表現で検索できるようにした。
or検索とか、任意の数字列を含むファイルを検索とか、たまに役立つかもしれない。

タイプの途中でマッチングが行われると困るので、除外検索の時と同じように後ろにスペースを打つまでは検索されないようにした。


・ファイルの名前部分のみから検索する機能を追加
AutoHotkey.exeを実行したいのにAutoHotkeyフォルダ内の全てのファイルが列挙されたりすると鬱陶しいので付けてみた。
パスを区切るのが面倒なんで、正規表現を生成して検索するように。

・デフォルトの検索モードを変数で指定するように
Migemoを頻繁に使う時でもいちいち「:」を付けるのは面倒なので、デフォルトの検索モードを変更できるようにした。
「/set SMode=:」のようなコマンドでも変更できる。

・短縮検索機能を追加
「@rm」で「readme.txt」を検索するなど、短縮ワードによる検索を可能にした。
正規表現検索モードなども割り当てられるので、「@ahk」で「AutoHotkey」か「.ahk」を含むアイテムを検索すると言ったことも可能。

検索モード指定文字は打ちやすいようにShiftと組み合わせないキーにしたかったが、ファイル名に使われない文字ではMigemoに割り当てている「:」しか無かったので、あまり使われなさそうで打ちやすい位置にある「@」を割り当てることにした。
116管理人 ★:06/09/06 17:50 ID:???
2006年03月13日
■AutoHotkey製コマンドラインランチャーの奴を更新
FileLaunch.zip(http://lukewarm.s101.xrea.com/myscripts/FileLaunch.zip)


・ドラッグ&ドロップでファイルを追加できるように
マウス操作はあまり必要ないだろうが、一応付けた。


・起動時や多重起動時に任意の動作を実行させる機能を追加
スクリプト中で番号にコマンドやサブルーチンを割り当てておいて、ウィンドウメッセージで実行させるように。
メッセージを送るウィンドウを検出するのが面倒だったので、スクリプト起動時にIniファイルに書き込んでおくようにした。
スクリプト以外のプログラムからも任意のコマンドを実行させられるように、Iniファイル経由でコマンドを指定する機能も付けた。


・内部コマンドをいくつか追加
上記の機能で使用するための物や、スキャンリストにフォルダを追加する物など、いくつか追加した。


・タイマーおよび拡張子判別実行を実現させる例を追加
拡張子ごとにファイルを開くプログラムを振り分けるようなコマンドを定義できるようにしようかと思ったが、面倒なんで内部コマンドとして記述してもらうことにした。
十分簡単な記述で実現できるので、わざわざ定義ファイルによる割り当て機能を付ける必要はないだろう。

定期的にスキャンなどを実行させる機能も、設定ファイルなどを用意するのは面倒なので、スクリプト中にSetTimer命令などで記述するようにした。



そんなわけで、今度こそ実現したかった機能は一通り作り終わった。
しばらく何も思いつかなかったら正式版ということにしよう。
いつの間にか配布ZIPファイルのサイズで21KBにもなってしまっていた。
117管理人 ★:06/09/06 17:50 ID:???
2006年03月27日
■AutoHotkey(http://www.autohotkey.com/)1.0.43.00

Sendコマンドに2つの別モードが用意されたらしい。
「SendInput」コマンドでは、同名のAPIを呼び出して一括して入力内容を流し込むらしい。
かなり高速らしいが、キーフックを使用していると利用できないらしく、あまり使い道はなさそう。

「SendPlay」では、ウィンドウメッセージのような仕組みで入力内容を送り込むらしい。
一部のゲームでは、通常のSendでは操作できないがSendPlayを使うことで操作できるようになるとのことだが、SendでもSendPlayでも操作できないゲームがあった。

これらの新しいモードは、従来のモードをSetKeyDelay,-1で使用した場合よりも高速に動作するとのことである。
試したところ、確かに多少高速になっていた。
また、一連の操作の間に外部から他の操作が割り込まれて動作がおかしくなるということも避けられるらしい。

また、新たにClickコマンドが追加された。
従来のMouseClickでは、コントロールパネルで左右のボタンを入れ替えていると、MouseClickが右クリックの動作に、MouseClick,Rが左クリックの動作になっていたが、Clickコマンドでは入れ替えがあってもなくても同じ動作が行われるらしい。
118管理人 ★:06/09/06 17:55 ID:???
以上。

2006年4月以降は
管理人の雑記(http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1146398137/)

131KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08