web-dev-qa-db-ja.com

Windows 7でのCaps Lockのエスケープとコントロールへのマッピング

Caps Lockキーが他のキーで押されていない場合はEscapeに、そうでない場合はControlにマッピングできるようにしたい。 Windows 7でそれを行うにはどうすればよいですか?

25
Zameer Manji

SharpKeys でEscapeに再マッピングできます

ただし、キーボードドライバーを作成する以外に、条件付き再マッピングを実行する現実的な方法はわかりません。

8
wizzard0

これはあなたが望むものではありませんが、いくつかの欠陥を抱えて生きることができれば非常に近いです。これが AutoHotKey スクリプトです。

$CapsLock::LControl
$CapsLock Up::Send {Escape}
return

Caps LockをCtrlに再マッピングし、キーを離すとEscapeを送信します。 Caps Lockキーを放すたびに、Escapeキーが押されることに慣れるのにしばらく時間がかかりました。ただし、Escapeキーを押すとテキストエリアにフォーカスがなくなるため、ウェブサイトのテキストエリアではほとんど役に立ちません。

私はこれに対する解決策を探しています。必要に応じて、Cである種のドライバ/キーボードフックを作成することもあります。

Vim固有の煩わしさ:Ctrl-Kの組み合わせを使用してダイグラフを入力することは不可能になり、慣れる前に一般に明白に悩まされます。 EscとCtrlキーをできるだけ避けるために何でもするので、私にとってはうまくいきます。

7
Henry Heikkinen

これは、前述の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にそれが本当に欲しかった)。

6
dragon788

私は次の AutoHotkey スクリプトを使用します Vim Tips Wikiで見つけたもの からの改作。実装は少しハックですが、「私にとってはうまくいきます」。 (そして、2016-09-19現在のこのページの他の回答とは異なり、私が認識している警告なしに問題を完全に解決します。)

元のコーダーは指摘しました:

スクリプトはまた、Ctrlキーと別のキーを押して両方をすばやく離す、つまりタイムアウト期間の前に「誤検知」を検出して回避しようとします。

キーボードの性能や反応時間に応じて、250msの値を微調整してください。これはおそらくあなた自身の好みに合わせて実験的に微調整するものです。

CapsLockCtrlEscape.ahk Gist

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
4
Rich

以下は、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など)に保存し、マシンにインポート/実行します。これを行うには、ファイルエクスプローラーでそのファイルをクリックし、サインアウトして再度サインインします。

4
Stryker

私はこれに似たものを探していましたが、残念ながら、ここでの回答からのAHKスクリプトはうまく機能しませんでした。

しかし、私は vim wiki でこれを解決する解決策を見つけました。

  • まず、次のアプリ dual-key-remap をダウンロードします。
  • 選択した場所にZipを抽出します(このようなユーティリティはC:\Users\%username%\util\
  • 次のディレクトリを開きます:C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\を押し、dual-key-remap.exeファイルをそこにドラッグします。Altキーを押しながらショートカットを作成します。 (または、右クリックして[ショートカットを作成]を選択し、ショートカットをスタートアップディレクトリに移動します)。
  • ログインとログアウト。ログインしてから数秒後、キーがリバウンドします。
2
curious-cat

実際、私はここで完璧なソリューションを構築したと思います:

Vimユーザーとして、これは私にとって必須であり、長い間Windowsで成功して使用してきました。 regeditを使用してHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runにエントリを作成し、実行可能ファイルをポイントするだけで機能します。

依存関係をコンパイルしてインストールするには、リポジトリREADMEとインターセプトのメインWebサイトを確認してください。

同じバージョンのLinuxバージョンもここで作成しました。

2
pepper_chico

短いソースコードを自分でコンパイルしてもかまわない場合は、以下のコードを使用できます。 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;
}
0
Alex Che

この記事 に記載されている Windows Server 2003 Resource Kit Tools に含まれているremapkey.exeプログラムは、Windows 7でうまく機能します。

0
justin

うまくいった答えについてコメントするのに十分な評判がありません。私はまだそれを賛成しました。

pepper-chico's 答えは私のために働いた。

Caps Lockキーは、単独で押すとエスケープキーとして動作します。また、他と組み合わせるとC​​trlキーのように動作します。これについても同じ使用例があります。 Vim。

彼が提供したリンクの指示は、従うのに十分単純です。

0
mrkvn