13

正常的 OSX 应用程序在未聚焦时会首先单击鼠标以首先聚焦应用程序。然后应用程序处理未来的点击。iTunes 播放/暂停按钮和 Finder 的行为不同,即使没有聚焦,第一次点击也会起作用。我正在寻找一种方法来强制现有应用程序(远程桌面连接.app)在第一次点击时采取行动,而不仅仅是关注。

4

3 回答 3

14

检查 NSView 的acceptsFirstMouse,它可能就是你要找的。

接受FirstMouse:如果应该向接收者发送mouseDown:初始鼠标按下事件的消息,则由子类覆盖以返回YES,否则返回NO。

  • (BOOL)acceptsFirstMouse:(NSEvent *)theEvent

参数 theEvent 初始鼠标按下事件,它必须在其窗口中的接收器上方。

讨论 接收者可以无条件地返回一个值,也可以使用事件的位置来确定它是否需要该事件。默认实现忽略 theEvent 并返回 NO。

在子类中重写此方法以允许实例响应点击。这允许用户单击非活动窗口中的视图,只需单击即可激活视图,而不是先单击以使窗口处于活动状态,然后再单击视图。大多数视图对象拒绝点击尝试,因此事件只是激活窗口。然而,许多控件对象(例如 NSButton 和 NSSlider 的实例)确实接受它们,因此用户可以立即操作控件而无需释放鼠标按钮。

于 2008-09-24T19:01:09.703 回答
4

在未聚焦时响应第一次鼠标单击称为“单击通过”。它的价值也引起了激烈的争论,例如这里这里

于 2008-09-24T16:04:48.330 回答
0

// 假设你有 1 个一直挂着的视图控制器。超越加载视图。注意这在优胜美地之前是行不通的。

- (void)loadView {
    NSLog(@"loadView");


    self.view = [[NSView alloc] initWithFrame:
                 [[app.window contentView] frame]];
    [self.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways);
    trackingArea0 = [[NSTrackingArea alloc] initWithRect:self.view.bounds
                                                 options:opts
                                                   owner:self
                                                userInfo:nil];
    [self.view addTrackingArea:trackingArea0];


}
- (void)mouseEntered:(NSEvent *)theEvent {
    NSLog(@"entered");


        if ([[NSApplication sharedApplication] respondsToSelector:@selector(activateIgnoringOtherApps:)]) {
            [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
        }

}
于 2015-02-07T01:03:00.303 回答