Caps Lockキーが他のキーで押されていない場合はEscapeに、そうでない場合はControlにマッピングできるようにしたい。 Windows 7でそれを行うにはどうすればよいですか?
SharpKeys でEscapeに再マッピングできます
ただし、キーボードドライバーを作成する以外に、条件付き再マッピングを実行する現実的な方法はわかりません。
これはあなたが望むものではありませんが、いくつかの欠陥を抱えて生きることができれば非常に近いです。これが AutoHotKey スクリプトです。
$CapsLock::LControl
$CapsLock Up::Send {Escape}
return
Caps LockをCtrlに再マッピングし、キーを離すとEscapeを送信します。 Caps Lockキーを放すたびに、Escapeキーが押されることに慣れるのにしばらく時間がかかりました。ただし、Escapeキーを押すとテキストエリアにフォーカスがなくなるため、ウェブサイトのテキストエリアではほとんど役に立ちません。
私はこれに対する解決策を探しています。必要に応じて、Cである種のドライバ/キーボードフックを作成することもあります。
Vim固有の煩わしさ:Ctrl-Kの組み合わせを使用してダイグラフを入力することは不可能になり、慣れる前に一般に明白に悩まされます。 EscとCtrlキーをできるだけ避けるために何でもするので、私にとってはうまくいきます。
これは、前述のRichのソリューションの後、前述の vim wikiaページ に表示された可能性があります。
; Author: fwompner gmail com
#InstallKeybdHook
SetCapsLockState, alwaysoff
Capslock::
Send {LControl Down}
KeyWait, CapsLock
Send {LControl Up}
if ( A_PriorKey = "CapsLock" )
{
Send {Esc}
}
return
これは私の仕事ではありませんが、私はそれを使い始めましたが、説明どおりに機能し、実際の警告はありません。例外はマップされないため(例外が必要ないため)、Chrome(私はVimiumにそれが本当に欲しかった)。
私は次の AutoHotkey スクリプトを使用します Vim Tips Wikiで見つけたもの からの改作。実装は少しハックですが、「私にとってはうまくいきます」。 (そして、2016-09-19現在のこのページの他の回答とは異なり、私が認識している警告なしに問題を完全に解決します。)
元のコーダーは指摘しました:
スクリプトはまた、Ctrlキーと別のキーを押して両方をすばやく離す、つまりタイムアウト期間の前に「誤検知」を検出して回避しようとします。
キーボードの性能や反応時間に応じて、250msの値を微調整してください。これはおそらくあなた自身の好みに合わせて実験的に微調整するものです。
g_LastCtrlKeyDownTime := 0
g_AbortSendEsc := false
g_ControlRepeatDetected := false
*CapsLock::
if (g_ControlRepeatDetected)
{
return
}
send,{Ctrl down}
g_LastCtrlKeyDownTime := A_TickCount
g_AbortSendEsc := false
g_ControlRepeatDetected := true
return
*CapsLock Up::
send,{Ctrl up}
g_ControlRepeatDetected := false
if (g_AbortSendEsc)
{
return
}
current_time := A_TickCount
time_elapsed := current_time - g_LastCtrlKeyDownTime
if (time_elapsed <= 250)
{
SendInput {Esc}
}
return
~*^a::
~*^b::
~*^c::
~*^d::
~*^e::
~*^f::
~*^g::
~*^h::
~*^i::
~*^j::
~*^k::
~*^l::
~*^m::
~*^n::
~*^o::
~*^p::
~*^q::
~*^r::
~*^s::
~*^t::
~*^u::
~*^v::
~*^w::
~*^x::
~*^y::
~*^z::
~*^1::
~*^2::
~*^3::
~*^4::
~*^5::
~*^6::
~*^7::
~*^8::
~*^9::
~*^0::
~*^Space::
~*^Backspace::
~*^Delete::
~*^Insert::
~*^Home::
~*^End::
~*^PgUp::
~*^PgDn::
~*^Tab::
~*^Return::
~*^,::
~*^.::
~*^/::
~*^;::
~*^'::
~*^[::
~*^]::
~*^\::
~*^-::
~*^=::
~*^`::
~*^F1::
~*^F2::
~*^F3::
~*^F4::
~*^F5::
~*^F6::
~*^F7::
~*^F8::
~*^F9::
~*^F10::
~*^F11::
~*^F12::
g_AbortSendEsc := true
return
以下は、Caps LockをWindows 7でエスケープするためにマップするレジストリエントリです。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,46,00,01,00,3a,00,00,00,00,00
上記を.reg拡張子の付いたファイル(mapCapLocks.regなど)に保存し、マシンにインポート/実行します。これを行うには、ファイルエクスプローラーでそのファイルをクリックし、サインアウトして再度サインインします。
私はこれに似たものを探していましたが、残念ながら、ここでの回答からのAHKスクリプトはうまく機能しませんでした。
しかし、私は vim wiki でこれを解決する解決策を見つけました。
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
を押し、dual-key-remap.exeファイルをそこにドラッグします。Altキーを押しながらショートカットを作成します。 (または、右クリックして[ショートカットを作成]を選択し、ショートカットをスタートアップディレクトリに移動します)。実際、私はここで完璧なソリューションを構築したと思います:
Vimユーザーとして、これは私にとって必須であり、長い間Windowsで成功して使用してきました。 regeditを使用してHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
にエントリを作成し、実行可能ファイルをポイントするだけで機能します。
依存関係をコンパイルしてインストールするには、リポジトリREADMEとインターセプトのメインWebサイトを確認してください。
同じバージョンのLinuxバージョンもここで作成しました。
短いソースコードを自分でコンパイルしてもかまわない場合は、以下のコードを使用できます。 Windowsコンソールアプリケーションとしてコンパイルする必要があります。たとえば、Visual C++コマンドプロンプトでは、次のコマンドでコンパイルできます。
cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib
キーの再マッピングは、アプリケーションの実行中に機能します。再起動、ログアウト/ログインなどは必要ありません。管理者権限で実行されているアプリケーションを再マッピングする必要がある場合は、リマッパーアプリケーションも管理者として実行する必要があります。すでに数日間(Windows 10で)使用していますが、これまでのところ良好です。
// The app allows to remap CapsLock key to Esc (if pressed separately) or to Ctrl (if pressed with other keys).
// This may be useful for Vim.
// To compile from Visual C++ command Prompt:
// cl /D_WIN32_WINNT=0x0401 remap_capslock.cpp /EHsc /link user32.lib
// Original source (which supported only Caps-Ctrl remapping): https://superuser.com/a/1490007/22750
#include <windows.h>
#include <iostream>
#include <set>
HHOOK hook;
std::set<Word> keys_down;
bool caps_down = false;
bool caps_was_down_with_another_key = false;
LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam) {
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *) lParam;
INPUT input[3] = {{ INPUT_KEYBOARD }, { INPUT_KEYBOARD }, { INPUT_KEYBOARD }};
if ((p->flags & LLKHF_INJECTED) == 0) {
std::cout << "nCode=" << nCode << "\twParam=" << wParam << "\tvkCode=" << p->vkCode << "\tscanCode=" << p->scanCode << std::endl;
bool keyup = wParam == WM_KEYUP || wParam == WM_SYSKEYUP;
if (p->vkCode == VK_CAPITAL) {
if (keyup) {
if (caps_was_down_with_another_key) {
std::cout << "Remapping CAPSLOCK UP to CTRL UP" << std::endl;
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.wVk = VK_LCONTROL;
SendInput(1, input, sizeof (INPUT));
} else {
std::cout << "Remapping CAPSLOCK UP to ESCAPE DOWN&UP" << std::endl;
input[0].ki.dwFlags = KEYEVENTF_KEYUP;
input[0].ki.wVk = VK_LCONTROL;
input[1].ki.dwFlags = 0;
input[1].ki.wVk = VK_ESCAPE;
input[2].ki.dwFlags = KEYEVENTF_KEYUP;
input[2].ki.wVk = VK_ESCAPE;
SendInput(3, input, sizeof (INPUT));
}
caps_down = false;
caps_was_down_with_another_key = false;
} else {
std::cout << "Remapping CAPSLOCK DOWN to CTRL DOWN" << std::endl;
caps_down = true;
input[0].ki.dwFlags = 0;
input[0].ki.wVk = VK_LCONTROL;
SendInput(1, input, sizeof (INPUT));
}
return 1;
} else {
if (keyup) {
keys_down.erase(p->vkCode);
} else {
keys_down.insert(p->vkCode);
}
std::cout << keys_down.size() << " keys down" << std::endl;
}
if (caps_down && !keys_down.empty()) {
caps_was_down_with_another_key = true;
}
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
int main(int argc, char **argv){
MSG messages;
hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, NULL, 0);
if (hook == NULL) {
std::cout << "Error " << GetLastError() << std::endl;
return 1;
}
std::cout << "Mapping ??? CAPSLOCK=>LCTRL and LCTRL=>CAPSLOCK..." << std::endl;
while (GetMessage (&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return 0;
}
この記事 に記載されている Windows Server 2003 Resource Kit Tools に含まれているremapkey.exeプログラムは、Windows 7でうまく機能します。
うまくいった答えについてコメントするのに十分な評判がありません。私はまだそれを賛成しました。
pepper-chico's 答えは私のために働いた。
Caps Lockキーは、単独で押すとエスケープキーとして動作します。また、他と組み合わせるとCtrlキーのように動作します。これについても同じ使用例があります。 Vim。
彼が提供したリンクの指示は、従うのに十分単純です。