提问人:user21737 提问时间:9/24/2008 最后编辑:user21737 更新时间:2/7/2015 访问量:5578
使 OSX 应用程序在未聚焦时响应第一次鼠标单击
Make OSX application respond to first mouse click when not focused
问:
普通的 OSX 应用程序在未聚焦时会吃掉第一次鼠标点击以首先聚焦应用程序。然后,应用程序将处理将来的点击。iTunes 播放/暂停按钮和 Finder 的行为不同,即使没有聚焦,第一次点击也会起作用。我正在寻找一种方法来强制现有应用程序(远程桌面 Connection.app)在第一次单击时采取行动,而不仅仅是集中注意力。
答:
1赞
Hans Sjunnesson
9/25/2008
#1
在不聚焦时响应第一次鼠标单击称为“点击”。它的价值引起了激烈的争论,例如这里和这里。
评论
4赞
Gavriel
1/23/2023
这是无关紧要的。当有人问你汉堡王在哪里时,你不会开始说服他们吃素。有些人习惯于“点击”。例如,来自用户友好操作系统的人。事实上,这可以(并且应该)是一个系统设置。我不知道为什么不是,可能是因为苹果的自负(他们认为他们更了解一切)
14赞
Casey Fleser
9/25/2008
#2
检查 NSView 的 acceptsFirstMouse,它可能就是你要找的。
接受FirstMouse: 如果应向接收方发送初始鼠标按下事件的 mouseDown: 消息,则由子类覆盖以返回 YES,否则返回 NO。
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
参数 theevent(事件) 初始鼠标按下事件,该事件必须位于其窗口中的接收器上方。
讨论 接收方可以无条件地返回一个值,也可以使用 Event 的位置来确定它是否需要该事件。默认实现将忽略 Event 并返回 NO。
在子类中重写此方法,以允许实例响应点击。这允许用户单击非活动窗口中的视图,只需单击一下即可激活视图,而不是先单击以激活窗口,然后单击视图。大多数视图对象拒绝单击尝试,因此该事件只是激活窗口。但是,许多控件对象(如 NSButton 和 NSSlider 的实例)都接受它们,因此用户可以立即操作控件,而无需释放鼠标按钮。
评论
0赞
xilopaint
9/26/2023
您知道我们是否可以在 SwiftUI 中实现这一点吗?
0赞
johndpope
2/7/2015
#3
假设您有 1 个视图控制器,它总是在徘徊。覆盖 loadview。注意,这在优胜美地之前是行不通的。
- (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];
}
}
评论
0赞
Oliver Cooper
4/14/2015
坦率地说,这是一个无望的解决方案。
0赞
johndpope
4/14/2015
您可以尝试覆盖 nswindow 的 contentview,使其不那么脆弱。
评论