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


23

Caps Lockキーを他のキーと一緒に押されていない場合はEscapeにマップし、そうであればControlをマップできるようにします。Windows 7でこれを行うにはどうすればよいですか?



4
まあ、条件付きの再割り当てはそこで扱われていません
-wizzard0

レジスタを変更して作成しました:commons.lbl.gov/display/~jwelcher@lbl.gov / ...これを行った後、コンピューターを再起動する必要があります。Win7。
静的または

回答:


8

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

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


1
SharpKeysを使用して、Caps LockキーをEscapeにマップしています。
ザミアマンジ

6

これはまさにあなたが望むものではありませんが、いくつかの欠陥を抱えて生きることができれば非常に近いものです。ここだ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
カザーク

私は理解しようとしています-したがって、スクリプトの欠点は、Caps Lockが押されて解放されると、Ctrlとエスケープの両方が送信されるということです?
リシ

5

これは、上記の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をvimのControl / Escapeに再バインドするためにこれを使用しています。
ブランドン

1
動作します!明確にするために、これはAutoHotKeyスクリプトです。ここからスタート:autohotkey.com
マイケル・フォックス

クリックして私の要点に関するコメントを見なかった読者のために、このソリューションはを押すCaps Lock前に押す場合にのみ機能するようですShiftCaps+Shift+X動作しますが、Shift+Caps+X動作しません。
リッチ

4

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

元のコーダーは次のことに注意しました。

また、このスクリプトは、Controlキーと別のキーを押してすぐに両方をリリースする「タイムアウト期間前」の「誤検知」を検出して回避しようとします。

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

CapsLockCtrlEscape.ahkの要点

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

3

以下は、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など)のファイルに保存し、マシンでインポート/実行します。


リンクされたページが変更されると回答が無効になる可能性があるため、回答の重要な部分を参照リンクから引用してください。現在404ですので、この回答は役に立ちません。
DavidPostill

素晴らしい点。答えを更新します
ストライカー

これにより、ScrollLockキーがCapsLockにマップされます。それが望んでいない場合は、値を使用しますhex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00。このマップの便利なエディターは、PlexDataのScancodeMappingです。
アップルシェル

2

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

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

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

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


2

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

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

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

0

この記事に記載されているWindows Server 2003リソースキットツールに含まれているremapkey.exeプログラムは、Windows 7でうまく機能します。


1
回答としてリンクを使用しないでください。代わりに、リンクの内容をできる限り説明してから、参照として使用してください。リンクが壊れた場合、あなたの答えもすべて壊れます。
ロレンツォフォンマッターホルン

0

私に役立つ答えについてコメントするほどの評判はありません。それでも私はそれを支持した。

コショウチコの答えは私のために働いた。

Caps Lockキーを単独で押すと、エスケープキーとして動作します。他のキーと組み合わせた場合、Ctrlキーのように動作します。これにも同じユースケースがあります。Vim。

彼が提供したリンクの指示は、従うほど簡単です。


0

短いソースコードを自分でコンパイルしてもかまわない場合は、以下のコードを使用できます。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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.