XREA.COM Logo XREA.COM Ad

旧雑記サルベージ

1管理人 ★:06/09/06 16:57 ID:???
前に雑記を書いていたサイトが完全に消滅してしまったので、AutoHotkey関連の記事をこちらに再掲載することにする。
内容は当時のままなので、現在のAutoHotkeyとは異なっている場合があるかも。
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