捕获 NSEvent 以添加修饰符问题

Posted

技术标签:

【中文标题】捕获 NSEvent 以添加修饰符问题【英文标题】:Capturing NSEvent to add modifier Issue 【发布时间】:2015-06-29 15:35:02 【问题描述】:

我正在尝试以编程方式在可可应用程序中为我的用户按住选项键。

对于我的生活,我似乎无法抓住 NSEVENT 对其进行修改并重新发布。我仍然想捕获 MouseDown 事件,因为我使用了该位置 - 我一直在尝试抓取该事件并将修饰符标志添加到它,但它似乎不起作用。对此的任何帮助将不胜感激。

这就是我所做的:

- (void)mouseDown:(NSEvent *)theEvent 
    [super mouseDown:theEvent];

    if(!(theEvent.modifierFlags == NSAlternateKeyMask))

        NSEvent *newEvent = [NSEvent keyEventWithType:
                                      theEvent.type
                                      location:theEvent.locationInWindow 
                                      modifierFlags:NSAlternateKeyMask 
                                      timestamp:theEvent.timestamp 
                                      windowNumber:theEvent.windowNumber 
                                      context:theEvent.context 
                                      characters:@"" 
                                     charactersIgnoringModifiers:@"" 
                                     isARepeat:YES 
                                     keyCode:0];
           [super mouseDown:newEvent];
       

我也尝试过使用 CGPostEvent 的变体——但它似乎也从来没有工作过。显然只发布修饰符标志比看起来要困难。

谢谢

【问题讨论】:

按住选项键的目的是什么,即,其他代码的行为会有所不同,它将如何检测选项键的状态?如果其他代码使用CGEventSourceFlagsState 来检查修饰键状态,我不认为与NSEvents 混淆会愚弄它。 (顺便说一句,isARepeat:YES 看起来不对。) im尝试模拟内置于pdfkit中的选择功能 - 选择选项但不具有用户保持选项。 span> 为了清楚起见,我对其进行了编辑 - 删除了 cgeventsourceflagsstate 【参考方案1】:

我用这段代码解决了-

- (void)mouseDown:(NSEvent *)theEvent 

    if(!(theEvent.modifierFlags == NSAlternateKeyMask))

        [super mouseDown:[self createNewEvent:theEvent]];
    
    else 
        [super mouseDown:theEvent];

    


- (NSEvent *)createNewEvent:(NSEvent *)theEvent 
       NSEvent *newEvent = [NSEvent
                         keyEventWithType:NSKeyDown
                         location:theEvent.locationInWindow
                         modifierFlags:NSAlternateKeyMask
                         timestamp:theEvent.timestamp
                         windowNumber:theEvent.windowNumber
                         context:theEvent.context
                         characters:@""
                         charactersIgnoringModifiers:@""
                         isARepeat:NO
                         keyCode:0];
    return newEvent;

【讨论】:

以上是关于捕获 NSEvent 以添加修饰符问题的主要内容,如果未能解决你的问题,请参考以下文章

theEvent charactersIgnoringModifiers - 获取没有修饰符的字符

__block修饰符(四)

容易搞混---修饰符

vue事件修饰符和键盘事件

vue修饰符

应用程序启动时的键盘修饰符