我正在使用addGlobalMonitorForEventsMatchingMask来侦听Cocoa中的事件:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask
handler:^(NSEvent *event) {
NSLog(@"Dragged...");
}];
虽然我想知道我是否正在拖动/移动一个窗口(哪个是哪个窗口,我可以找到聚焦窗口但是当我按住命令并拖动一个窗口时它就不会得到焦点据我所知。)
那么,我能否检测到我是否正在拖动一个窗口?
更新
我现在有一个类:“SATest : NSObject <NSWindowDelegate>
”我在其中实现了windowDidMove方法(后来也许是windowWillMove)。但是,现在下一步是将它附加到一个窗口,对吧?所以我现在的问题是:如何将代理附加到所有应用程序的所有窗口?
更新2:
我现在可以在屏幕上找到所有打开窗口的列表:
AXUIElementRef _systemWideElement;
_systemWideElement = AXUIElementCreateSystemWide();
CFArrayRef _windows;
AXUIElementCopyAttributeValues(_systemWideElement, kAXWindowsAttribute, 0, 100, &_windows);
现在我必须遍历窗口,并且每个人都得到它的NSWindow,所以我可以添加我的代表:[window setDelegate:self];
更新3:要清楚,这个问题是关于检测拖动所有应用程序的所有窗口。不仅是我自己的应用程序的窗口。
另外,我对这个事件和窗口管理的东西很新,所以不需要保持你的答案简短我很高兴看了很多:P
谢谢! -P
答案 0 :(得分:4)
要查明是否正在拖动窗口,您需要通过响应 NSWindowDelegate 协议的以下消息,让对象充当窗口的委托:
您可以通过将 object 发送到发送到这些方法的通知参数来检索有问题的NSWindow对象:
e.g。
NSWindow draggedWindow = [notification object];
可以找到更多信息here。
<强>更新强>
为响应您关于获取所有窗口信息的请求,NSApplication类提供了一个方法,该方法返回应用程序拥有的所有窗口的数组。获取此信息的典型方法是使用NSApplicationDelegate方法之一来获取对应用程序对象的引用。
例如,在您的app delegate(伪代码)中:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSApplication * app = [aNotification object];
// you now have a reference to your application.
// and can iterate over the collection of windows and call
// [window setDelegate:self]; for each window.
}
请注意,在添加和删除窗口时,您需要添加/删除代理。执行此操作的最佳方法是 - applicationDidUpdate:。
这足以让您开始解决问题。
答案 1 :(得分:1)
正如本杰明所建议的,答案在于辅助功能API。我在这里看了一会儿,甚至在我问这个问题之前,但从来没有做过我想做的事。我现在找到了一个非常好的解决方案。
在高级别,我会做以下事情:
如果您还想知道是否调整了大小,也可以为大小做类似的事情。可能有一个更好的解决方案,但经过几天尝试后,这是我按照我想要的方式工作的唯一方法。
希望这有助于任何寻找类似事物的人。
-Pablo