Visual StudioがAutoHotkeyの前に重要なイベントをキャッチするのはなぜですか?


82

私は最近、ちょっとした実験としてDvorakキーボードレイアウトに切り替えました。移行の最も困難な部分の1つは、ホットキーの処理です。ほとんどのホットキーはQWERTYを念頭に置いて設計されており、さらに悪いことに、ホットキーは非常に筋肉の記憶に縛られているようです。

すべてのホットキーを再学習するのではなく、オートホットキースクリプトを作成して、DvorakレイアウトをQWERTYに変換し直しましたCtrlAltまたはWinキーが他のキーと一緒に押されました。Visual Studio '08を除いて、私が試したすべての場所で美しく機能します。autohotkeyがキーストロークを変換する前に、キーストロークがキャッチされているようです。

なぜこれが起こっているのですか?どうすればこれを修正できますか?

以下は私のスクリプトの(最初からの)抜粋です:

; control + letter
^;::^z
^q::^x
^j::^c
^k::^v

更新:スクリプトは、ahk、vs08、およびcoderushが新たにインストールされたWin7で正常に機能します。私が問題を抱えているマシンはビスタを実行しています。さらに診断する方法について何か考えはありますか?

更新2:スクリプトはVistaおよび2010ベータ2で正常に動作します。vs08+ vistaだけの何かのようです。今夜はvs08の新規インストールを試してみます。

回答:


176

あはは!私はそれを理解しました。ahkとターゲットアプリが同じ特権(またはユーザー)で実行されていない場合、ahkはキーボードイベントを適切にインターセプト/シミュレーションしません。私の場合、ビジュアルスタジオは管理者(昇格)権限で実行され、ahkスクリプトは現在ログオンしているユーザーとして実行されました。

次のいずれかで問題が解決しました。

  • 現在のユーザーとしてvsとahkの両方を実行している
  • スクリプトをコンパイルし、vsとコンパイルされたアプリの両方を管理者として実行する

15
異なる権限についてではないことを追加したかっただけです。ただし、代わりに、AutoHotkeyスクリプトが、スクリプトよりも高い特権レベルで実行されているアプリケーションでは機能しないという事実。以下の私の答えを参照してください。
ひまんしゅP 2012

2
ahkのコンテキストメニューに「管理者として実行」を追加できます。コンパイルステップを節約します。 howtogeek.com/howto/windows-vista/...
アダム・ベル

ここで、タスクスケジューラを使用して、ユーザーの介入なしに、すべての起動時に管理者としてAutoHotkeyスクリプトを実行するよりクリーンな方法を見つけました:autohotkey.com/boards/viewtopic.php
Jose Antonio

乾杯🙏–
illusion4

48

OP自身が見つけたソリューションにいくつかのポイントを追加したいだけです。

1)問題はAHKとVSが異なる権限で実行されていることではありません-非管理者モードで実行されているスクリプトによって作成されたホットキーが管理者モードで実行されているアプリケーションでは機能しないというだけですが、それがあれば問題はありません逆に。

2)必ずしもスクリプトをコンパイルする必要はありません。autohotkey.exeを管理者モードで実行するように設定するか(私が行うことです)、あるいは特定のスクリプトへのショートカットを作成して常に管理者モードで実行するように設定します。(ところで、指摘するだけで、コードはまだ解釈されているため、AHKスクリプトのコンパイル済みバージョンを実行してもパフォーマンスは向上しません-作成された実行可能ファイルにインタープリターが埋め込まれているだけです)


3

これは、ユーザーアカウント制御(UAC)の一部であるユーザーインターフェイス特権の分離(UIPI)と呼ばれるセキュリティ機能によるものです。

FAQにリストされているいくつかの回避策があります。

ユーザーアカウント制御(UAC)によって引き起こされる問題を回避するにはどうすればよいですか?

一般的な回避策は次のとおりです。

  • AutoHotkeySetupのコンテキストメニューに「 RunwithUIAccess 」を追加するオプションを有効にします。このオプションは、[スタート]メニューからAutoHotkey Setupを再実行することにより、AutoHotkeyを再インストールせずに有効または無効にできます。有効にしたら、スクリプトファイルを右クリックして[ UIアクセス実行]を選択するか、次のようなコマンドラインを使用してスクリプトファイルを起動します。"AutoHotkeyU32_UIA.exe" "Your script.ahk"(ただし、フルパスを含めます)。
  • 管理者としてスクリプトを実行します。これにより、スクリプトによって起動されたすべてのプログラムが管理者として実行され、スクリプトの起動時にユーザーが承認プロンプトを受け入れる必要がある場合があることに注意してください。
  • ローカルセキュリティポリシー「すべての管理者を管理者承認モードで実行する」を無効にします(非推奨)。
  • UACを完全に無効にします。これは推奨されておらず、Windows8以降では実行できません。

この問題を回避するために管理者としてスクリプトを実行することは通常お勧めしません。予期しない、または望ましくない副作用が発生する可能性があるためです。たとえば、スクリプトを起動するプログラムはすべてRun、管理者としても実行されます。スクリプトには、ProgramFilesなどのさまざまなフォルダーへの不要な書き込み権限もあります。少し悪いコード(どこかからコピーして貼り付けられた悪意のあるコード、またはバグのあるコード)は、この方法でより多くの損害を与える可能性があります。

もちろん、最後の2つのオプションもお勧めしません。これにより、Run with UI Accessのみが残り、上記のように有効にして使用できます。


0

どうやらこれには回避策があります。

ドキュメントProgram.htm#Installer_uiAccessから
Lexikosによるフォーラムスレッド

抜粋:

EnableUIAccess

AutoHotkey.exeを変更して、UACが有効になっている場合でもスクリプトが次のことを実行できるようにします。

管理者としてスクリプトを実行せずに、管理プログラムのウィンドウを操作します。SendPlayを使用します。制限があります。このスクリプトを使用する前に、投稿をお読みください。

ahkファイルへのダウンロードリンクはフォーラムで壊れていますが、Githubで見つけました:EnableUIAccess.ahk


なぜEnableUIAccess.ahkを見ているのですか?廃止されました。リンクしたドキュメントには、AutoHotkeyインストーラーに組み込まれているオプションについて説明しています。インストーラーには、必要なものがすべて含まれています。(回答として詳細も投稿しました。)
Lexikos18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.