【问题标题】:CGEventSetFlags - Discover when shift modifier key is required from local stringCGEventSetFlags - 发现何时需要本地字符串中的 shift 修饰键
【发布时间】:2014-06-09 21:03:39
【问题描述】:

这是我的第一篇文章,如果有任何需要编辑的地方,请告诉我。

我目前有一个函数,它通过传递一个字符来返回苹果键盘的虚拟键代码; CGKeyCode keyCodeForChar(),它有效,我已经对照各种网络资源检查了结果。

诸如NSString *myString = @"Hello World!" 之类的本地字符串被分解并处理每个字符,检索CGKeyCode 并尝试使用CGEventPost() 写入。这是可行的,但是在我尝试检测何时应将字母大写的正确标志时,整个字符串都以小写形式打印出来。到目前为止,这是我的代码:

NSString *myString = @"Hello World!";
if (![self.view.window isKeyWindow])
{
    for (int i = 0; i < myString.length; i++)
    {
        char c = [theString characterAtIndex:i];
        CGKeyCode keyCode = keyCodeForChar(c);

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

        // Key down event
        event = CGEventCreateKeyboardEvent(source, keyCode, true);
        CGEventSetFlags(event, (flags & CGEventGetFlags(event)));
        CGEventPost(kCGHIDEventTap, event);
        CFRelease(event);

        // Key up event
        event = CGEventCreateKeyboardEvent(source, keyCode, false);
        CGEventSetFlags(event, (flags & CGEventGetFlags(event))); 
        CGEventPost(kCGHIDEventTap, event);
        CFRelease(event);

        CFRelease(source);
    }
}

当前输出为hello world1,1 来自与“!”相同的CGKeyCode。因此,我相信我检测到正确的标志掩码是错误的。我看过这里提出的类似问题,例如:

Obtaining modifier key pressed in CGEvent tap

CGEventPost - possible bug when simulating keyboard events?

但是那里的解决方案对我没有用,如果有人可以帮助我解决我哪里出错了,那就太好了!

谢谢你, 克雷格

【问题讨论】:

    标签: objective-c macos cocoa quartz-graphics keyboard-events


    【解决方案1】:

    对于未来的搜索者:应该是 (flags | CGEventGetFlags(event)) 而不是 & ... 其他明智的移位仅在已应用移位时才应用。

    至于确定何时应按下 shift,您的 keyCodeForChar 函数也应提供附加信息,类似于 Windows 上的 VkKeyScan()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2012-11-12
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多