Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MacOS上切换Caps Lock键_C++_Macos - Fatal编程技术网

C++ 在MacOS上切换Caps Lock键

C++ 在MacOS上切换Caps Lock键,c++,macos,C++,Macos,我们使用Scroll Lock(VK_Scroll)在Windows上进行调试,方法是在按键时引发异常。这可以通过以下方式检测: LONG key_state = GetKeyState(VK_SCROLL); return (key_state & 0x01) != 0; 在Mac电脑上,Scroll Lock不可用,因此我们检查Caps Lock如下: CGEventFlags mod = CGEventSourceFlagsState(kCGEventSourceStateCom

我们使用
Scroll Lock
VK_Scroll
)在Windows上进行调试,方法是在按键时引发异常。这可以通过以下方式检测:

LONG key_state = GetKeyState(VK_SCROLL);
return (key_state & 0x01) != 0;
在Mac电脑上,
Scroll Lock
不可用,因此我们检查
Caps Lock
如下:

CGEventFlags mod = CGEventSourceFlagsState(kCGEventSourceStateCombinedSessionState);
if ( mod & kCGEventFlagMaskAlphaShift )
    return true;

return false;
s_set_key_state(VK_SCROLL, FALSE);
extern void s_set_key_state(BYTE key, BOOL bState)
{
    // Toggle an extended key (eg. VK_NUMLOCK or VK_SCROLL)
    BYTE keyState[256];
    GetKeyboardState((LPBYTE)&keyState);
    if ((bState && !(keyState[key] & 1)) ||
        (!bState && (keyState[key] & 1)))
    {
        // Toggle the key by simulating a key press, then key release
        keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
        keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
}
启动时,我们需要确保
滚动锁定
上限锁定
绝对关闭。在Windows上,我可以按如下方式关闭
VK_SCROLL

CGEventFlags mod = CGEventSourceFlagsState(kCGEventSourceStateCombinedSessionState);
if ( mod & kCGEventFlagMaskAlphaShift )
    return true;

return false;
s_set_key_state(VK_SCROLL, FALSE);
extern void s_set_key_state(BYTE key, BOOL bState)
{
    // Toggle an extended key (eg. VK_NUMLOCK or VK_SCROLL)
    BYTE keyState[256];
    GetKeyboardState((LPBYTE)&keyState);
    if ((bState && !(keyState[key] & 1)) ||
        (!bState && (keyState[key] & 1)))
    {
        // Toggle the key by simulating a key press, then key release
        keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);
        keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
}

如何在MacOS或Linux上关闭Caps Lock?操作系统可以在编译时被检测到,因此我们可以将MacOS的
VK_SCROLL
更改为
Caps Lock

的等效版本。通常的做法是中断调试器,而不是在操作系统拥有的键盘键周围创建一系列黑客程序……这不是我的代码库,因此注释没有帮助。我们的情况似乎是这种功能的合理用例,这是我以前没有见过的。在旧C和C++代码的大杂烩中,找到事件发生的确切位置几乎是不可能的。如果很容易找到断点的位置,您就可以这样做。但是,通过战略性地检查
滚动锁
大写锁
,仅在调试模式下,我们可以断开接近事件发生的位置(ish),并使用
调用堆栈
更近。通常的方法是断开调试器,不要在操作系统拥有的键盘键周围制造一连串的黑客攻击……这不是我的代码库,所以评论没有帮助。我们的情况似乎是这种功能的合理用例,这是我以前没有见过的。在旧C和C++代码的大杂烩中,找到事件发生的确切位置几乎是不可能的。如果很容易找到断点的位置,您就可以这样做。但是,通过战略性地检查
滚动锁
上限锁
,仅在调试模式下,我们可以断开(ish)事件发生的位置,并使用
调用堆栈
更近。