OnEvent() 関数の説明
function OnEvent(event, arg[, family])
-- ここの内容が実行される
end
左ボタン (※1) とホイールの回転を除いた G ボタンを含むマウスボタン, G キー, M キーの押下・押下の解除、当該スクリプトが登録されたプロファイルがアクティブ・非アクティブになった時に、関数の内容を実行します。
※1 EnablePrimaryMouseButtonEvents() 関数によって、左ボタンでも発火するように設定を変更できます。
戻り値はありません。
event には OnEvent() が発火した理由が文字列で、arg には理由の補足が整数で、family には発火させたハードウェアの種類が "kbd" (キーボード), "lhc" (左手用キーパッド), "mouse" (マウス) という文字列の形で代入されます。
event, arg の内容について、詳しくは以下の表を参照してください。
event | 説明 | arg | 説明
|
"PROFILE_ACTIVATED" | 当該スクリプトが登録されているプロファイルがアクティブになったため | 0 | なし
|
"PROFILE_DEACTIVATED" | 当該スクリプトが登録されているプロファイルが非アクティブになったため
|
"G_PRESSED" | G キーが押下されたため | 1~ | G キーの番号。G3 キーなら 3
|
"G_RELEASED" | G キーの押下が解除されたため
|
"M_PRESSED" | M キーが押下されたため | 1~ | M キーの番号。M1 キーなら 1
|
"M_RELEASED" | M キーの押下が解除されたため
|
"MOUSE_BUTTON_PRESSED" | マウスボタン (G ボタン含む) が押下されたため | 1~ | マウスボタンの番号。1 = 左ボタン (≠左クリック), 2 = 右ボタン (≠右クリック), 3 = 中ボタン (≠中クリック), 4 = G4 ボタン, 5 = G5 ボタン, ...
|
"MOUSE_BUTTON_RELEASED" | マウスボタン (G ボタン含む) の押下が解除されたため
|
OnEvent() 関数を単に複数回定義した場合、後に定義した方で上書きされます。
イベントが発火した場合、イベントの内容が終了するまで、次の発火による実行は待機させ、順次実行していきます。
function OnEvent(e, a)
OutputLogMessage("%s\n", e);
Sleep(3000);
end
以上の内容でマウスの右ボタンをクリックすると、ボタンの押下によって発火したことを示す "MOUSE_BUTTON_PRESSED" というログと、押下の解除によって発火したことを示す “MOUSE_BUTTON_RELEASED” というログとが出力される間が 3 秒空きます。
サンプル
索引
マウスのボタンが押された時に、メッセージ (event, arg, family の内容) を出力する
function OnEvent(e, a, f)
if e == "MOUSE_BUTTON_PRESSED" then
OutputLogMessage("event = %s, arg = %d, family = %s\n", e, a, f);
end
end
先ずはメッセージログの出し方を覚えておくと楽です。
G9 ボタンを押している間だけ、次のモードに切り替える
m, hw = 1, "mouse"; -- hw にはデバイスの種類 ("kb", "lhc", "mouse") を入れる
function OnEvent(e, a)
if a == 9 then
if e == "MOUSE_BUTTON_PRESSED" then
m = GetMKeyState(hw);
SetMKeyState((m == 3 and 0 or m) + 1, hw); -- 3 がモードの総数
elseif e == "MOUSE_BUTTON_RELEASED" then
SetMKeyState(m, hw);
end
end
end
SAI で言うツール シフト。
記憶した座標を左または右クリックする
t = {[1] = {[8] = {}, [9] = {}}};
-- M1 の G8, G9 ボタンに登録できるようにする、の意
-- 仮に M2 の G4 ボタンを追加したいなら t = {[1] = {[8] = {}, [9] = {}}, [2] = {[4] = {}}} とする
function OnEvent(e, a, f)
if e == "MOUSE_BUTTON_PRESSED" and a > 3 then -- 処理数を軽減するため、扱うボタンを G4 以降に制限しています
m = GetMKeyState("mouse");
if type(t[m]) == "table" and type(t[m][a]) == "table" then
b = IsModifierPressed("ctrl") and 1 or IsModifierPressed("shift") and 3 or 0;
ref = t[m][a];
if b == 0 then
if # ref ~= 0 then -- 座標が記憶されていなければ何もしない
x, y = GetMousePosition(); -- 現在の座標の一時記憶
MoveMouseTo(ref[1], ref[2]);
PressMouseButton(ref[3]); Sleep(16); -- 余裕がないと右クリックに失敗するアプリケーションがあったので。1 ms で大丈夫っぽいけど不安だから 16 ms に
ReleaseMouseButton(ref[3]); Sleep(16); -- 余裕がないと次の MoveMouseTo() の実行前に押下を解除できず、ドラッグになってしまう
MoveMouseTo(x, y); -- 座標を元に戻す
end
else
x, y = GetMousePosition(); -- 座標の登録
ref[1] = math.max(0, math.min(x, 65535)); -- 座標をプライマリモニタの範囲に収める
ref[2] = math.max(0, math.min(y, 65535));
ref[3] = b; -- 左・右クリックの登録
end
end
end
end
Ctrl または Shift キーを併用して G ボタンを押すと現在のマウスポインタの座標を記憶し、次回 G ボタンを単独で押した際に、記憶した座標を左または右クリックします。Ctrl キーを併用して記憶したなら左クリック、Shift キーを併用して記憶したなら右クリックになります。
SAI でパレットやキャンバス上から色を簡便に拾うために書きました。
マルチモニタ環境は想定していないと言うより対応できませんでした。GetMousePosition() が -1 以下 65,536 以上を超える値を返すのだから MoveMouseTo() にも同じ値が指定できれば片付くのだけれど。MoveMouseToVirtual() で対処するには、モニタの数及び配置を知る手段が必要な気がしますが、算数もロクにできない私には判断付きませんでした。
マウスの X1 (戻る) ボタンが押されている間だけ、マウスポインタの移動でホイールの回転を行う
function OnEvent(event, arg)
local src, des, a = {GetMousePosition()}; -- 初期座標を得る
while IsMouseButtonPressed(4) do -- マウスの X1 ボタンが押下されている限りループ
des = {GetMousePosition()}; -- 新しい座標を得る
a = src[2] - des[2]; -- 差を得る
if math.abs(a) > 256 then -- ある程度の差がなければ無反応
a = a / 1024; -- 減衰
MoveMouseWheel(a > 0 and math.floor(a + 0.5) or math.ceil(a - 0.5)); -- 四捨五入した値でホイールの回転
end
src[2] = des[2]; -- 比較元の更新
Sleep(64);
end
end
意味はありません。
いや、本当は SAI で戻る・進むボタンが無意味だったのと、物理ホイールとは別にホイることができたら幅が広がるのではって予感がビビビッと来た結果書いたのですが、用途がこれっぽっちも思い浮かびませんでした。
X1 に Ctrl, X2 に Shift 当ててホイール回した方がよくねって感じです。戻る・進むが機能するアプリケーション上だと鬱陶しいだけだし。
と言うか、基本的なマウス機能の押下をチェックできる関数はあるのに、G ボタンに対してのそれがないのが残念。
X1 (戻る)・X2 (進む) ボタンの長押しで Ctrl+Z・Ctrl+Y を実行する
function OnEvent(e, a)
if e == "MOUSE_BUTTON_PRESSED" then
local s, n = {{4, "lctrl", "z"}, {5, "lctrl", "y"}}; -- set = {{button, key1, key2, ...}, ...}
n = # s;
while n > 0 do
local ms, i, f = 0, 96, false; -- millisecond, interval, flag
while IsMouseButtonPressed(s[n][1]) do
if not f then
if 256 > ms then -- 経過時間が 256 ms 未満なら、変数 ms に一周あたりの Sleep 時間 i を加算する
ms = ms + i;
else
PressKey(s[n][2], s[n][3]); -- 既定の時間が経過したなら、キーを押下状態にする
f = true;
end
end
Sleep(i);
end
if f then ReleaseKey(s[n][3], s[n][2]); end -- キーの押下を解除する
n = n - 1;
end
end
end
戻る・進むをキャンセルする訳ではないので、例えば Opera で使うと、ボタンの押下を終えた時に戻る・進むも一回実行される。G ボタンさえ ry