ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

長押しした時に別の機能を実行できるようにする【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

はじめに。

私は肢体障害者で指先がわずかに動く程度の機能しかありません。
それでも PC で自分なりのアウトプットをしたいんだ。
それを諦めずに済むように PC 操作をアシストするツールを 勉強しながら作っています。
この記事は それをまとめたものです。
ここで紹介されるツールはあなたにとっても便利な汎用的な機能ではないのでご了承ください。

ホットキーに使えるキーが少ない。

超重要な機能に関してはキーホットキー一発で起動できるようにしています。
例えば音声入力を開始する作業はポーズキーで起動しています。
これはめちゃくちゃ便利で早いです。
しかしなんでもかんでもキーに割り当ててしまうと、本来のキーの機能が使えなくなるので慎重に選択しなければなりません。
となると、使えるキーは限られています。
ポーズキーを除けば、インサートとスクロールロックとプリントスクリーンくらいでしょうか?
ページアップページダウンはプログラミングの時に使いますしね。
もちろん Home と end も。

ということで、これができたら便利だなと思いながらももったいなくて割り当てられていません。

ランチャーとホットキーの違い。

単純に起動だけならランチャーで起動すれば良いですね。
もちろん私も大半の機能はランチャーのボタンからクリックで呼び出してます。
では、全部ランチャーから起動すれば良いのでは?

これまではそうしてきました。
しかし、一つだけ決定的な違いがあります。
それは、クリックした瞬間にアクティブウィンドウがランチャーに移ってしまうことです。
例えばアクティブウィンドウに対して何らかの処理を行いたい場合です。
具体的には、音声入力されたテキストを音声入力エディタからコピペしたい場合などです。
現在は音声入力ウィンドウから Chrome で開いている編集フォームへ、と言った具合にコピペ先が固定化されています。

スクリーンキーボードならフォーカスを奪われない。

ランチャーをクリックするとアクティブウィンドウのフォーカスが奪われてしまうのが問題なら、アクティブウィンドウが切り替わらない何かでやればいいじゃん。

そんなんあるんかいな。

あるんですよ。
スクリーンキーボード。
スクリーンキーボードは、クリックしたことでアクティブウインドウを切り替えませんので、スクリーンキーボードからホットキーを起動すればアクティブウィンドウに対して処理を行えるはずです。
エディタに貼り付けたい場合はエディタをアクティブに、 Firefox に貼り付けたい場合は Firefox をアクティブに。
貼り付けたいウィンドウをアクティブにさえすれば、どんな ウィンドウにもコピペ出来るということです。
すごく便利そうですよね。
たぶんキーボードをバキバキ使っている健常者の方には「何を当たり前のことを言ってるんだ?」と思われるかもしれませんが、マウスクリッカーはこれくらいのハンデを背負っているということです。

長押しを検出できれば拡張できる!?

前置きがとっても長くなりました。
つまりスクリーンキーボードでキーの長押しで別の機能を呼び出せば、1回のキーアクションで複数の機能を使い分けることができるのではないかと気づいたわけです。

キーの長押しを検出することは、私が知らないだけできっとできるんだろうなと想像してましたが、予想以上に簡単に検出できることがわかりました
次の記事によればkeywait関数を使えば実現できます。

KeyWaitコマンドを使うことで長押しした時に違う命令を送ることが出来ます。

AutoHotkeyの使い方2

試しに自分でもサンプルコードを作ってみました。
エクスケープキーを押すと Fが入力されますが、長押しするとTが入力されます。


私に待ち受けていた問題。

さて、そこでポーズキーを長押しした時に、音声入力されたテキストを、アクティブウィンドウに転送できるようにします。
これが実現すれば、音声入力して転送する作業が連続的に出来るようになります。
たぶんめっちゃ効率上がるぞこれ。

しかしながら、エスケープキーのサンプルコードをポーズに変えたら動かなくなりました。
インサートもスクロールロックでも長押しが判定できません。
それどころか押下状態の取得もうまく動きません。

スクリーンキーボードお前か。

2時間ほど悩んだ結果、スクリーンキーボードの特性だと気づいてきました。
私では確認できませんが、物理キーボードでは動くんだと思います。

スクリーンキーボードはクリックされたキーのキーコードを一発送信したらリピートしません。
自分はマウスのボタンを押しっぱなしにしているから、キーを長押ししてリピートさせてるつもりになっているけど、この時にリピートされているのはマウスの左ボタンであってスクリーンキーボード上のキーではないのです。
冷静に考えれば自分が長押しているボタンがどれかなんてすぐにわかるはずなんですけどね。
目の前のスクリーンキーボードに意識が完全に奪われてました。

実装。

ということで、スクリーンキーボードクリッカー向けのポーズキー長押し手続きは次のようになります。

;音声入力ウィンドウのマイクをオンにする。
;長押しした時はアクティブウインドウに音声入力ウィンドウのテキストを転送する。
Pause::
    ;長押し判定。
    ;スクリーンキーボードからマウスクリックで2入力しているので左ボタンを監視している。
    KeyWait, LButton, T1
    if ErrorLevel
    {
        portAny()
        Return
    }
    mmic(editorurl)
    Return

myahk/full.ahk at master · yasushiito/myahk

アクティブウィンドウへの転送は簡単ですね。
音声入力テキストを取り込む際にアクティブウィンドウが切り替わってしまうので、真っ先にアクティブウィンドウの ID を押さえておくことだけ注意します。


使ってみて。

これでどんなウインドウにも入力したテキストを転送できるようになりました。
スクリプトのコメントを Visual Studio CODE にコピペするのが一気に楽になりました。
Twitter のリプライも簡単にできるようになりました。
しかも早い。
これまでの 作業が劇的に変化するよ。
Facebook にコピペするボタンは使わなくなるんじゃないか?
このシリーズ、とっても便利なことが分かったので長押しでアクティブウィンドウに何かをする機能をしばらく投入していきますね。

参考。

ahkwiki.net
キーが離されるのを待ちます。
時間を指定することで、一定時間までに離されるのを待ちます。
この場合時間内にキーが離されなければタイムアウトとして errorlevel が1になって次の処理に進みます。
もちろんキーが離されなければ、すぐさまに次の処理に進みます。

オプションを変更すればキーが押されるのを待つこともできます。
一度離れるのを待ってから、一定時間内にもう一度押されることを検出すれば、ダブルクリックのような連打を調べることもできます。



この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら