Caps Lockキーを他のキーと一緒に押されていない場合はEscapeにマップし、そうであればControlをマップできるようにします。Windows 7でこれを行うにはどうすればよいですか?
Caps Lockキーを他のキーと一緒に押されていない場合はEscapeにマップし、そうであればControlをマップできるようにします。Windows 7でこれを行うにはどうすればよいですか?
回答:
SharpKeysで Escapeに再マッピングできます
ただし、キーボードドライバーを記述する以外に、条件付き再マッピングを実行する現実的な方法は知りません。
これはまさにあなたが望むものではありませんが、いくつかの欠陥を抱えて生きることができれば非常に近いものです。ここだAutoHotkeyをスクリプトは:
$CapsLock::LControl
$CapsLock Up::Send {Escape}
return
Caps LockをCtrlに再マップし、キーを離すとEscapeを送信します。Caps Lockキーを放すたびにEscapeキーが押されるのに慣れるのに時間がかかりました。ただし、Escキーを押すとテキストエリアにフォーカスが移らないため、Webサイトのテキストエリアではほとんど役に立ちません。
しかし、これに対する解決策を探しています。必要に応じて、Cで何らかのドライバー/キーボードフックを作成することもできます(笑)。
Vim固有の迷惑:ダイグラフをCtrl-Kの組み合わせを使用して入力することを不可能にし、通常は慣れる前に単純に迷惑です。EscキーとCtrlキーをできるだけ避けるために何でもするので、それは私にとってはうまくいきます。
$CapsLock::Escape
、すぐにとreturn
。
これは、上記の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で欲しかった)。
Caps Lock
前に押す場合にのみ機能するようですShift
。Caps+Shift+X
動作しますが、Shift+Caps+X
動作しません。
このために、Vim Tips Wikiで見つけたものから改造した次のAutoHotkeyスクリプトを使用します。実装は少々ハッキーですが、「うまく機能します」。(2016-09-19時点でのこのページの他の回答とは異なり、私が認識している警告なしに問題を完全に解決します。)
元のコーダーは次のことに注意しました。
また、このスクリプトは、Controlキーと別のキーを押してすぐに両方をリリースする「タイムアウト期間前」の「誤検知」を検出して回避しようとします。
キーボードの良し悪し、および自分の反応時間に応じて、必ず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
以下は、Windows 7でエスケープするようにCaps Lockをマップするレジストリエントリです。
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など)のファイルに保存し、マシンでインポート/実行します。
hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
。このマップの便利なエディターは、PlexDataのScancodeMappingです。
実際、私はここで完璧なソリューションを構築したと思います:
Vimユーザーとして、これは私にとって必須であり、私は長い間Windowsで成功して使用してきました。HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
実行可能ファイルを指すようにregeditでエントリを作成するだけで、動作します。
依存関係をコンパイルしてインストールするには、リポジトリのREADMEおよびInterceptionのメインWebサイトを確認してください。
また、ここで同じもののLinuxバージョンを作成しました。
私はこれに似たものを探していましたが、残念なことに、ここでの回答からのAHKスクリプトはうまくいきませんでした。
しかし、vim wikiでこれを解決する解決策を見つけました。
C:\Users\%username%\util\
)C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
ます。Altキーを押しながらショートカットを作成しながら、dual-key-remap.exeファイルをそこにドラッグします。(または、右クリックして[ショートカットの作成]を選択し、ショートカットをスタートアップディレクトリに移動します)。この記事に記載されているWindows Server 2003リソースキットツールに含まれているremapkey.exeプログラムは、Windows 7でうまく機能します。
短いソースコードを自分でコンパイルしてもかまわない場合は、以下のコードを使用できます。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): /superuser//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;
}