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)事件发生的位置,并使用调用堆栈
更近。