XREA.COM Logo XREA.COM Ad

管理人の雑記

1管理人 ★:06/04/30 20:55 ID:???
雑記サイト移転に伴い、AutoHotkey関係はこっちに書くことに。
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で指定ウィンドウに送る。
ウィンドウへのドラッグ&ドロップでしかファイルを受け付けないソフトなどに使用するかも。
92KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08