objective-c – addGlobalMonitorForEventsMatchingMask仅返回鼠标位置

objective-c – addGlobalMonitorForEventsMatchingMask仅返回鼠标位置,第1张

概述我正在努力学习为Mac编写代码.我曾经是一个 Java家伙,所以我希望我遇到的问题是对Cocoa的一个简单的误解. 我有以下代码: -(IBAction)beginEventMonitor:(id)sender { _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask) handl 我正在努力学习为Mac编写代码.我曾经是一个 Java家伙,所以我希望我遇到的问题是对Cocoa的一个简单的误解.

我有以下代码:

-(IBAction)beginEventMonitor:(ID)sender {  _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSleftMouseUpMask)  handler:^(NSEvent *incomingEvent) {    //NSWindow *targetwindowForEvent = [incomingEvent window];    NSLog(@"Got a mouse click event at %@",NsstringFromPoint([incomingEvent locationInWindow]));    }];}-(IBAction)stopEventMonitor:(ID)sender {  if (_eventMonitor) {    [NSEvent removeMonitor:_eventMonitor];    _eventMonitor = nil;  }}

这是一个简单的钩子,告诉我何时在全局级别发生鼠标点击.处理程序正在运行,但incomingEvent的内容似乎没有设置为任何东西.我能找到的唯一有用的信息是点击时鼠标的位置,以及被点击的窗口的windowID.

我不应该能够获得更多信息吗?我没有正确设置显示器吗?我真的希望能够知道点击了哪个窗口,但我甚至找不到将鼠标位置或windowID转换为有用的方法的方法.

解决方法 您可以使用CGWindow API(Leopard中的新增功能)检索有关窗口的更多信息,例如:

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber];CFArrayRef a = CFArrayCreate(NulL,(voID *)&windowID,1,NulL);NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a);CFRelease(a);if ([windowInfos count] > 0) {    NSDictionary *windowInfo = [windowInfos objectAtIndex:0];    NSLog(@"name:  %@",[windowInfo objectForKey:(Nsstring *)kCGWindowname]);    NSLog(@"Owner: %@",[windowInfo objectForKey:(Nsstring *)kCGWindowOwnername]);    //etc.}[windowInfos release];

那里有很多信息(查看CGWindow.h或参考文档获取可用的密钥).还有一些功能可以创建一个窗口的屏幕截图(如果它被另一个窗口部分覆盖,它甚至可以工作),很酷的东西!

总结

以上是内存溢出为你收集整理的objective-c – addGlobalMonitorForEventsMatchingMask仅返回鼠标位置全部内容,希望文章能够帮你解决objective-c – addGlobalMonitorForEventsMatchingMask仅返回鼠标位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存