gpt4 book ai didi

c++ - 如何在 OSX 上使用 C++ 中的 CGEventPost 保持按键按下?

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:54 24 4
gpt4 key购买 nike

我在 OSX 上使用 C++ 中的 ApplicationServices 和 CGEventPost,我想看看我是否可以按住某个键,但它不起作用。

这是我正在使用的方法:

void postKeyboardEvent( int keyCode, bool keyUp = false )
{

CGEventSourceRef source = CGEventSourceCreate( kCGEventSourceStateHIDSystemState );

CGEventRef keyEvent = CGEventCreateKeyboardEvent( source, (CGKeyCode) keyCode, !keyUp );
CGEventPost( kCGAnnotatedSessionEventTap, keyEvent );
CFRelease( keyEvent );

CFRelease( source );

}

这是我测试它的方式:

postKeyboardEvent( kVK_Command );
postKeyboardEvent( kVK_Tab );
postKeyboardEvent( kVK_Tab, true );
postKeyboardEvent( kVK_Command, true );

根据我的理解,这应该将我切换到另一个窗口,但它只是“松开”Command 键并键入一个 Tab 字符。

重要提示:我不想使用如下内容:

CGEventSetFlags( keyEvent, kCGEventFlagMaskCommand );

我需要发送一个“串行链”的按键按下和按键向上命令不必知道哪些键代码是修改键或者用多少来标记事件。

有办法吗?

最佳答案

这就是答案! https://stackoverflow.com/a/8202467/877860发布者 https://stackoverflow.com/users/314546/valexa

The simplest way for this is just bitwise OR'ing the current modifier flags with the flag of your desired modifier(s) , e.g.:

CGEventFlags flags = kCGEventFlagMaskShift;
CGEventRef ev;
CGEventSourceRef source = CGEventSourceCreate (kCGEventSourceStateCombinedSessionState);

//press down
ev = CGEventCreateKeyboardEvent (source, keyCode, true);
CGEventSetFlags(ev,flags | CGEventGetFlags(ev)); //combine flags
CGEventPost(kCGHIDEventTap,ev);
CFRelease(ev);

//press up
ev = CGEventCreateKeyboardEvent (source, keyCode, false);
CGEventSetFlags(ev,flags | CGEventGetFlags(ev)); //combine flags
CGEventPost(kCGHIDEventTap,ev);
CFRelease(ev);

CFRelease(source);

更新:这是我找到的方法,它可以进行一些清理,但对于我将一系列键码发送到系统并让它们可预测地发生的目的来说,它工作得很好。

这里一个非常重要的元素是按位运算,如果 shift 没有按下则删除 shift 键掩码,使用 (& ~) 意思是 AND NOT。

int shiftKeyCode = 56;
bool shiftIsDown = false;

void postKeyboardEvent( int keyCode, bool keyUp = false )
{

// Don't send keys while blocked.
if( blockState == 1 ){

return;

}

if( keyCode == shiftKeyCode ){

if( keyUp ){

shiftIsDown = false;

}else{

shiftIsDown = true;

}

}

CGEventSourceRef source = CGEventSourceCreate( kCGEventSourceStateHIDSystemState );
CGEventRef keyEvent = CGEventCreateKeyboardEvent( source, (CGKeyCode) keyCode, !keyUp );

if( shiftIsDown ){

// Use Shift flag
CGEventSetFlags( keyEvent, CGEventGetFlags( keyEvent ) | kCGEventFlagMaskShift );

}else{

// Use all existing flag except Shift
CGEventSetFlags( keyEvent, CGEventGetFlags( keyEvent ) & ~kCGEventFlagMaskShift );

}

CGEventPost( kCGHIDEventTap, keyEvent );

CFRelease( keyEvent );
CFRelease( source );

}

关于c++ - 如何在 OSX 上使用 C++ 中的 CGEventPost 保持按键按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com