4

標準の韓国語キーボードのスペースバーに隣接する 2 つのキー (両側に 1 つ) があり、これを Control または Alt モディファイアに再マップしたいので、小指よりも強い指を使用して交互に使用できます (私は emacs ユーザーです)。 .

問題は、それらがKeyUpイベントを生成していないようであり、他のキーのように繰り返されないことだと思います。オートホットキーを使用したループを含むひどいハックソリューションがあります。また、別の非フリー プログラムである KeyManager で同様のことを行いました。より高度なトリックや回避策 (AutoHotkey、ドライバーなど) を期待しています。

;Scan Code for Hanja Key
sc1F1::
Loop 10000
{
SetKeyDelay,-1
Send {Blind}{LCtrl DownTemp}
}
SetKeyDelay,-1
Send {Blind}{LCtrl Up}
Return

プレス(およびホールド)のキーボードフック出力Hanja

リピートもアップイベントもありません。

VK  SC  Type    Up/Dn   Elapsed Key     Window
74  03F     u   0.08    F5              
19  1F1     d   0.66    Hanja           
74  03F     d   9.58    F5       

アップデート:

試した:

sc1F1 & t::Send {Blind}{LCtrl DownTemp}{t}{LCtrl Up}

結果:

Hanja+を押した後t、ホットキーが起動しますが、その後ONLY t だけを押すと同じアクションが実行されます。 LCtrl Up発生しないようです。

安倍SetTimerベースのリセットはいいけど!元のコードのよりエレガントなバージョンのように感じます。ただし、問題は遅延です。遅延に合わせて入力速度を調整する必要があります。

その他のテスト済みソリューション:

GetKeyState("vk19", "p")スクリプトが読み込まれ、最初に 1 回押された後は、常に PRESSED と報告されます。キーを離した後でも、この状態が崩れることはありません。

KeyWaitまた、意図したとおりに動作しません。

sc1F1 up::traytip,, testまた、何回プレス/リリースしてもトレイチップは生成されません。

4

3 に答える 3

1

スクリプトに送信{Ctrl down}
させてから、タイマーを設定して、必要な時間(例では600ms)後にサブルーチンを実行します
(-は1回だけ実行
されます) {Ctrl up}

sc1F1::
Sendinput, {Ctrl Down}
SetTimer, Reset, -600
Return

Reset:
Sendinput, {Ctrl Up}
Return

→SetTimer←</a>


トグルボタンにしたい場合、
つまり、一度押すとxがControl+Aを送信し、
もう一度押すとxが通常の動作に戻ります。

sc1F1::Flag:=!Flag

#If Flag
x::Sendinput, ^a
a::Sendinput, test
#If

変数の値は、Flagを押すたびに逆になります。 つまり、フラグは1または0に設定されます。 この例sc1F1

#If Flag#If Flag = 1
では、コマンド を使用するため、 Autohotkey_L(新しい/推奨バージョン)が必要です。#If

AHKベーシックを使用すると、次のようになります。

sc1F1::Flag:=!Flag

$x::
if Flag
    Send, ^a
Else
    Send, x
Return


Capslocksc1F1の代わりに使用する他のオプション/例

&ボタンを修飾子として使用したいだけの場合は、を使用してみてください。
この例はCapslock修飾子になります(最初の行はcapslockライトをオフに保ちます):

SetCapsLockState, AlwaysOff

capslock & x::traytip,, %a_thishotkey%

Capslock単独で押したときに何かを送信したい場合は
、次のようなものを追加する必要があります。

capslock::Send, something

そして、それはのリリースでのみ「何か」になりCapslockます。

→追加情報←</a>


が物理的に( "p")押されている場合、XとのAパフォーマンスが異なる例を次に示します。Capslock

SetCapsLockState, AlwaysOff
#If GetKeystate("capslock","p")
x::traytip,, %a_thishotkey%
a::traytip,, %a_thishotkey%
#If

変数(「フラグ」)を設定し
てから、タイマーでクリアすることもできます。

capslock::
Flag := 1
SetTimer, Reset, 600
Return

Reset:
Flag := 0
Return

#If Flag
x::Sendinput, ^a
a::Sendinput, test
#If

マニュアルリファレンス:
#If
GetKeyState()


別のオプションは、キーボードフックを取り付けることです。
次に、組み込み変数を使用して、最後に押されたキーが何であったかを確認できます。a_priorkey

#InstallKeybdhook

x::
if (a_priorkey = "Capslock") {
    Traytip,, %a_thishotkey%
} Return

→組み込み変数の詳細←</a>


他のすべてが失敗した場合は、次のことを試すことができます。
レジストリの「スキャンコードマップ」を介した再マッピング

于 2012-08-14T01:07:23.803 に答える
1

アッセム、

この考えはまだ終わっていませんが、これは別のアプローチでしょうか? どのキーが押されるか (この場合はエンターが押されるまで) が表示されますが、独自の「終了」条件を作成してから、キーの押下を「組み合わせて」Alt または Ctrl の組み合わせを作成することもできます。

sc038:: ; Start when (in this case) the left Alt is pressed, {LAlt} is NOT listed in the input list....
input:=""
   Loop
   {
        Input, in, L1, {Enter}{LControl}{RControl}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}
        EL=%ErrorLevel%
        ToolTip, %EL% and %in% and %A_ThisHotkey%
        if EL = EndKey:Enter
        {
            ToolTip
            Sleep, 5000
            Break
        }
   }
Return
于 2012-08-13T07:18:12.280 に答える