XREA.COM Logo XREA.COM Ad

管理人の雑記

1管理人 ★:06/04/30 20:55 ID:???
雑記サイト移転に伴い、AutoHotkey関係はこっちに書くことに。
24管理人 ★:06/09/14 01:06 ID:???
連続投稿規制を緩和
連続投稿規制が厳しすぎるらしい。
現在、同じホストからの投稿が過去500件中5件あると書き込めないという極端な連続投稿制限を施してある。
過去に海外から大量のスパムコメントが投下されて頭に来たので、極端なホスト制限とNGワード、連続投稿制限を施してあったのである。
書き込みの少ない本掲示版では、最大5回までしか書き込めないのに等しいが、再接続してIPアドレスを変更すれば書き込めるようになるはずなので、どうしても書き込みたいのに書き込めないというケースはまれであるとの判断だった。

予想に反して頻繁に書き込みたいという人が居たので、連続投稿制限を回避する方法を用意することに。
しかし、自力で解決する努力をせずに質問を繰り返すような輩に居座られては面白くないので、規制自体の解除はしたくない。
そこで、制限回避特権を持つキャップ付きユーザーを用意し、パスワードをヒントだけ公開することに。

書き込みテストなどは以下のスレに
http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1158141074/
25管理人 ★:2006/09/15(金) 06:08:26
日本語環境でGoogleのWeb全体から検索でAutoHotkeyを検索すると、本家よりも上にここが表示されるようになってしまった。
トピックパスで全コンテンツからトップページへリンクするようにした所為だろうか。
せっかくだから、BBSの方もトピックパスとかを表示できるようにしてやった。
CGIを無理矢理上書きしてしまったので、沢山不具合がありそうだ。
26管理人 ★:2006/09/26(火) 06:08:23
AutoHotkey入門とかいうどの辺りが入門なのかよく分からないページを消し去ってやった。
代わりに、「使用例」と「使用方法」のページを作成。

「使用例」では、数行程度の基本的なスクリプトを紹介。
ほとんどの行にコメントを付けたりして、それなりに充実させた。
Tabをスペースに変換するのに、VxEditorのTab->Space変換が活躍した。

「使用方法」のページでは、インストールや実行時引数などの説明に加え、AutoHotkeyのメイン画面で表示できる情報の説明も追加した。
27管理人 ★:2006/11/07(火) 19:43:28
なにやら正規表現で検索や置換を行う関数が追加されたということで、日本語説明を作成した。
正規表現エンジンには、Perl互換のPCREというライブラリを使用しているらしい。
先読みや戻り読みに加え、条件分岐や再帰などのややこしい機能も利用できる。
日本語は駄目らしい。

http://lukewarm.s101.xrea.com/RegEx.html
http://lukewarm.s101.xrea.com/commands/RegExMatch.html
http://lukewarm.s101.xrea.com/commands/RegExReplace.html
28unnamed.ahk:2006/11/07(火) 21:17:17
乙乙
29UJ:2007/01/20(土) 20:57:24
Menu でサブメニューを作る方法がわかりません。
リファレンスの「Add , MenuItemName, :Submenu」
の項を読んで色々試しているのですが、「そんなサブメニューはない」といったエラーになり、うまくいきません。
たとえば、

あ−ああ
  いい
  うう

というメニューを作るときはどうすればよいのでしょうか。
30UJ:2007/01/21(日) 11:00:26
スミマセン。書くスレを間違えました。
31管理人 ★:2007/03/11(日) 06:04:43
1.0.46.08でDllCallに関数のアドレスを渡せるようになったので試してみた。
COMインターフェイスを取得してメソッドを呼び出す(http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1157529465/89)時などに必要な機能だが、COMについて調べるのは面倒なので、とりあえず普通の関数呼び出しをアドレス経由で行ってみることに。
hM:=DllCall("LoadLibrary",Str,"msvcrt.dll",UInt)
hP:=DllCall("GetProcAddress",UInt,hM,Str,"_mbslwr",UInt)
SetBatchLines,-1
tc:=A_TickCount
Loop,100000
{
DllCall(hP,Str,"A",Str)
; DllCall("msvcrt.dll\_mbslwr",Str,"A",Str)
}

MsgBox,% A_TickCount-tc

アドレス経由で呼び出した場合、1100ミリ秒、名前指定で呼び出した場合1450ミリ秒と、若干速くなっているようである。
あまり時間のかからない処理を行う関数を何回も呼び出す場合などは、高速化に役立つかも知れない。

また、普通にDllCallを呼び出すと、AutoHotkeyが勝手にDLLを解放してしまい、DLLが生成したハンドルなどが無効になってしまうので、従来はLoadLibraryしてからDllCallしていたが、このような場合はせっかくだからアドレス経由で呼び出すといいかもしれない。
32管理人 ★:2007/03/13(火) 09:46:32
ファイルのコンテキストメニューを表示

関数のポインタを指定して呼び出せるようになったので、IContextMenuを使ってコンテキストメニューを表示してみることに。
SHGetDesktopFolderでルートフォルダを取得後、ParseDisplayNameでファイルの親フォルダのアイテムIDリストを取得し、BindToObjectで新たなIShellFolderを取得、更にParseDisplayNameでファイルのアイテムIDリストを取得、GetUIObjectOfでIContextMenuを取得、CreatePopupMenuで作ったメニューにQueryContextMenuでメニューを追加しTrackPopupMenuで表示しコマンドIDを得てInvokeCommandで実行というような手順らしい。
インターフェイスのIDを指定するGUID構造体というのが面倒くさそうだったが、CLSIDFromStringというAPIで文字列から変換できることが分かった。

とりあえず大体動作したが、「送る」メニューが正しく表示されない。
IContextMenu2というインターフェイスなら表示できるらしいが、WM_INITMENUPOPUPなどのメッセージをIContextMenu2のHandleMenuMsgメソッドに送ってやる必要があるらしい。
しかし、TrackPopupMenuでメニューを表示している間は処理が停止するという仕組みのせいか、OnMessageでメッセージを乗っ取ろうとしてもうまくいかない。
事前にメニューのハンドルとかを取得してHandleMenuMsgを呼び出しておけばいいような気がするが、メニューの表示が遅くなるし、面倒なんであきらめた。

投稿ファイル名: FileContextMenu.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_32.zip
サイズ: 1521 bytes
33管理人 ★:2007/03/15(木) 00:17:58
COMオブジェクトを扱うモジュール

COMとActiveXってどう違うんだよ!?畜生!!
そんな感じで憎たらしいあれをAutoHotkeyから使用できるようにする関数群を作ることに。
DllCallでそこら辺のAPI呼び出してやれば大抵のことは出来るんだから、別にいちいちCOMに任せなくてもいいような気はするが。

検索したらCOMをC などで呼び出すラッパーの例がいくつか出てきた。
http://www.sol.dti.ne.jp/~yoshinor/ni/ni0003.html
http://www.hcn.zaq.ne.jp/no-ji/reseach/990905.htm
これらを参考に作ることにする。
IDispatchとかVARIANTとかBSTRとかDISPPARAMSとか、色々と構造体が出てくるのでやっかいだ。
C では「dispParams.cArgs=numArgs」で済むところも、AutoHotkeyでは構造体のメンバ配置を調べて先頭からのオフセットで指定してやらないとならない。

IDispatchでは、Invokeメソッド(vtableの6番目の関数)を経由して全ての操作を行う。
引数や返り値は、VARIANT型構造体というものに格納する。
VARIANT型構造体には、格納している値の型情報と値の実体がセットで格納される。
VT_BSTRとかVT_BOOLとか30種類近くもある。
これらを判別・変換する機能を付けなきゃならんのかと気が遠くなりかけたが、すばらしいことにInvoke内で適当に変換してくれるらしいので、全てVT_BSTRで送りつければいい。AutoHotkeyの変数も全部文字列なので、BSTRへの変換は簡単だ。
更に、VariantChangeTypeExというAPIを使えば、返り値の数値や日付時刻値も文字列に変換してくれる。
そんなわけで、AutoHotkeyの変数とVARIANT型構造体の変換関数は意外と簡単に作成できた。

問題は、変数とVARIANTの変換をいつ行うかである。
VARIANT型構造体にするのは関数内のみにして、モジュール利用者はVARIANT型構造体の存在を意識せずに使えるようにしようかと思ったが、しょっちゅう変換を行うのは無駄すぎる気がする。
また、提供関数の引数や戻り値をVARIANT型構造体にすれば、省略された引数がデフォルト値の0になることを利用して簡単に引数の数を関数内で調べられるし、関数が失敗したときに0を返すと言ったことも可能になる。
そんなわけで、利用者側もVARIANT型構造体を意識する必要がある作りにしたが、VARIANTの解放処理を呼び出す必要があったりして面倒くさい。
解放処理を自動で行う機能などをどうにかして付けたいところだ。

とりあえず、オブジェクトを生成してプロパティの取得・設定やメソッド呼び出しが動作するようになった。
エラー処理などは未実装。存在しないメソッドを呼ぼうとしたときなどは、きっと変な動作になる。

以下のような感じで使う

CoInitialize()
o:=CreateObject("Sleipnir.API")
var:=gp(o,"AddressBarString")
MsgBox,% s(var)
vf(var)
kw:=v("検索ワード")
sp(o,"SearchBarString",kw)
vf(kw)
msg:=v("AutoHotkeyから操作しています")
sp(o,"OutputVisible",V_TRUE)
vf(ivk(o,"OutputAddString",msg))
vf(msg)
Release(o)
CoUninitialize()

投稿ファイル名: ActiveX.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_33.zip
サイズ: 3529 bytes
34管理人 ★:2007/03/17(土) 06:02:24
COMオブジェクトを扱うモジュールをまともにした
http://lukewarm.s101.xrea.com/myscripts/ActiveX.zip

ええと、OLE→ActiveX→COMと名称が変っていったのか(http://ja.wikipedia.org/wiki/Component_Object_Model)
出世魚か!?調子に乗んな!!

先日作ったAutoHotkeyの値とVARIANTの変換を手動で行う方式は死ぬほど面倒くさかったので、常に自動変換されるようにすることに。
また、VARIANTにIDispatchなどのポインタが格納されているとき、VariantChangeTypeExで変換してしまうと値が失われてしまうので、型によって処理を分けることに。
その他、色々と修正した。

そんなわけで、以下のような感じで割と楽に使えるようになった。

#include %A_ScriptDir%\ActiveX.ahk
CoInitialize()
ie:=CreateObject("InternetExplorer.Application")
inv(ie,"Navigate","about:blank")
pp(ie,"Visible","true")
doc:=gp(ie,"Document")
inv(doc,"write","Hello!")
Release(doc)
Release(ie)
CoUninitialize()
35THEREMIN:2007/03/20(火) 07:08:53
唐突ですみません。THEREMINと申す者です。
タスクバーボタンの情報を取得する方法を検索していたところ、当サイトで有用な情報を見つけたので
使わせていただきました。お礼と言っちゃあなんですが、
>6 :管理人 ★:06/09/06 17:02 ID:???
>2004年07月18日
>何故かTB_BUTTONCOUNTで得る値は実際に表示されているボタンの数の2倍になっており、
>ウィンドウごとに2つのボタンが割り当てられている
について、発見したことがあったので報告しときます。

A tool to order the window buttons in your taskbar - The Code Project - C# Programming
http://www.codeproject.com/csharp/taskbarsorter.asp
このページのGroupsという項目を見ると、
>In either case, Explorer adds a dummy button, which is hidden, at the start of each group.
>These extra buttons are easy to identify, as they don't have a window handle.
と書いてあります。つまり、タスクバーに表示されるボタンは全てグループ化されたボタンであり、
グループを区別するためにダミーのボタン(クラス名が同じでハンドルがNULL)がグループの先頭に
挿入されているようです。
だから、「同様のタスクバーボタンをグループ化する」にしない場合は、見かけ上のボタン数の
2倍の数が取得される訳です。
ま、日付が3年前なんでもう解決していると思われますが、ここに書いたらウェブリソースに残ると思うので
書かせていただきました。迷惑掛けてすみません。
36管理人 ★:2007/03/20(火) 08:27:16
>>35
ああ、そういえばそんな機能もあったね。>グループ化
thx.
37管理人 ★:2007/03/20(火) 08:38:00
複数行に渡るコマンドや式の記述や、v1.0.46で追加された演算子など、色々と放置していた日本語説明を書いた。

どうやら、AutoHotkeyでは、「Var:=」のような代入や「func(」のような関数呼び出しで始まる行以外は不正な行とみなされてしまうらしい。中途半端なことしやがって。
更に、「(fp:=fopen(path))||die("fopen error")」が動作しないのは、「(」で始まる行があるとヒアドキュメントの始まりとみなされることが原因らしく、式のみの行が正しく解釈されるようになっても直りそうにない。
さすが行き当たりばったりに拡張してきただけのことはある。
38unnamed.ahk:2007/03/20(火) 12:37:42

39管理人 ★:2007/03/21(水) 11:49:40
ActiveXなんて何に使ったらいいんだ。
とりあえず思いついたもの。

・音声合成
#include %A_ScriptDir%\ActiveX.ahk
CoInitialize()
sapi:=CreateObject("Sapi.SpVoice")
inv(sapi,"Speak","Stand By? Ready!")
inv(sapi,"Speak","Set up")


音声認識をやらせるには、COMのイベントを受け取れるようにしないと駄目っぽい。面倒くさい。


・JavaScriptの実行
#include %A_ScriptDir%\ActiveX.ahk
CoInitialize()
sc:=CreateObject("MSScriptControl.ScriptControl.1")
pp(sc,"Language","jscript")
MsgBox,% inv(sc,"Eval","(new Date).toString()")


AddObjectをちゃんと作れば、複雑なブラウザ操作とかを行うのに役立つかも
40unnamed.ahk:2007/03/21(水) 19:43:09
>>37
乙です。今日休みだったのでヘルプ化してみました。
700k超あってアプロダに上げられなかったのでかさまつさんを借りてます。

chm版
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi81047.zip
41unnamed.ahk:2007/03/23(金) 13:37:56
403
42unnamed.ahk:2007/03/23(金) 23:35:38
直リンあかんのね、すんまそん
http://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi81047.zip.html
43unnamed.ahk:2007/03/24(土) 01:02:43
>>42
毎度トン&乙

で、ヴァージョンアップあったよ
UWSCもシェア版でEXE化をサポートしたらしい
44管理人 ★:2007/03/27(火) 19:43:20
動的に生成した機械語コードをDllCallで実行

マシン語コードを作成してみる(http://yokohama.cool.ne.jp/chokuto/urawaza/mcn/index.html)というページで、HSPのスクリプト内に機械語コードを埋め込んでAPIのコールバックに渡すという技が紹介されていた。
VisualC などにある関数のダンプ文字列を出力する機能を使うといいらしい。
AutoHotkeyでも何かに使いそうなので、試してみることに。

とりあえず、埋め込んだ関数をDllCallで呼び出してみる。
バイナリデータをスクリプト内に埋め込むために、ダンプした文字列をバッファに逆ダンプしてアドレスを返す関数を作る。

unDump(data){
ptr:=buf:=DllCall("kernel32.dll\VirtualAlloc",UInt,0,Int,Ceil(StrLen(data)/3),UInt,0x1000,UInt,0x40,UInt)
Loop,Parse,data,%A_Space%`n,`r
if A_LoopField is xdigit
DllCall("kernel32.dll\RtlMoveMemory", "UInt",ptr , "UCharP","0x" . A_LoopField, "Int",1)
return buf
}

テスト用に引数二つを足して返す関数を作る。
int WINAPI add(int p1,int p2){
return p1 p2;
}

ダンプ文字列は以下のようになった。
func:=unDump("55 8b ec 83 ec 40 53 56 57 8d 7d c0 b9 10 00 00 00 b8 cc cc cc cc f3 ab 8b 45 08 03 45 0c 5f 5e 5b 8b e5 5d c2 08 00")

関数として実行してみる
MsgBox,% DllCall(func,Int,100,Int,200,Int)

とりあえず動作した。
これだけでも、速度を要する処理を実行したいときに役立つかも知れない。
45管理人 ★:2007/03/27(火) 20:51:46
機械語で関数を埋め込んでマルチスレッド実行

CreateThreadというAPIでマルチスレッド処理を行えるらしい。
機械語で埋め込んだ関数を渡してマルチスレッド実行させてみることに。

とりあえず、MessageBoxAを表示する処理を別スレッド実行させてみる。
まず、C言語で関数を作る。
表示する文字列とMessageBoxAのアドレスは、適当な数値として埋め込んでおいて、実行時に書き換えなくてはならないので面倒くさい。

DWORD WINAPI ThreadFunc(LPVOID){
char *volatile m1=(char*)0x11111111;
char *volatile m2=(char*)0x22222222;
void *volatile f1=(void*)0x33333333;
((int (WINAPI *)(HWND,LPCTSTR,LPCTSTR,UINT))(f1))( NULL, m1, m2, MB_OK );
return 0;
}

ダンプしたものを埋め込んで、必要な部分を置換する。

tf:=unDump("55 8b ec 83 ec 4c 53 56 57 8d 7d b4 b9 13 00 00 00 b8 cc cc cc cc f3 ab c7 45 fc 11 11 11 11 c7 45 f8 22 22 22 22 c7 45 f4 33 33 33 33 8b f4 6a 00 8b 45 f8 50 8b 4d fc 51 6a 00 ff 55 f4 3b f4 e8 00 00 00 00 33 c0 5f 5e 5b 83 c4 4c 3b ec e8 00 00 00 00 8b e5 5d c2 04 00")

s2=Title
s1=this is test message
hUser32:=DllCall("LoadLibrary",Str,"user32.dll",UInt)
pMessageBox:=DllCall("GetProcAddress",UInt,hUser32,Str,"MessageBoxA",UInt)

sInt(pStruct,offset,val){
DllCall("kernel32.dll\RtlMoveMemory", "UInt",pStruct offset, "UIntP",val, "Int",4)
}
sInt(tf,27,&s1)
sInt(tf,34,&s2)
sInt(tf,41,pMessageBox)

実行してみる
#Persistent
th:=DllCall("kernel32.dll\CreateThread",UInt,0,UInt,0,UInt,tf,UInt,0,UInt,0,UIntP,tid,UInt)

とりあえず、それらしい動作になった。
応用すれば、COMのメソッドを別スレッドで呼び出してイベントをSendMessageでメインスレッドに通知してスクリプトで処理するというようなことも可能になるかも。かなり強引だが。
46管理人 ★:2007/03/29(木) 21:59:31
機械語コールバックの実用的な例。
imgctl.dll(http://www.ruche-home.net/)のPasteDIB()にはPASTEPROCという関数ポインタを引数で与えられる。
こいつを利用することで、透過色の使用や半透明など、特殊な貼り付け処理を行える。

例えば、以下のような関数で、PasteDIB()のlParam引数で指定した色を透過色とみなし、それ以外の部分のみ貼り付けるという処理が行える。
COLORREF CALLBACK PasteProc(LPPASTEINFO lppi){
if(lppi->colSrc==(COLORREF)lppi->lParam){
return lppi->colDest;
}else{
return lppi->colSrc;
}
}

コンパイルした関数をダンプして埋め込むとこうなる。(デバッグモードを無効にして最適化を加えたらやたら小さくなった)
pfTransPaste:=unDump("8b 4c 24 04 8b 41 04 3b 41 0c 75 02 8b 01 c2 04 00")

以下のようにして使う。
DllCall("imgctl.dll\PasteDIB",UInt,hDIBTarget,UInt,left,UInt,top,UInt,width,UInt,height
,UInt,hDIBSrc,Int,0,Int,0,UInt,pfTransPaste,UInt,0x00FFFFFF)

PASTEPROCのサンプルにあった他の関数も試してみようかと思ったが、面倒なんでやめた。
そのうちまともな画像操作ライブラリを作るときにでも作ろう。
47管理人 ★:2007/03/29(木) 23:14:48
マルチスレッド実行を手軽にする

>>45の方法では、引数の数が固定されてしまうし、関数のアドレスなどを埋め込むのが面倒なので、簡単に使えるように関数を作ることに。

スレッド用の機械語コードは動的に生成する。
返り値は、CreateThread()のlpParameter引数で与えられたアドレスに格納することに。
元となるC言語のコードは以下のようになる。
DWORD WINAPI ThreadFunc(LPVOID arg){
DWORD *p=(DWORD *)arg;
*p=((DWORD (WINAPI *)(UINT))(0x11111111))(0x22222222);
return 0;
}

ダンプしたところ、「68 22 22 22 22 b8 11 11 11 11 ff d0 8b 4c 24 04 89 01 33 c0 c2 04 00」となった。
「68 22 22 22 22」の部分が引数をプッシュしている部分である。
これを引数の数だけ繰り返す。右側の引数から順にプッシュしていくらしい。
引数が4バイト以外の時どうプッシュすればいいのかよく分からなかったが、なぜか4バイトのときと同じで構わないらしかった。stdcallの場合の仕様だろうか。
「b8 11 11 11 11」というのが呼び出し先関数のアドレスを設定している部分で、残りは返り値の格納やリターンを行っている部分。
これらを元に、指定の引数を与えて指定アドレスの関数を呼び出すコードを構築する。

返り値の格納先は別途確保しておき、そのアドレスをByref引数で指定された変数に格納することに。
その他、LoadLibraryとGetProcAddressを行う関数と、GetExitCodeThreadのラップ関数を作った。


そんなわけで、以下のような感じで手軽に別スレッド実行を行えるようになったが、何に使うのかは不明。
時間のかかる関数を実行する間スクリプトの処理を止めたくない場合などに使うのだろうか。

s2=Title
s1=this is test message
pMB:=GetProc("user32.dll","MessageBoxA")
th:=SubThreadCall(GetProc("user32.dll","MessageBoxA"),pRetVal,0,&s1,&s2,2)
Loop{
if(GetExitCodeThread(th)!=259){
break
}
}
MsgBox,% gInt(pRetVal)

投稿ファイル名: MultiThread.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_47.zip
サイズ: 1049 bytes
48管理人 ★:2007/06/21(木) 05:57:19
コールバック関数の作成などが出来るようになったらしいので、日本語リファレンスに追加した
http://lukewarm.s101.xrea.com/commands/NumGet.html
http://lukewarm.s101.xrea.com/commands/NumPut.html
http://lukewarm.s101.xrea.com/commands/RegisterCallback.html

とりあえず、>>46の奴をAutoHotkeyのコールバックで実装してみる。
TransPaste(lppi){
if(NumGet(lppi+4)=NumGet(lppi+12)){
return NumGet(lppi+0)
}else{
return NumGet(lppi+4)
}
}
pfTransPaste:=RegisterCallback("TransPaste","Fast")

試してみたところ、機械語で実装したときの100倍ほどの時間がかかった。
全ピクセル合わせて42万回ほど呼び出されているようなので仕方ないか。
49管理人 ★:2007/07/02(月) 09:25:44
日本語の説明を一通り1.0.47.00に対応させた。

OnMessage()とCriticalの割り込み条件が糞ややこしくて死ぬ。
とりあえず、メッセージ処理関数では、Critical,10000とかやって、出来るだけ早く終了するようにすれば、割り込みなどを気にしなくて済むのだろうか。

関数ライブラリ機能は、ライブラリスクリプト内で、スクリプトファイル名と同名か、スクリプトファイル名と何らかの文字列を「_」で連結した名前の関数を定義しておき、その関数を呼び出すことでライブラリスクリプトが読み込まれるというなんだかよく分からない仕様。
関数一つごとにスクリプトファイルを分けるのは面倒だし、「ActiveX_GetProp」のような糞長い関数名をいちいち呼び出すのも面倒くさい。
呼び出した関数だけでなく、同じスクリプトで定義されている関数やラベルは利用できるので、ダミーの「ActiveX()」関数を定義しておいて、利用元スクリプトの最初の方で呼び出すようにするのが妥当か。
それじゃあ#Includeとあまり変らない気がするが、#IncludeではAutoHotkey.exeがあるフォルダを基準とした場所にあるスクリプトを読み込めない。
なんカレントディレクトリなんかが基準パスになっているんだか。
50管理人 ★:2007/07/03(火) 11:28:31
ActiveX.ahkをイベントに対応させたかも
http://lukewarm.s101.xrea.com/myscripts/ActiveX.zip

コールバックを利用して作ってみることに。
主にRubyのWin32OLEのコードからパクった。
http://homepage1.nifty.com/markey/ruby/win32ole/index.html
なぜか、コネクションポイントのインターフェイスIDを得る部分がやたら長い。
正しく動いているのかよく分からんが、とりあえず動作はしている。

イベント処理関数の割り当ては、WSHのConnectObjectに準拠することに。
ConnectObjectの引数でオブジェクトと関数のプレフィクスを指定し、
何らかのイベントが発生するとプレフィクス+イベント名の関数が呼ばれる。
RegisterCallback()で動的に名前を指定して関数を呼ぶ方法を使った。
しかし、コールバック関数の引数には数値しか渡せない。
面倒なので、DISPPARAM構造体のアドレスをそのまま渡す。
evArgv、evArgcと言う関数で値を読み出せるようにしたが、あまり使わないだろう。

とりあえず、InternetExplorer.Applicationで試してみたところ、動いているような動いていないような怪しい感じ。
window.onbeforeunloadは呼ばれるのに、なぜかwindow.onunloadが呼ばれない。
後でもう少し検証するか。
51管理人 ★:2007/07/03(火) 12:22:11
そもそもWSHではIHTMLWindowにConnectObject()出来ない。
つまり、ActiveX.ahkのConnectObject()は間違っている。
52管理人 ★:2007/07/03(火) 12:30:40
そう言えば、関数ライブラリの機能を利用して、「ActiveX()」と記述するだけでライブラリフォルダから
インクルード出来るようにしたんだった。
グローバル変数の初期化はActiveX()に書いたので、どこから呼び出されても確実に初期化できるはず。


なぜか、Sleipnir2で試したら、onunloadは呼ばれるのにonbeforeunloadが呼ばれない。謎だ。

ActiveX()
pnir:=CreateObject("Sleipnir.API")
win:=inv(pnir,"GetWindowObject",inv(pnir,"GetDocumentID",gp(pnir,"ActiveIndex")))
ConnectObject(win,"WinEvent_")
WinEvent_onunload(this,prm,res){
MsgBox,window closed
}
53管理人 ★:2007/07/03(火) 22:24:38
イベントの怪しい動作は忘れることにして、他の部分をまともにした。
http://lukewarm.s101.xrea.com/myscripts/ActiveX.zip

inv/gp/ppの引数が全て文字列型(VT_BSTR)に変換されて渡される都合上、
オブジェクトやnullが渡せず、一部の機能が使用できないという問題があった。
とりあえず、「0x7FFFFFFF00000000」が与えられたらVT_NULL、0x7FFFFFFF00000000と
32ビット整数のビット和が与えられたら、下位32ビットをオブジェクトのポインタとみなして
VT_DISPATCHに変換するようにしてみた。
それぞれの値を生成するvNull()とvObj()を用意。
一部の64ビット整数が使えなくなるが、まあよいだろう

これにより、SAPI.SpSharedRecognizerを利用した音声認識っぽいものが実現可能になった。
なぜか日本語も認識されているようである。
また、MSScriptControl.ScriptControl.1を利用したJScriptの実行も、代替関数無しで済むようになった。
54管理人 ★:2007/07/04(水) 07:42:06
そう言えば、イベントを処理するCOMオブジェクトに使ったコードを流用すれば、
IDispatch型のオブジェクトを作ってスクリプトコントロールに追加し、
JScript側からAutoHotkeyの関数を呼び出したりも出来そうな感じだ。
そこまでして何の特になるのか分からんが。
55管理人 ★:2007/07/04(水) 21:36:52
とりあえず作ってみた。
イベント割り当てと同じように、
「CreateDispatchObject("MyClass_")」のようにしてオブジェクトを初期化する。
オブジェクトは、スクリプトコントロールのAddObjectで追加したりして使える。
なぜか、AddObjectの第3引数を"true"にしないと正しく動作しない。
これで、JScriptからAutoHotkeyの機能を呼び出したり出来るようになった気がする。
そんなことする意味があるのかは謎だ。
56管理人 ★:2007/07/04(水) 21:37:55
ファイル忘れてた

投稿ファイル名: mydispatch.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_56.zip
サイズ: 1199 bytes
57管理人 ★:2007/07/12(木) 21:16:48
デスクトップにモザイクを掛ける奴
http://lukewarm.s101.xrea.com/myscripts/Mosaic.zip

スクリーンショットを取るとき、同じ箇所に何度もモザイクを掛けるのが面倒なんで作ってみた。
虫眼鏡の奴の応用。
一旦一時ウィンドウに縮小コピーしてから、表示用ウィンドウに再度拡大してコピーすることで、モザイクと同等の効果を実現している。
Win+ホイールボタンでのドラッグで範囲を指定し、いくつでもモザイクを掛けられるようにした。
58管理人 ★:2007/07/17(火) 06:33:20
VxEditor用定義ファイル

キーワードやコメントなどの強調表示を行う奴。

投稿ファイル名: vxe.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_58.zip
サイズ: 3784 bytes
59管理人 ★:2007/07/17(火) 06:35:07
補完タン定義ファイル
キーワードの入力補完と、コマンドや関数のパラメータヒント表示の定義ファイル

投稿ファイル名: hokantan.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_59.zip
サイズ: 7912 bytes
60unnamed.ahk:2007/07/18(水) 01:26:46
乙です
61管理人 ★:2007/08/04(土) 14:16:18
ActiveXの奴更新

・InternetExplorer.Applicationにインターフェイス名無指定でConnectObject出来ない問題を修正。
IEがIProvideClassInfoをサポートしていないのが原因らしかった。
とりあえず、IProvideClassInfo2とIProvideClassInfoの取得に失敗したら、自力でデフォルトの接続先を検索するように修正した。
その他、ConnectObject関連をいじり回したような気がするが、変更内容は忘れた。


・イベントに参照渡しされた引数に値をセットできるように
BeforeNavigateのCancelにtrueをセットしてキャンセルしたり出来るようにしてみた。
何故かURLとかHeadersなどの変更が反映されない。
バリアントの参照渡しの書き換え方が間違っているのかと思ったが、IEの仕様らしい。
何のために参照渡ししてるんだか。

投稿ファイル名: ActiveX.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_61.zip
サイズ: 12476 bytes
62管理人 ★:2007/09/05(水) 22:06:15
なんだかの企画で、「AutoHotkeyアンオフィシャルガイド」というのを書いた。
http://www.flib.jp/generalbook/netrunBungei/854/
FlibBookとか言う独自の形式になっており、専用のビューアをインストールしないと読めない。面倒くせえ。
内容については、確か800字くらいで概要を書けと言われたから頑張って書いたはずなんだが、あれはどこに行ったのだろう……?
とりあえず、AutoHotkeyでどんなことが出来るかをスクリプト例と共に解説するというような感じの内容だったような気がする。
しかし、ページデータが480*640のJPEGになっているせいで、スクリプト例の文字が潰れて死ぬほど読みづらい。
長々と余計な文章書くんじゃなかった。
サンプルスクリプトは以下からダウンロードできるようにしてあるので、適当になんとかしてください。
http://lukewarm.s101.xrea.com/newakiba_samples.zip

このFlipViewerというプログラム、大変すばらしいことに著作権保護を意識した作りとなっており、Winshotなどの画面キャプチャプログラムが起動されていると内容を表示してくれなかったりする。
キャプチャ機能がひっそりと搭載されているIrfanViewでもダメだった。
どうやら、キャプチャプログラムのブラックリストを用意して、該当する実行ファイル名のプログラムが起動しているかをチェックしているらしい。
ご苦労なことだ。
AutoHotkeyで適当に作ったスクリプトを使ったら普通にキャプチャできたが。
63管理人 ★:2007/09/25(火) 22:58:51
Thumbsense
http://www.sonycsl.co.jp/person/rekimoto/tsense/indexj.html
の実現可能性について

調べてみたところ、CreateFileAで「\\.\SYNTP」というデバイスを開いて、DeviceIoControlというAPIでドライバにアクセスして情報を取得しているらしい。

コントロールコードとしては、0x80002000,0x80006004,0x8000A008の3つが使われていた。
それぞれのアクセスフラグビットはread/write、read、writeを表しているので、全ての制御をこの3つで行っているっぽいがよく分からない。
タッチパッドのメーカーに開発者向けのドキュメントがあった。
http://www.synaptics.com/support/dev_support.cfm
なにやら、パッドに触れている指の数や触れている面積、位置なども検出できるらしい。
しかし、DeviceIoControlで使用するコントロールコードの説明が見あたらない。
PS/2には共通のコントロールコードでもあるのだろうか?

SDKというのもあったが、何故かCOMコンポーネントだった。
これをインストールすればActiveX.ahkなどを利用して楽に制御できそうだが、面倒くさい。
なんでドライバに直接アクセスするサンプルがないのか。

Linux用のタッチパッドユーティリティのソースも見つけたが、役に立つかは不明。
http://web.telia.com/~u89404340/touchpad/

詳しく解析すれば制御方法もわかるかもしれないが、ノートPCを起動してテストするのが面倒なんでやめた。
どうせノートは動作確認やスクリーンショット撮影にしか使わないし。
64管理人 ★:2007/09/28(金) 08:03:16
>>63
昔のページにCOMを使わないらしいC++のサンプルコードがあった。
現在のページからはリンクされてないだけで、まだ普通にダウンロードできる。
http://web.archive.org/web/20021209031630/http://www.synaptics.com/support/dev_support.cfm
普通にDeviceIoControlでアクセスしている模様。
DeviceIoControlを呼ぶところまでは動いたので、AutoHotkeyでも操作できなくはなさそう。
65管理人 ★:2007/09/28(金) 11:18:24
とりあえずできた。
2台のノートPCで試したところ、安物の実験台では指の数が検出できなかったが、
埋まっていたLet's noteでは0〜2本の間で正しく取得できた。

#Persistent

Malloc(size,flag=0x40){
return DllCall("kernel32.dll\GlobalAlloc","UInt",flag,"UInt",size,"UInt")
}

TP_StartData:=0
TP_DW=0x01000000

ilen:=4*4
ibuf:=Malloc(ilen)
NumPut(TP_DW | 10 ,ibuf+4*0) ; TP_DeviceHandle,
NumPut(TP_DW | 729 ,ibuf+4*1) ; TP_PacketFingerInfo,
NumPut(TP_StartData ,ibuf+4*2) ; TP_StartData,
NumPut(0xFFFFFFFE ,ibuf+4*3)

olen:=4*2
obuf:=Malloc(olen)

dev=\\.\SYNTP
hDev:=DllCall("CreateFileA",Str,dev,UInt,0xC0000000,UInt,3,UInt,0,UInt,3,UInt,80,UInt,0)
SetTimer,GetFingerInfo,50

GetFingerInfo:
DllCall("DeviceIoControl",UInt,hDev,UInt,0x80006004,UInt,ibuf,UInt,ilen,UInt,obuf,UInt,olen,UIntP,bytes,UInt,0)
numFingers:=NumGet(obuf+4) & 0xFF
ToolTip,%numFingers%
return
66管理人 ★:2007/09/28(金) 11:40:26
普通にタップした方が使いやすいね。
67管理人 ★:2007/09/28(金) 13:53:27
http://lukewarm.s101.xrea.com/myscripts/ThumbRemap.zip
とりあえず、タッチパッドに触れているときのみ有効化したいリマップ/ホットキーを改行区切りで変数に列挙して、Loop,ParseとHotkeyコマンドでまとめて切り替えるようにした。
多分動作している。
68管理人 ★:2007/09/29(土) 09:36:57
実験用ノートのパッドはALPS製だった……
なんで中途半端にSynapticsのドライバが動作してるんだ
とりあえずドライバのAPIとかSDKみたいなものを探してみたが見つからない
そもそもDeviceIoControlで制御しているのではないようだし
調べるの面倒だ
69管理人 ★:2007/09/30(日) 00:50:36
どうやらVxdif.dllという奴の中のIOCTL_SetMouseMonitorという関数でイベントを取得しているようだ
よく分からんが、なにやらThumbsenseのウィンドウハンドルらしきものと,1,0,0xBCDを引数にしているらしい。
こいつのドキュメントはどこにあるんだ?
70管理人 ★:2007/09/30(日) 00:59:14
0xBCDってのは希望するウィンドウメッセージ番号かな?
71管理人 ★:2007/09/30(日) 01:55:10
たぶんALPSにも対応した
http://lukewarm.s101.xrea.com/myscripts/ThumbRemap.zip
72管理人 ★:2007/10/10(水) 09:25:17
ThumbRemap修正
http://lukewarm.s101.xrea.com/myscripts/ThumbRemap.zip

Synapticsのモジュールの途中にサブルーチンのreturnが含まれていて初期化処理が正常に実行されなかったのを修正。
面倒なので、GoToで飛び越えさせた。

マウスボタンなどを割り当てたキーを押したままタッチパッドから指を離すと、割り当てたキーの押し上げイベントが乗っ取られず、ボタンが押されたままになってしまうことに気付いた。
とりあえず、割り当てを解除するとき、リマップしたキーを監視するタイマーをセットして、押されたままのキーは離されるまでリマップを解除しないようにした。

キーを押した状態でタッチパッドに触れたときは、キーリピートが働いているため、一瞬してから割り当てた動作が発生する。
この状態でも大して問題はない気がするが、タッチパッドに触れた瞬間に正しく発生するようにしたい。
割り当てを有効化する際にGetKeyStateで調べればいいような気がするが、何故か正しく動作しない。
1行ごとにGetKeyStateの結果をログ表示させてみたら、ホットキーをONにする前後で不自然に結果が変っていた。
Pモードではなく通常モードにしたら動作するようになったが、物理的な押し下げ状態を正しく検出できるはずのPモードが正しく動作しないのが忌々しい。

色々直したはずなのに、まだ何故か押されたままになってしまうことがある。
タッチパッドに触れる瞬間にリマップを割り当てたキーを押したときに誤動作しているようだ。
割り当て設定を減らして割り当て有効化処理が早く終るようにしたら発生しにくくなったので、割り込み優先度の問題でホットキーイベントがキャンセルされているのかと思ったが、右ボタンを割り当てた「L」キーを押しているのに、関係ないはずの左ボタンが押された状態になったりしているので、何か別の問題らしい。

面倒くさいので諦めることにした。
73管理人 ★:2007/10/10(水) 22:37:08
>>72

色々弄っていたら、何故か全く関係ないデバッグ表示用のホットキーが暴発するようになった。
タッチパッドに触れる瞬間に割り当てたキーを離すと発生する。
問題のホットキーを削除したら、単にボタンが押しっぱなしになった。
ホットキーの割り当てを更新する前後で、キーアップのイベント割り当てが狂っているらしい。
触れてもいないしスクリプト中で呼び出してもいないホットキーラベルが勝手に実行されていることから、AutoHotkeyの欠陥だと思われる。
74管理人 ★:2007/10/11(木) 04:56:59
他スクリプトに組み込みやすくする工夫

現在、以下のような感じになっている。

ThumbRemap_Init:

;;;;;;(初期化処理)

if A_ThisLabel=ThumbRemap_Init
return
else
Goto,ThumbRemap_End

;;;;;(その他のサブルーチン、関数、ホットキーなど)

ThumbRemap_End:


スクリプトの最初に組み込まれた場合、スクリプト起動時にこのスクリプト内も実行される。
その際、真ん中の分岐でelseに分岐し、スクリプトの最後までジャンプする。
そのまま何事もなかったかのように組込元のスクリプトの続きが実行される。

スクリプトの最初以外の部分に組み込む場合は、スクリプト起動時に実行される場所に「Gosub,ThumbRemap_Init」と書いておく必要がある。
この場合は、分岐のところでreturnする。
75管理人 ★:2007/10/15(月) 04:14:03
マウスジェスチャスクリプト作り直し

5ボタンマウスを全然活用していないことに気付いたので、
3年近く前に作ったマウスジェスチャスクリプトを作り直してみることに。
4コアCPUの高性能PCを導入したので、処理の高速化にこだわるのは止めて、機能性を重視する。

核となる移動認識処理は基本的にそのままだが、
3年のうちに追加された数式などの機能を利用することで大分様変わりした。

ボタン操作に応答する部分、登録ジェスチャと照合する部分は関数として分離。
更に、全ボタン共通処理とボタン固有処理に分割した。
これで、タッチパッドの2指タッチなど、ボタン類の拡張も簡単にできるだろう。

ジェスチャとして使用可能な動作はかなり増えた。
開始トリガーには、右ボタンだけでなく全てのボタンが使用可能に。
さらに、複数のボタンを同時押しして行うジェスチャも定義可能になった。

また、移動が検出された時点でトリガーボタンを放さなくても発動するジェスチャも可能に。
発動後は、移動内容を初期化して移動認識が続行され、同じジェスチャの連続発動も可能。
「右ボタンを押しつつ上に一定以上動かすごとにPageUpを送信」のような割り当てに使う。

従来は、同じ方向にいくら動かしても同じ1ストロークとみなされていたが、
十分に長い距離を移動した場合は長距離ストロークとして認識されるようにした。
距離の閾値は、縦と横で別個に設定できる。

そんな感じで色々と柔軟な割り当てが可能になったが、仕様がややこしくなってしまったのが難点だ。

アプリケーションの条件判定は、関数として定義しておくことにした。
ジェスチャ開始時にMouseGetPosで位置とウィンドウ・コントロールのハンドルを取得しておく。
それらのウィンドウ・コントロールのクラスやタイトルなどを返す関数も用意。
「MG_CClass()="Internet Explorer_Server"」で「IEコンポーネント上」、
「MG_Y<100」で「画面の上の方から開始したとき」と言った条件も使用可能になった。


そんな感じで、だいぶ高機能になったような気がする。
軽く動作確認しただけで、設定用GUIも出来ていないが、とりあえずα版として公開。


投稿ファイル名: MouseGesture.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_75.zip
サイズ: 7648 bytes
76管理人 ★:2007/10/17(水) 08:16:42
新マウスジェスチャスクリプトβ
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip

設定インターフェイスを作ろうと思ったが、AutoHotkeyのGUIコマンドに
ツリービュー上のD&Dを認識する機能が無いのでやる気を無くした。

アプリケーションとジェスチャーのどっちを先にするか、それぞれウィンドウを分けるべきかなど、
色々迷った結果、誰もが納得するGUIを作ることは不可能という結論に達し、
設定はINIファイルを直接編集して行うようにすることに。
一見面倒くさそうだが、コピー&ペーストや検索なども使えて便利である。

記述を楽にするため、一つのセクションに同じ名前のキーを複数記述可能な独自仕様にした。
AutoHotkeyのIniReadコマンドで読み込めないため、ファイル読み込みLoopと正規表現で
自力で読み込むことに。
元々IniReadはセクション内のキー一覧を得られなくて糞だったし…。

その他、色々とまともにした。
メニューから設定ファイルを開いたり再読込したり出来るようになったので、
使い勝手も大分マシになったはずである。
77管理人 ★:2007/10/17(水) 16:57:52
新マウスジェスチャスクリプトβ
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
更にまともにした。

G=RB_URDL
G=RB_RDLU
G=RB_DLUR
G=RB_LURD
のようにして、カーソルを回し続けることで連続実行されるジェスチャを作りたい。
とりあえず、ジェスチャが成立するごとにストロークの部分がリセットされて、
再び最初から認識し直すという仕組みにしてあったのだが、途中で「RDU」のように
ストロークが欠けたりすると、以降ジェスチャが成立しなくなってしまい、
トリガーボタンを放してジェスチャをやり直すしかなくなってしまう。

そこで、存在するジェスチャの最大文字数よりも入力中のジェスチャ文字列が長くなってしまったら、
ジェスチャが成立していなくてもリセットするようにしてみた。
ミスが発生すると、2回転分くらい入力し直さないと次のジェスチャが成立しないのは多少気になるが、
とりあえずトリガーボタンを放さなくても入力し続けられるようになったのでよいだろう。

後、反応にタイムラグがあるような気がすると思ったら、「WinWait」コマンドの所為だった。
こいつは、実行時点でマッチするウィンドウが存在していても、数十ミリ秒くらい待機しやがる。
LastFoundWindowをセットするためだけの物だったので、IfWinExistに書き換えたらまともになった。

Pixiaのカンバス上で動作確認してみたら、右クリックを素早く2回押したときの2回目のボタンダウンが反応しない……
と思ったら、Windowsでは元からダブルクリックの番目のWM_RBUTTONDOWNは送られないらしかった。
ソフトによっては、DOWN/UPメッセージではない方法でボタンの状態を判別するので問題ないこともあるようだ。
78管理人 ★:2007/10/18(木) 08:46:03
新マウスジェスチャスクリプトβ
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
8方向ストローク、ホイール単独への割り当て、ダブルジェスチャを追加。


斜めストロークを認識する8方向ジェスチャを実現するには、ややこしい条件分岐が必要である。
パフォーマンスには目をつぶって、「?:」演算子で3回分岐させることに。
最初にAbs()関数とATan()関数とπ/4、π/8を駆使して斜めかどうかを判別すれば、後は単純である。
8方向モードと通常モードを選択できるようにして、両モードの処理を一つの式に
まとめてしまったため、40組み以上の括弧が使われる糞ややこしい条件式が出来てしまった。

8方向モードのストロークを表す文字は、テンキーの方向に対応した数字にすることに。
とりあえず動作しているはずだが、正確な入力が難しくてあまり使いやすくない気がする。

従来は他のボタンを押している間しか有効化できなかったマウスホイールなどは、
ボタンと同様に扱われるようにした。
これにより、ホイール単独への割り当てもこのスクリプトでまかなえるように。

従来は最初のボタンが押された時点で前回入力されたジェスチャが破棄されていたが、
前回入力終了時から一定時間以内だったら追記して認識されるという機能も付けてみた。
「X1B__X1B__」でダブルクリックに割り当てとか、「X1B_R_X1B_D_」のような複雑なジェスチャも可能に。


そんな感じで、必要以上にややこしくなってきた。
readme.txtが10キロバイトを超えている。スクリプト本体より多い……。



自分では使わなそうな機能ばかりだが、ボタンを放さずに連続実行できるジェスチャは意外と重宝している。
第4ボタンを押しながら左右に動かすと、同じクラス名のウィンドウを次々切り替え、
第4ボタンを押しながら上下に動かすと、F3,Shift+F3で次々検索を行うようにしている。
79unnamed.ahk:2007/10/18(木) 12:48:45

80管理人 ★:2007/10/19(金) 00:04:26
新マウスジェスチャスクリプトβ4くらい
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
更に改良。

MG_Abort()という関数で、即座にタイムアウトを発生させられるようにした。
「RB_D」にこれを割り当てると、右ボタンで下向きにドラッグをすることで、
即座にジェスチャをキャンセルしてドラッグ&ドロップが可能になる。
大変便利だが、今までタイムアウトを待っていたので変な感じだ。

上記の実験中に、MouseMoveでカーソル位置がずれることに気付いたので、
BlockInputコマンドで防止することに。

WM_NCHITTESTメッセージを使って、ターゲットウィンドウ上のどの部分で開始したかを
取得する関数MG_HitTest()を作成。
タイトルバーや「閉じる」ボタンなど、クリックした場所に応じた動作を割り当てられるようになった。

また、ボタン操作をエミュレートする部分をMG_Send()という関数にした。
処理自体は、ボタン定義モジュール上のサブルーチンに丸投げ。
操作エミュレート処理が複雑になっているボタン定義モジュールが作られても、
他のボタンと同じ要領で扱えるようになるはず。

特定の操作の後だけダブルジェスチャの受付を行うためのMG_Wait()関数も作った。
81管理人 ★:2007/10/19(金) 06:48:47
新マウスジェスチャスクリプトβ5くらい
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
1回「のみ」のクリック、ダブルクリックなどに違った動作を割り当てられるように

従来も、「1回目の」クリックと2回連続クリックにそれぞれ動作を割り当てることはできた。
「クリックで選択、ダブルクリックで実行」のように、1回目の動作が2回目の動作の前に必要だったり、
両方発動しても特に問題ない場合はこれで十分である。

しかし、「シングルクリックでアプリAを起動、ダブルクリックでアプリBを起動」のような場合、
両方発動してしまうとまずい。
1回目の後、2回目が入力されないのを確認してから単独クリックに対応する動作を実行する必要がある。

タイマーを利用すれば実現できるはずだが、iniファイルにタイマーサブルーチンを埋め込むのは難しい。

と思ったが、同じジェスチャサブルーチンをタイマーから呼べば良いことに気付いた。
タイマー登録したときは1、タイマーで呼ばれているときは0を返すような関数にしておけば、

if(MG_Timer(-500))
return
;;;何らかの処理

というような動作を割り当てるだけで済む。
ややこしいが、多分期待通りに動作しているはずである。
シングルとダブルだけでなく、トリプルクリック以上に割り当てることも可能。
クリック後に少し待たなきゃならないのが鬱陶しいので、あまり使う気にはなれないが。

ジェスチャ認識中にダイアログの表示などを行ってしまうとやばそうなので、
ジェスチャ認識が非アクティブになるまで待ってから実行するという機能も付けた。

あと、iniファイル解析でコメントの仕様を追加。「/*〜*/」にもある程度対応。
AutoHotkey並に適当な解析だが、iniファイルなら十分だろう。

readme.txtには、ややこしい機能を利用した設定例をいくつか書いた。
現在14KB。スクリプト本体の2倍。
82管理人 ★:2007/10/20(土) 05:47:47
新マウスジェスチャスクリプト
とりあえず正式版ということに
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip

ジェスチャ認識部分のネタが尽きたので。

テスト用に作った入力中のジェスチャをツールチップ表示する機能を、メニューから呼び出せるようにした。
83管理人 ★:2007/10/20(土) 23:47:20
設定GUIのプロトタイプ

iniファイルの仕様が固まったので、設定GUIも作ってみようかと考える。
iniファイルに合わせて、条件タブとジェスチャタブを作り、
ジェスチャタブの中に更にジェスチャ定義と動作割り当てのタブを入れようと思ったが、
何故かGui,Add,Tabでタブ上にタブコントロールを配置できない。糞が。
仕方ないので、メインタブ上にジェスチャ定義と動作割り当ての2つのタブを作ることに。
ジェスチャ定義選択部分を複数作って同期するのが面倒だが、見た目はすっきりした。

その他、色々あって以下のような感じになった。
少なくとも、旧バージョンのGUIよりはマシだろう。

これはこれで悪くないが、せっかく書きやすいように作ったiniファイル仕様が
日の目を見なくなってしまうのは惜しい。
iniファイルのフォーマットで定義情報をクリップボードやファイルに
エクスポート・インポートする機能を付けてみたらどうか。
掲示板とかでやりとりするときに便利そうである。
そんなことしたがる人がいるかは疑問だが。
84管理人 ★:2007/10/20(土) 23:50:40
設定GUIのプロトタイプ

iniファイルの仕様が固まったので、設定GUIも作ってみようかと考える。
iniファイルに合わせて、条件タブとジェスチャタブを作り、
ジェスチャタブの中に更にジェスチャ定義と動作割り当てのタブを入れようと思ったが、
何故かGui,Add,Tabでタブ上にタブコントロールを配置できない。糞が。
仕方ないので、メインタブ上にジェスチャ定義と動作割り当ての2つのタブを作ることに。
ジェスチャ定義選択部分を複数作って同期するのが面倒だが、見た目はすっきりした。

その他、色々あって以下のような感じになった。
少なくとも、旧バージョンのGUIよりはマシだろう。

これはこれで悪くないが、せっかく書きやすいように作ったiniファイル仕様が
日の目を見なくなってしまうのは惜しい。
iniファイルのフォーマットで定義情報をクリップボードやファイルに
エクスポート・インポートする機能を付けてみたらどうか。
掲示板とかでやりとりするときに便利そうである。
そんなことしたがる人がいるかは疑問だが。


投稿ファイル名:1.bmp.png
サイズ: 13069
画像: http://lukewarm.s101.xrea.com/bbs/file/1146398137_84.png
117 x 320
85管理人 ★:2007/10/28(日) 11:45:46
設定GUIを作成(たぶん)
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
一応動作するようになったはず。

GUIを作るのは死ぬほど面倒くさい。
定義の移動・削除など、エディタならCtrl+X、Ctrl+V、Delete、矢印キーなどで済む編集処理のために、
何百行ものコードを書かなくてはならない。
項目を選択していないときは削除ボタンを押せないようにしておくなど、余計な気配りも必要となる。
結果、スクリプトファイルは本体の4倍以上の34KBにもなってしまった。
これだけの手間をかけて作っても、使い勝手はエディタでの直接編集と大差ない。
どう見ても、骨折り損のくたびれもうけである。

しかし、マウスでクリックしたウィンドウやコントロールのクラス名を取得する
入力補助機能だけは便利である。
その他、カスタム条件式や、動作割り当てのスクリプトの入力補助機能も用意したが、
個人的にはどうでもいい。
依然としてSendコマンドの引数などは自分で入力するしかないので、AutoHotkeyを知らない人にとっても役に立たない気がする。
条件定義名やジェスチャパターンの重複なども防止していないので、後でなんとかしよう。
86管理人 ★:2007/10/30(火) 22:56:50
マウスジェスチャ2修正
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
初期状態で動作しないのとかを直したはず。
まだ色々と半端だが、段々飽きてきた。
87管理人 ★:2007/10/31(水) 19:39:35
マウスジェスチャ2更新
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
条件定義名とジェスチャパターンで、不正な入力を出来ないようにした。
入力があるごとに不正な文字がないか、重複がないかをチェックして、確定ボタンの有効・無効を変更する。
また、ジェスチャパターンの末尾から1ステップ分の操作を削除するボタンも追加。
正規表現を利用することで、複数文字のボタン操作も簡単に削除できた。
88unnamed.ahk:2007/11/01(木) 05:34:41
いつも色々乙です。
AHKについては初心者でスクリプトについても
詳しく知らないので的外れなことを言ってたら
スルーしてください。
ThumbRemapについて、タッチパッドに触れているときは
全体を50msくらいの間隔で監視し続けて、
何も触れていない場合のパラメータを検知したら
強制的にThumb_Deactivate()実行、
みたいにしたら、既知の不具合の
「ボタンの押しあげ操作が発生せず
押しっぱなしになる」
という不具合に対応できないかと思ったのですが。
89管理人 ★:2007/11/01(木) 20:20:34
マウスジェスチャ2 ツールバーボタンのコマンドIDを調べてSendMessageコマンドを作成する機能追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
ファイルダイアログの上フォルダコマンドと戻るコマンドを実行させたかったので作った。

動作割り当てのスクリプトテンプレート部分では、テンプレートの代わりにラベル名を登録しておいて、
「入力」ボタンが押されたときにそのサブルーチンを実行するという機能を用意してあったので、それを使う。
コマンドIDを調べる部分は、昔作ったスクリプトを適当につなぎ合わせたら動作した。
90管理人 ★:2007/11/04(日) 19:42:32
ディスプレイが2台になったので、旧マシンもVNCではなく直接操作したいと思い、1011puという得体の知れないタッチパッド付きキーボードを買ってきた。
キーボードとポインティングデバイスがコンパクトなサイズにまとまっているので、必要なときだけ取り出して使うには丁度良いと思ったのである。
ThumbRemapを使えるかと思ったが、対応するドライバが見つからない。SynapticsのもALPSのもGlidePointの奴も認識してくれない。
仕方ないので、単に右シフトに右ボタンを割り当てることに。
タッチパッドに触れてなくても動作するから、こっちの方が使いやすい。
左ボタンは元から付いてるタップでいいや。
91管理人 ★:2007/11/05(月) 18:58:20
マウスジェスチャ2 修正とか改良
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip
オプション画面に色々とひどいバグがあったので修正した。

また、8方向モードで斜めとみなす角度の範囲を設定可能に。
デフォルトでは45度だが、60度にして斜めを認識しやすくしたり、90度にして斜めだけにしたりもできる。
また、斜めストロークの後と縦横ストロークの後で斜めの範囲を変化させる機能も用意した。
初回のみ8方向にしたり、斜めから開始したら斜めのみということも可能なはず。
8方向モードは使っていないので、正直どうでもいいが。

ユーティリティ関数として、マウスカーソルを移動する「MG_Move()」を用意した。
CoordMode、SetMouseDelay、BlockInputなどを行いつつMouseMoveする。
引数を省略すると、ジェスチャ開始位置に移動する。

あと、初回起動時の処理を再び修正。
初期状態で同梱されているMG_Config.ahkの中に、MG_Edit.ahkを呼び出すコードを入れることにした。
これにより、色々と余計な物を削減できたはず。
92管理人 ★:2007/11/14(水) 05:35:44
マウスジェスチャ2 矢印ナビ機能追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip

従来も、ジェスチャ入力中に内容をツールチップ表示する機能があったが、
動作確認のためにジェスチャ文字列をそのまま表示していたので分かりにくかった。
そこで、矢印で表示する機能も付けることに。

Shift_JISには上下左右の矢印はあるが、斜めはなかった気がする。
そこで、斜め矢印が存在するWingdingsという記号フォントを使う。
http://lukewarm.s101.xrea.com/misc/FontsStandard.html によると、XPなら標準で入っているはずなので大丈夫だろう。
しかし、Gui,Fontでこのフォントを指定しても、何故か0x80以上(?)の文字が正しく表示されない。
仕方ないので、自分でデバイスコンテキストを取得して直接描画することに。
なにやら文字の間隔なども設定できるらしい。
Wingdingsで表示している都合上、矢印以外のものを表示するのが面倒だったので、
押しているボタンによって文字色を変えて区別できるようにした。
設定画面を作るのは面倒なので、拡張設定スクリプトに自分で記述する手抜き仕様。
設定画面には、矢印ナビを使うかと、起動時からナビを有効化するかの設定のみ用意した。

かなり適当な作りだが、一応綺麗に表示されているようである。
しかし、こんなものを見ながら入力していたらタイムアウトしてしまうので役に立たないのではないだろうか?
93管理人 ★:2007/11/14(水) 09:09:29
ビデオカードにDVI-D端子が2つ有ることに気付いたので、デュアルモニターにしてみた。
セカンドを上とか左に配置すると、マイナス座標の領域が生まれるんだな。
モニターの設置位置の問題であまり使いやすくないので、とにかく多くのスペースが必要なときだけ使うことにする。
94管理人 ★:2007/12/07(金) 01:36:49
マウスジェスチャ2 ツールチップテキスト変更機能を追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip

動作定義が多すぎて覚えきれないのでツールチップにアクション名を表示して欲しいという意見があったが、
このスクリプトの場合は何を表示しろと言うのか?
その時点で入力されているジェスチャに「ボタンを一つ放す」を追加したジェスチャの割り当てを表示すればいいのか?
あるいは、現在の状態から続くジェスチャの割り当て全てを表示するのか?
納得の行かない仕様で作ってもどうせ文句を言われるだけだろうし、
そもそもアクション名を設定できるようにするのが面倒くさいので、
適当に数行の変更で作れる簡易的な機能にした。

「MG_Tooltip」という変数にテキストが入っていると、
ジェスチャ文字列の代わりにそれが表示されるように。
ジェスチャ入力が終了すると、MG_Tooltipの内容はクリアされる。

例えば、「RB_」に
MG_Tooltip=
(
ウィンドウ状態変更
    ↑
前へ← →次へ
    ↓
  閉じる系
)
のように、右ボタン押し下げから派生するアクションの説明を割り当てて使う。

このスクリプトの仕様では、内容を読んでいる間にタイムアウトしてしまうが。
95管理人 ★:2008/01/13(日) 06:14:19
秋葉原のUSER'S SIDEとか言う店(キングケバブの向かい)で外付けのタッチパッドを見つけた。
GlidePointって書いてあったからThumbRemap.ahkも動作するはずである。
しかし、6000円以上もするしPS/2版しかなかったしそれほど欲しくもなかったのでスルー。
96管理人 ★:2008/02/16(土) 23:27:43
以前作ったコマンドラインランチャーに色々と不具合があることに気付いたが、行き当たりばったりに拡張していったせいで手の施しようが無くなっているので、作り直すことを考える。
せっかくだから、まともな拡張機構を用意して、ウィンドウやプロセス、テキストなども扱えるようにしたい。
以下、現在までに挙がっているアイデア。


●動作の流れ
ターゲットリスト、コマンド、絞り込みモードなどを決定してウィンドウ表示
┌→↓ ←──────────────────┐
│ターゲットリストから絞り込み→絞り込みモード遷移┤
│ ↓         ↑   └→サブアイテム展開─┘
│アイテム確定→追加のターゲットリスト
│ ↓         ↑
│コマンド決定→必要なターゲットが確定していなければ
│ ↓
│コマンド実行→(終了)
│ ↓
└出力をターゲットリストに

全ての状態遷移は、ホットキー/ローカルホットキーに割り当てる。
アイテム確定、コマンド決定、実行など、複数の遷移を1キーに割り当てることも可能。
Enterに割り当てる処理では、コマンド未指定時ターゲット種別に応じたデフォルトコマンドを実行。


●リスト種別
・コマンド(内部コマンド、外部コマンドライン)
・ファイルパス
・ウィンドウハンドル(コントロールの場合も)
・テキスト


●リスト形式
(視認用タイトル)(\t検索用の目印)*\t(本体)


●サブアイテムの展開
ファイルパス→フォルダとみなして内部ファイルパスリストに展開
       (圧縮ファイルなどに対応した展開処理を追加可能に)
プロセス→所有ウィンドウリスト
ウィンドウ→コントロールリスト
      (スタティックテキストなどは無視する)
コントロール→テキストリスト


●親アイテムの取得
ファイル→親フォルダ
プロセス→プログラムファイル
ウィンドウ→プロセス
コントロール→親ウィンドウ


●仮想アイテム
必要になったときに実体の生成・取得やサブアイテム展開を行う

・圧縮ファイル内のファイル
・リムーバブルメディア上のファイル
・プログラムファイルの仮想プロセス(起動していなければ実行する)
・同、仮想ウィンドウ
・外部コマンドライン


●内部コマンド(例)
・指定ファイルを指定ウィンドウにドロップ
・コンテキストメニューの表示
・指定ファイルの拡張子に関連付けられたコマンドを取得しコマンドリストに
・指定ウィンドウをアクティブ化
・指定ウィンドウを閉じる
・指定コントロールから指定テキストのアイテムを選択
・指定コントロールにフォーカスを与える
・指定テキストをクリップボードにコピー
・指定テキストをGoogle検索


●コマンドの引数
引数の扱いはコマンド内で実装

・例
引数があればターゲットファイルに
→ターゲットファイルがなければ選択させる


●外部コマンドライン
仮想アイテムとして扱い、実行時に内部コマンドに変換して実行

・複数のターゲットファイルを
  一つにつき1コマンドに展開
    一つずつ終了を待つ
    全部いっぺんに実行
  コマンドライン上に列挙する形で展開
・ターゲットテキストを一時ファイル経由でコマンドに与える
・一時ファイル経由で出力をテキストリストに


●絞り込みモード
・通常マッチ
・タイトル部分のみでのマッチ
・正規表現
・除外
・Migemo


●特殊な絞り込みモード
ターゲットリストは不要

・HyperEstraier(インデックス型全文検索)
入力テキストに一致する登録ファイルのパスリストを表示

・Googleサジェスト
入力テキストに対するキーワード候補テキスト一覧を表示


●自動生成型ターゲットリスト
・指定ディレクトリをスキャンしてファイルパスリストを生成
・アクティブウィンドウをファイルパス、仮想ウィンドウ、仮想プロセスリストに追加
・クリップボードのテキストをテキストリストに追加

スキャン中に検索できないとうざいので、非同期コマンドとして別スクリプトで実行


●外部プログラムからのコマンド実行


●設定
・INIファイルに記述
・コマンドでスクリプトに変換・再起動
・設定変更コマンド


●全てをモジュール化する
・コマンド
・リスト種別の定義(名前、デフォルトコマンド、デフォルト絞り込みモードなど)
・リスト生成機能
・サブアイテム展開・親アイテムの取得
・アイテムの仮想化・実体化
・絞り込みモード
97管理人 ★:2008/02/16(土) 23:51:54
>>96
追加

●候補リストの1位より入力内容を優先するモード
候補リストで選択を行っていない場合、Enterなどで入力内容自体がターゲットとして確定する。
Shift+Enterでは逆の動作になる。
98unnamed.ahk:2008/02/22(金) 19:54:38
wktk
99管理人 ★:2008/02/24(日) 20:14:07
マウスジェスチャ2、新規ボタン一発作成機能追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

8つほどボタンが付いているマウスを手に入れたので、ボタン定義スクリプトを作成してジェスチャに使うことに。
既存のボタン定義スクリプトをコピーして書き換えるのが思いの外面倒だったので、設定画面に作成補助機能を追加した。
これで、マウスのドライバユーティリティで拡張ボタンに割り当てたキー名と、登録したいボタン名を入力するだけで、定義スクリプトを作成できるようになった。
こんなマニアックな機能、使う人がいるかは疑問だが。
100管理人 ★:2008/02/24(日) 20:14:14
マウスジェスチャ2、新規ボタン一発作成機能追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

8つほどボタンが付いているマウスを手に入れたので、ボタン定義スクリプトを作成してジェスチャに使うことに。
既存のボタン定義スクリプトをコピーして書き換えるのが思いの外面倒だったので、設定画面に作成補助機能を追加した。
これで、マウスのドライバユーティリティで拡張ボタンに割り当てたキー名と、登録したいボタン名を入力するだけで、定義スクリプトを作成できるようになった。
こんなマニアックな機能、使う人がいるかは疑問だが。
101管理人 ★:2008/03/01(土) 11:54:34
マウスジェスチャ2 チルトとかのための機能を追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

マウスの左右チルトにジェスチャを割り当てたい。
しかし、従来の仕様では、ボタンを押している間中PostMessageし続けるというようなことが出来ない。
そこで、トリガが放されるまでタイマーでジェスチャサブルーチンを呼び出し続けるMG_While()関数を追加した。
トリガが放されたときに一度だけ別の動作を実行させたり、押し下げ・押し上げ時のみ実行する機能も付けた。

この関数により、WM_HSCROLLを繰り返しPostMessageさせることで、チルト風の動作を実現できるようになった。
更に、「右ボタンを押しながらチルト」や「タイトルバー上でチルト」など、様々な操作にスクリプトを割り当てられる。
設定の仕方が多少ややこしいが。
102管理人 ★:2008/03/10(月) 04:06:49
本体がv1.0.47.06になって、動的関数名による呼び出しが追加されたことで、>>96のモジュール機構が実現しやすくなりそうだ。
だが、不特定のスクリプトファイルを#Includeする方法がないと、設定スクリプトで動的にスクリプトを生成しなければならないことには変わりない。
ワイルドカードによる一括#Includeなどが欲しいところだ。
関数が存在しているかどうかのチェックも今の所用意されていないが、下記のようにすれば代用は出来そうだ。
IsFunction(n){
return p:=RegisterCallback(n) && !DllCall("kernel32.dll\GlobalFree","UInt",p,"UInt")
}
103管理人 ★:2008/03/13(木) 00:50:00
MouseGesture.ahk 画面端接触認識機能を追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

画面端はOrchisで使っているので自分では使わないだろうけど作ってみた。

認識処理自体は、SysGetで画面サイズを取得し、タイマーでカーソル位置を監視するだけで出来た。

画面端接触をボタンとして定義し、「画面上端でカーソルを左に移動」とか
「画面左端で右クリック」という操作も定義できるように。
その為、「画面端への接触」は接触した瞬間に発動する。
一定時間触れ続けたときに発動させたければ、「MG_Timer()」を使えばいい。

当初は、上下左右の各辺を任意の数に分割できるようにしようかと思ったが、
4つ以上は誰も使わないだろうからやめた。
分割数の設定自体を廃止してしまい、分割無し、2分割、3分割を共存させられるように。
使いたい部分の定義モジュールを手動でMG_Buttonsフォルダに入れるようにした。
これにより、「縦は2分割、横は3分割」のような使い方も可能に。

角の認識も可能にしたが、特別な処理は行っていないため、
角に触れる前に辺への接触が認識されると、角を認識させるのが困難なので、、
角を使うときはその角に接している辺は使わないようにする必要がある。
「各辺の中央1/3と角」のような使い方をしてもいい。

そんな感じで、かなり適当な作りだが、どうせ自分では使わないので構うまい。


なお、条件定義はジェスチャ認識開始時にカーソル下のウィンドウを手がかりにしているため、
画面端にカーソルを移動したときに操作したいウィンドウがしたにあるとは限らないため、
アプリケーション別の割り当てには使いづらい。
だが、そもそも画面端という絶対的な存在によってアプリケーション別の動作という
相対的な現象が起こるのはおかしいし、仕様が一貫していないと覚えにくいので、このままでいいだろう。
104管理人 ★:2008/03/13(木) 08:00:24
MouseGesture.ahk カーソル下ウィンドウではなくアクティブウィンドウをターゲットにするオプションを追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

一応付けた。
ホイール操作やキーボード操作はアクティブウィンドウに送られるのが普通だから、
こちらの仕様の方が一貫性という面では正しいような気もする。
というか、非アクティブなウィンドウがターゲットのとき、Sendが正しく動かない。
ControlSendだと、プログラムのキー操作認識方法によっては動作しないし、困ったもんだ。
105管理人 ★:2008/03/13(木) 08:03:46
これで右ボタンを押した時点でアクティブ化させれば大体何とかなるか

[Gesture_Start]
G=RB_
Default=WinActivate
106管理人 ★:2008/03/13(木) 20:04:57
MouseGesture.ahk スクロール機能追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

IEのホイールクリックのやつみたいなのがあれば便利かもと思い作ってみた。
ジェスチャ開始位置からの相対距離に応じてスクロールする。
MG_While()と組み合わせて、ボタンを押している間繰り返し実行することで使う。
IEの場合、ホイールボタンを放すことによって開始され、解除するのにもう一度クリックが必要だが、
こちらはボタンを放せばすぐに停まるので使いやすいかも知れない。

ついでに、JaneStyleのビューアとかにあるドラッグスクロールも作ってみた。
WM_[H|V]SCROLLは、コントロールが定めた単位でスクロールするため、
1単位とピクセルを正しく対応させるのが難しい。
GetScrollInfo()などのAPIで調べられるはずだが、IEなどから正しく取得できないので諦め、
適当に1スクロール単位あたりに必要なピクセル数を指定するようにした。
107管理人 ★:2008/03/15(土) 11:24:12
違った、IEもホイール押しっぱなしでカーソルを移動すると押してる間だけスクロールする。
ホイールだから押しづらいが。
108管理人 ★:2008/04/01(火) 00:05:30
「AutoHotkeyを廃れさせるページ」にて、JavaScriptベースのAutoHotkey風スクリプトユーティリティ「JHK」のテスト版を公開
http://lukewarm.me.land.to/

かねてからAutoHotkeyの行き当たりばったりに拡張されてきた言語仕様には辟易していたので、
JavaScriptエンジンを利用してAutoHotkey風のツールを作ることに。
SpiderMonkeyを使おうかと思ったが、なにやら面倒くさそうだったので、
とりあえずWindowsScriptControlを使う。
ホットキー割り当てとキー操作の送信などの機能を実装してみたところ、それなりに動作するようになった。
スクリプトコントロールのリファレンスやサンプルが少なくて、
エラー関連の動作などがよく分からずに困ったが、とりあえず何とかなった。

ホットキーに動作を割り当てるスクリプトは、以下のような感じになる。
面倒くせえ。
しかし、JavaScriptなら、文字列から関数を生成することも可能なので、
いくらでもラッパーを作って簡略化可能である。

with(Keyboard){
map("#F1",function(){
alert("終了します");
exit();
});
map("#F2",function(){
run("notepad");
});
map("#F3",function(){
send("this is test");
});
}
alert("起動しました");
109管理人 ★:2008/04/02(水) 01:53:17
JHKはエイプリルフールのネタである。
ActiveX.ahkを使って、AutoHotkeyで実装した。
110管理人 ★:2008/07/11(金) 19:21:35
USBタッチパッドがまともな日本語パッケージで売り出されていた
http://plusd.itmedia.co.jp/pcuser/articles/0806/19/news050.html
ので買ってきた。

「ありそうでなかった」とか書いてあるが、普通に前からあったような気がする。
今は無きUser'sSideとかで売ってた。

キーボードの下に消しゴムを挟んで浮かせ、その隙間に本体上部の枠を挟んで設置。
やや厚手の片手用パームレストを2つ買って、左右に設置した。
スタンダードモデルだと少し幅が広すぎて、6とか7を押そうとすると親指の付け根がパームレストからはみ出して不安定な感じだ。


ドライバはGlidePointとかいうやつ。
ALPS社製のはずだが、以前作ったThumbRemap.ahkの奴とは作りが違うようだ。
無くても別に困らないが、せっかくだからそのうち対応させよう。
111管理人 ★:2008/07/12(土) 03:14:37
ドライバをインストールすると設置する向きを変えられることに気付いた。
ただし、領域端でのスクロール機能はちゃんと回転してくれない。
これにより、左右パームレストの間隔を狭められると共に、ボタンが横に来るので親指でクリックできるようになる。
112管理人 ★:2008/08/24(日) 13:04:08
MouseGesture.ahk ツリー/リストビューのヒットテストなどを追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

ツリービューやリストビュー上では、TVM_HITTESTやLVM_HITTESTで、指定座標がアイテムのどの部分かなどを調べられる。
しかし、情報を構造体で受け渡す必要があるため、VirtualAllocEx()で対象プロセス上にメモリを確保した上で
WriteProcessMemory()やReadProcessMemory()で操作しなければならず、非常に面倒くさい。
どうせ自分では使わないので保留していたが、度々要望があったので、しかたなく実装することにした。

ターゲットのプロセスIDを記録しておく必要が出てきたため、MG_PID変数を新たに追加した。
他にはプライオリティの変更くらいしか使い道がなさそうだが。
113管理人 ★:2008/09/08(月) 00:02:22
MouseGesture.ahk ターゲットウィンドウ・コントロールの位置サイズなどを得る関数を追加
http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html

一つのウィンドウ上に同種のコントロールが複数存在するうちの片方だけにマッチする条件を作りたいときなどに使うかもしれない。
そんな割り当てが必要になることがあるのかは謎だが。
114管理人 ★:2008/09/12(金) 00:04:22
MouseGesture.ahk マウスカーソルを判別する機能を追加

これにより、HTMLヘルプなどのIEコンポーネントでも、ホイールクリックで新規ウィンドウで開くを実現できたりするようになる。

GetCursor()では自分のスレッドのカーソルしか取得できないが、AttachThreadInputを使う事で他のスレッドのカーソルハンドルを得られる。
矢印などの標準カーソルのハンドルは、0x10011〜0x10029などの値で、複数の環境で同じ値だったので、とりあえず一定だと思う事にして、
カスタム条件式のテンプレートとして用意した。

あと、スクリプトの紹介ページを微妙に詳しくした。
115管理人 ★:2008/09/12(金) 10:10:36
MouseGesture.ahk ターゲットプロセスのコマンドラインを取得するMG_CommandLine()を追加

AutoHotkeyやJavaなど、ホストプログラムによって実行されるタイプのプログラムは、
ウィンドウクラスや実行ファイル名がどれも一緒になってしまって判別に使えない。
タイトルが不定だったり、他のプログラムと同じだったりすると、プログラムを見分ける手立てがない。
そこで、コマンドラインによる条件判別を可能にする事に。

自分のプロセスのコマンドラインは、「GetCommandLine」というAPIで取得できるのだが、
他のプロセスのコマンドラインを取得するAPIは存在しない。
しかし、何とかして対象プロセスからコマンドライン文字列を盗み出したい。
当初は、フックを利用して関数を注入するとか、WriteProcessMemoryで
機械語のコードを書き込んでCreateRemoteThread()で実行するとか、
ややこしい方法しか思いつかず苦労したが、結局意外と簡単な方法で済んだ。

実は、コマンドライン文字列が格納されているアドレスはどのプロセスでも一定で、
GetCommandLineはそのアドレスを返しているだけなのである。
格納アドレスはkernel32.dllのバージョンによって異なるようだが、GetCommandLineAの
アドレスから機械語のMOV命令の分を飛ばしたアドレスを読めば取得可能である。
都合の良い事に、GetCommandLineAのアドレスは全てのプロセスで共通なので、
自分のプロセス上で文字列の格納アドレスを調べ、「ReadProcessMemory」で
対象プロセスの当該アドレスから文字列をコピーすれば、コマンドラインが得られる。
116管理人 ★:2008/09/13(土) 06:28:16
MouseGesture.ahk MG_CommandLine()がAutoHotkey以外のプロセスで動作しないのを修正

一番最後のアドレスはプログラムによって違うので、ターゲットプロセス上から取得する必要があるのを見落としていた。
117管理人 ★:2008/09/13(土) 06:49:07
MouseGesture.ahkをWindowsVistaのUAC下で無理矢理使用する方法

UACの一般権限では、管理者権限のプロセスをSendなどで操作できない。
逆にAutoHotkeyのプロセスをが管理者権限で実行されている場合、
MG_CommandLine()で一般プロセスのコマンドラインを取得できないなどの制限がある。

MG_User.ahkに「#SingleInstance,off」を記述し、Disableに「MG_CommandLine()=""」
を登録して、一般権限と管理者権限の両方でMouseGesture.ahkを実行すれば、
両方の権限のプロセスで完全に動作するような気がする。面倒だが。

ところで、Vistaでタスクマネージャを見てみたら、コマンドラインが普通に表示できるようになっていた。
APIが追加されたのだろうか?こいつでも、権限の違うプロセスのコマンドラインは取得できないようだった。
118管理人 ★:2008/10/02(木) 23:17:25
MyScriptsに「クリップボード操作関数群」と「ファイルドロップ関数」を追加

前から作ろうと思っていて放置していたものを作った。
テキスト以外の任意のクリップボード形式を読み書きする関数群。
ファイル名のリストをエクスプローラなどに貼り付けられる形式でコピーするために。
エクスプローラやダイアログで開いているフォルダにファイルを送りたいときに使うかも。

ファイルドロップ関数は、改行区切りで指定したファイル群をWM_DROPFILESで指定ウィンドウに送る。
ウィンドウへのドラッグ&ドロップでしかファイルを受け付けないソフトなどに使用するかも。
119管理人 ★:2009/03/06(金) 05:30:52
MigemizeEverything

Everything(http://www.voidtools.com/)で無理矢理Migemo検索する。
超遅い。普通に変換した方が速い。
マルチバイトに対応していないらしく、時々誤検出する。


投稿ファイル名: MigemizeEverything.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_119.zip
サイズ: 1376 bytes
120unnamed.ahk:2009/03/08(日) 17:01:37
はじめまして

ワードパッドのウインドウ上にあるボタンで
フォントの色、サイズ、上線のつけはずしを
操作するスクリプトを作りました。
これの座標を指定してクリック、ではなく
直接命令を送るスクリプトは作れるのでしょうか?
inspect_toolbar_id はうまく動きませんでした。
121unnamed.ahk:2009/03/09(月) 16:54:12
120ですが、なんとか出来そうなので自分
でやってみます。ありがとうございました。
1221:2009/03/10(火) 01:28:45
120/121です。inspect toolbarとResource Hacker
で無事できました。ありがとうございました。
123管理人 ★:2009/03/23(月) 06:07:20
2chのAutoHotkeyスレにMouseGesture.ahkの質問が書かれていたのに、DION規制で書き込めなくて困る。
誰か親切な人があと555モリタポほど恵んでくれれば、p2で書き込めるのだが。
http://find.2ch.net/moritapo/give.php?RK=93127982ff852cf03449c204be39fc07&AM=&CM=エノユ、「、熙ャ、ネ、ヲ、エ、カ、、、゙、ケ
124管理人 ★:2009/03/31(火) 08:44:17
「AutoHotkeyを廃れさせるページだったところ」にて、メモリの直接操作とネイティブコードの呼び出し機能に特化したJavaScript 1.8処理系を公開。
http://lukewarm.me.land.to/

WSHとAutoHotkeyを気分によって使い分けるのに嫌気がさしたので作ることに。

Firefoxで使われているJSAPIなる物を使う。
JSAPIだけをビルドする方法が分からず、何故かFirefox全体をビルドする羽目に。
しかも、出来上がったDLLがMSVCR90.DLLに依存していて、テスト用の環境で動作しない。
Firefox3.1betaに同梱されていたDLLに差し替えたら起動出来た。

とりあえず、DLL関数の呼び出しとコールバック関数の生成、メモリの確保・読み書き用の関数を作成。
一部AutoHotkeyのソースを参考にした。
とりあえず、EnumWindows関数を呼び出してコールバックを受け付け、可視ウィンドウのタイトルを出力するという処理が動作するようになった。
JavaScriptは動的に関数を生成出来るので、いちいちラッパー関数を定義したりしなくても、普通の関数と同じ感覚で呼び出せるのが便利だ。

しかし、Unicode対応でないAPIで日本語を扱うと文字化けする。
どうやら、JSAPIの内部文字コード(UTF-16)からANSI文字列への変換時に、Shift_JISではなくlatin-1として変換されている模様。
修正箇所が多くて面倒くさいが、WideCharToMultiByteで変換するようにすれば解決するだろうか。
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08