在OSx中模拟/发送修饰键(Cntrl,Alt,fn,Shift)

matt007

我正在发送键盘按键和按键释放事件,这些事件适用于所有键盘按键。

但是,仅当与修饰符键关联的键是从应用程序而非真实硬件发送时,修饰符键才起作用。那就是如果我从应用程序发送Shift和'a',它会打印'A'(大写字母A,这是预期的)。

但是,如果我从应用程序发送“ shift”键按下事件,然后从物理键盘输入“ a”,则会打印“ a”(Shift键似乎无法在不同设备上使用)。其他修改器键(例如cmd,alt和fn键!)也是如此。

有没有一种方法可以将修改键发送到系统,以便可以从应用程序中模拟修改键?具体来说,我想从应用程序激活修改键,然后从物理键盘输入组合键

这是我用来发送按键和释放事件的代码。

- (void)setADBKey:(uint32)key value:(int)value
{
    if (!eventSource)
    {
        eventSource  = CGEventSourceCreate(kCGEventSourceStatePrivate);
    }

    CGEventRef event = CGEventCreateKeyboardEvent(eventSource, key, value!=0);
    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}

我还尝试通过以下代码创建和发送系统事件

struct 
{

    CGKeyCode keyCode;
    int flag;
    int cgEventFlag;

} modifiers[] = {

    { 56, NX_DEVICELSHIFTKEYMASK, kCGEventFlagMaskShift },
    { 60, NX_DEVICERSHIFTKEYMASK, kCGEventFlagMaskShift },
    { 59, NX_DEVICELCTLKEYMASK, kCGEventFlagMaskControl },
    { 58, NX_DEVICELALTKEYMASK, kCGEventFlagMaskAlternate },
    { 61, NX_DEVICERALTKEYMASK, kCGEventFlagMaskAlternate },
    { 55, NX_DEVICELCMDKEYMASK, kCGEventFlagMaskCommand },
    { 54, NX_DEVICERCMDKEYMASK, kCGEventFlagMaskCommand }

};

- (void)setAdbKey:(uint32)adbkey value:(int)value repeat:(BOOL)repeat
{
    //int adbkey = def_usb_2_adb_keymap[hidkey];

    int modifier = 0;

    for(int i=0; i< ARR_SIZE(modifiers); i++)
    {
        if (adbkey == modifiers[i].keyCode)
        {
            modifier = modifiers[i].cgEventFlag;
            break;
        }
    }

    if (value)
    {
        flags |= modifier;
    }             
    else 
    {
        flags &= ~modifier;
    }

    CGEventRef event = CGEventCreateKeyboardEvent(eventSource, adbkey, value!=0);

    if (repeat)
    {
        CGEventSetIntegerValueField(event, kCGKeyboardEventAutorepeat, (int64_t)1);
    }

    // don't apply modifier flags to a modifier
    if (!modifier)
    {
        CGEventSetFlags(event, flags);
    }

    CGEventPost(kCGHIDEventTap, event);
    CFRelease(event);
}

当从应用程序发送修饰键和组合键时,这两种方法都有效,但仅从应用程序设置修饰键时,这两种方法均无效。

维莱克

您所要做的就是创建一个事件水龙头并设置遮罩。

样本:

@interface AppDelegate ()

@property (assign) CFMachPortRef myEventTap;
@property (assign) CFRunLoopSourceRef myRunLoopSource;

@end

@implementation AppDelegate

CGEventRef MyEventTapCallBack(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    CGEventSetFlags(event, kCGEventFlagMaskShift);
    return event;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.myEventTap = CGEventTapCreate(kCGHIDEventTap,
                                            kCGHeadInsertEventTap,
                                            kCGEventTapOptionDefault,
                                            CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventFlagsChanged),
                                            MyEventTapCallBack,
                                            (__bridge void *)self);
    if (self.myEventTap) {
        self.myRunLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, self.myEventTap, 0);
        if (self.myRunLoopSource)
            CFRunLoopAddSource(CFRunLoopGetMain(), self.myRunLoopSource, kCFRunLoopCommonModes);
    }
}

- (void)applicationWillTerminate:(NSNotification *)aNotification {
    if (self.myRunLoopSource) {
        CFRunLoopSourceInvalidate(self.myRunLoopSource);
        CFRelease(self.myRunLoopSource);
    }
    if (self.myEventTap)
        CFRelease(self.myEventTap);
}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在OSx中模拟/发送修饰键(Cntrl,Alt,fn,Shift)

来自分类Dev

从 Android Teamviewer 发送 Alt Shift 和 Ctrl 组合键

来自分类Dev

Unity启动器:组合单击和修饰键(Shift,Alt,Ctrl,...)

来自分类Dev

使用QLineEdit中的Alt / Shift修饰符的EventFilter中出现问题

来自分类Dev

如何关闭GNOME中的alt-shift-uparrow键绑定?

来自分类Dev

如何关闭GNOME中的alt-shift-uparrow键绑定?

来自分类Dev

什么是STS中Alt + Shift + G的反向键

来自分类Dev

如何使我的超级键(Windows键)的行为更像Linux中的Ctrl / Alt / Shift

来自分类Dev

如何发送左shift键?

来自分类Dev

是否可以在Linux中配置(确实)全局键盘快捷键(如ctrl + alt + fN)?

来自分类Dev

Alt+Ctl+FN 组合键(又名 srvrkeys)是否硬编码到 Xorg 中?

来自分类Dev

Shift + Alt使用三键组合

来自分类Dev

模拟Alt + Tab键按下

来自分类Dev

如何在记事本中禁用'shift'+'alt'键盘快捷键

来自分类Dev

Windows 10 Pro(1903版)中的“ Ctrl + Alt + Shift + F”组合键有什么作用?

来自分类Dev

用自动键模拟Home + Shift + End

来自分类Dev

使用Shift键模拟水平滚动

来自分类Dev

如何使用 xmodmap 将 Alt 键用作 Shift 键?

来自分类Dev

是否可以使emacs interpet作为fn键作为修饰键?

来自分类Dev

Logitech MX密钥发送不正确的修饰键

来自分类Dev

在WPF ContextMenu中捕获修饰键

来自分类Dev

在WPF ContextMenu中捕获修饰键

来自分类Dev

在Linux中禁用alt ctrl Fn

来自分类Dev

如何模拟按Fn + F6键?

来自分类Dev

Windows 10 Multiple Desktops-Ubuntu中的CTRL + ALT + SHIFT + LEFT / RIGHT的等效键盘快捷键吗?

来自分类Dev

使用左右Alt + Shift组合键更改键盘布局

来自分类Dev

使用左右Alt + Shift组合键更改键盘布局

来自分类Dev

仅显示Ctrl,Shift,Alt键状态的实用程序?

来自分类Dev

qt中的Shift键单击?

Related 相关文章

  1. 1

    在OSx中模拟/发送修饰键(Cntrl,Alt,fn,Shift)

  2. 2

    从 Android Teamviewer 发送 Alt Shift 和 Ctrl 组合键

  3. 3

    Unity启动器:组合单击和修饰键(Shift,Alt,Ctrl,...)

  4. 4

    使用QLineEdit中的Alt / Shift修饰符的EventFilter中出现问题

  5. 5

    如何关闭GNOME中的alt-shift-uparrow键绑定?

  6. 6

    如何关闭GNOME中的alt-shift-uparrow键绑定?

  7. 7

    什么是STS中Alt + Shift + G的反向键

  8. 8

    如何使我的超级键(Windows键)的行为更像Linux中的Ctrl / Alt / Shift

  9. 9

    如何发送左shift键?

  10. 10

    是否可以在Linux中配置(确实)全局键盘快捷键(如ctrl + alt + fN)?

  11. 11

    Alt+Ctl+FN 组合键(又名 srvrkeys)是否硬编码到 Xorg 中?

  12. 12

    Shift + Alt使用三键组合

  13. 13

    模拟Alt + Tab键按下

  14. 14

    如何在记事本中禁用'shift'+'alt'键盘快捷键

  15. 15

    Windows 10 Pro(1903版)中的“ Ctrl + Alt + Shift + F”组合键有什么作用?

  16. 16

    用自动键模拟Home + Shift + End

  17. 17

    使用Shift键模拟水平滚动

  18. 18

    如何使用 xmodmap 将 Alt 键用作 Shift 键?

  19. 19

    是否可以使emacs interpet作为fn键作为修饰键?

  20. 20

    Logitech MX密钥发送不正确的修饰键

  21. 21

    在WPF ContextMenu中捕获修饰键

  22. 22

    在WPF ContextMenu中捕获修饰键

  23. 23

    在Linux中禁用alt ctrl Fn

  24. 24

    如何模拟按Fn + F6键?

  25. 25

    Windows 10 Multiple Desktops-Ubuntu中的CTRL + ALT + SHIFT + LEFT / RIGHT的等效键盘快捷键吗?

  26. 26

    使用左右Alt + Shift组合键更改键盘布局

  27. 27

    使用左右Alt + Shift组合键更改键盘布局

  28. 28

    仅显示Ctrl,Shift,Alt键状态的实用程序?

  29. 29

    qt中的Shift键单击?

热门标签

归档