gpt4 book ai didi

objective-c - cocoa 窗口拖动

转载 作者:行者123 更新时间:2023-12-03 16:27:12 27 4
gpt4 key购买 nike

我正在使用 addGlobalMonitorForEventsMatchingMask 来监听 Co​​coa 中的事件:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask 
handler:^(NSEvent *event) {
NSLog(@"Dragged...");
}];

虽然我想知道我是否正在拖动/移动一个窗口(以及哪个窗口,但我可以找到聚焦的窗口,但据我所知,当按住命令并拖动窗口时,它没有获得焦点.)

那么,我可以检测我是否在拖动窗口吗?

更新:

我现在有一个类:“SATest : NSObject <NSWindowDelegate> ”,我在其中实现了 windowDidMove 方法(稍后也可能实现了 windowWillMove。)不过,现在下一步是将其附加到窗口,对吗?所以我现在的问题是:如何将委托(delegate)附加到所有应用程序的所有窗口?

更新2:

我现在可以在屏幕上找到所有打开的窗口的列表:

AXUIElementRef _systemWideElement;
_systemWideElement = AXUIElementCreateSystemWide();

CFArrayRef _windows;
AXUIElementCopyAttributeValues(_systemWideElement, kAXWindowsAttribute, 0, 100, &_windows);

现在我必须迭代窗口,并且每个窗口都获取它的 NSWindow,以便我可以将我的委托(delegate)添加到其中:[window setDelegate:self];

更新 3:需要明确的是,这个问题是关于检测所有应用程序的所有窗口的拖动。不仅仅是我自己的应用程序的窗口。

另外,我对这个事件和窗口管理的东西非常陌生,所以不需要让你的答案简短,我很高兴阅读很多内容:P

谢谢!-P

最佳答案

要确定窗口是否被拖动,您需要有一个对象作为窗口的委托(delegate),通过响应 NSWindowDelegate 协议(protocol)的以下消息:

  1. windowWillMove - 这告诉代理窗口即将移动。
  2. windowDidMove - 这告诉委托(delegate)窗口已移动。

您可以通过将对象发送到发送给这些方法的通知参数来检索有问题的NSWindow对象:

例如

NSWindow draggedWindow = [notification object];

更多信息可参见here .

更新:

为了响应您关于获取所有窗口的此信息的请求,NSApplication类提供了一个方法,该方法返回应用程序拥有的所有窗口的数组。获取此信息的典型方法是使用 NSApplicationDelegate 之一方法来获取对应用程序对象的引用。

例如,在您的应用程序委托(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:

这应该足以让您开始解决问题。

关于objective-c - cocoa 窗口拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963443/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com