情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

AutoHotkey:OS再インストール後にホットキーが動かない原因(Sendが動かない)

AutoHotkey (17) AutoHotkey_L (1) Windows (248) Windows 8.1 (58)

Windows 8.1 Pro をOS再インストールしたのですが、どういうわけか、今まで使っていたAutoHotkeyスクリプト(.ahk)がうまく動作しませんでした(エラーは出ず、ホットキーが動いていない感じ)。その原因を調査してみたので、調査結果と対策を紹介します。ただ、今回紹介する「原因」が発生した根本的な原因はまだ未調査状態です。

症状

AutoHotkeyを起動後(スクリプトを実行後)、ホットキーを押下しても、カーソル移動などが発動しません。

流れ

今まではAutoHotkey_Lを使っていたので、以前ダウンロードしたAutoHotkey_L_Install.exeでインストールすれば良いのですが、今回は新しく標準版のAutoHotkeyの最新版である「AutoHotkey104805_Install.exe」からインストールしてみました。

しかしものの見事に今まで使っていた.ahkファイルのホットキーが動作しなかったので、アンインストールして、http://ahkscript.org/download/ から最新版のAutoHotkey_L(AutoHotkey111903_Install.exe)をインストールしました(Unicode 64bit版)。

しかし、それでもMain.ahkがちゃんと動作せず。そこでとりあえず再起動を試みました。しかしそれもダメ。どうやら一部のホットキーは動作するものの、カーソル移動など、特定のホットキーがうまく動作しない模様でした。

とりあえず、今使っているノートPCは、AutoHotkey_L 1.1.08.01 なので、これで試してみたいところです。というわけで、それに近い手元にあった1.1.09を試してみるも、これまたダメ。1.1.08.01でもダメ。

そこで突然思い出し、「コントロールパネル>システムとセキュリティ>アクションセンター>ユーザーアカウント制御設定の変更」で、「通知しない」側に全力で倒しました。つまり、UACの無効化、です。

しかし、これでもダメでした。

実験

とりあえずいろいろ試してみてたところ、さすがにバージョンが同じなだけあって仕様変更などの影響は受けず、関数呼び出しなどはちゃんと動作しているようでしたが、どうも「Send」の行までちゃんと実行されているものの、カーソルが動かない、という状態(アプリ側が受け付けていない状態)でした。

そこで、「Send」を「SendPlay」に変更してみてもダメでした。

解決策

ここで、よくよく考えると、一部のホットキーでのSendは動作していたので、それを確認してみたところ、動作しているのは「SendEvent」でした。

そこで、「SendEvent」に変更してみたところ、ちゃんと動作しました。

SendMode Play

このとき、そもそも「SendMode(デフォルトのSend)」の設定は「SendMode Play」になっており、「SendPlay」が動作しないことが原因のようなので、これでは全滅です。

しかし、この「SendPlay」は、「AutoHotkey:キー押しっぱなし病・ホットキーすり抜け病対策の研究」の結果だったはずなので、あまり変えたくありません。しかし、あまりに不便なので、一度「SendMode Event」にしてみることにしました。

※ちなみに、明示的に「SendEvent」を使っている部分があったのは、「SendPlay」では、一部のホットキーがうまく動かないため(例えば、Winキーの送信をOSに送れない、など)。

どうしてOSを再インストールしたらSendPlayが使えなくなっているのか

さて、大きな疑問が残っています。それは、どうして今まで使えていたSendPlayが使えなくなったのか、です。

これについては、後々調べなくては鳴らなくなりそうですが、ひとまず放置しておきます

UACが有効だとSendPlayが使えないので、UACを無効化したのは正しい対処だと思うのですが、それではダメだったみたいです。一体どうして。

コメント(2)

  1. usi
    2015年4月19日(日) 10:07

    いつも有益な情報を有難うございます。押しっぱなし病の時はHPに大変お世話になりました。

    自分の環境でも(windows7 64bit)AHKが上手く動作しなくなりました。

    家の環境では、2つの対策でとりあえず動いております。

    ①Script記載をPlayからInputThenPlayへ変更。
    SendMode Play→SendMode InputThenPlay

    ②プロパティから、管理者権限としてこのプログラム実行するにチェック。

    どちらか1つだけではダメでした。

  2. FF
    2015年9月10日(木) 14:34

    私も同様にしてUACを無効にしましたが効果がなく、
    レジストリ設定から完全に無効にしたところうまくいきました。
    参考:http://news.mynavi.jp/column/windows/067/

新しいコメントを投稿