2012-06-09 108 views
1

我使用addGlobalMonitorForEventsMatchingMask聽取事件可可:可可窗口中拖動

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

雖然我想知道如果我拖動/移動窗口(和窗口,是的,我能找到儘管我知道,當按住命令並拖動一個窗口時,聚焦的窗口不會聚焦)。

因此,我可以檢測是否要拖動窗口嗎?

更新:

我現在有一個類:(後來也許windowWillMove太)「SATest : NSObject <NSWindowDelegate>」中,我實現了windowDidMove方法雖然,現在下一步將安裝這一個窗口,對不對?所以我現在的問題是:如何將代理附加到所有應用程序的所有窗口?

更新2:

我現在可以發現屏幕上所有打開窗口的列表:

AXUIElementRef _systemWideElement; 
_systemWideElement = AXUIElementCreateSystemWide(); 

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

現在我要遍歷窗口,每一個的得到它的NSWindow這樣我就可以添加我的代表:[window setDelegate:self];

更新3:要清楚,這個問題是關於檢測拖動所有應用程序的所有窗口。不僅是我自己的應用程序的窗口。

此外,我很新的事件和窗口管理的東西,所以沒有必要保持你的答案總之我很高興地讀了很多:P

謝謝! -P

回答

0

正如Benjamin所建議的,答案在於可訪問性API。在我問這個問題之前,我一直在這裏環顧一下,但從來沒有做到我想要的。我現在找到了一個非常好的解決方案。

在一個高層次的我做到以下幾點:

  1. 聽鼠標按下事件並記住無論在哪個窗口您點擊與它的位置。
  2. 聽鼠標向上事件,並檢查位置發生了變化,如果是的話,你知道你移動的窗口

你可以做的尺寸類似的東西,如果你也想知道,如果你調整。可能有更好的解決方案,但經過幾天的嘗試,這是我按照自己想要的方式工作的唯一方法。

希望這可以幫助任何尋找類似東西的人。

-Pablo

4

要找出是否被拖動的窗口需要具有通過響應NSWindowDelegate協議的以下消息作爲窗口的委託的對象:

  1. windowWillMove - 這告訴代表窗口即將移動。
  2. windowDidMove - 這告訴代表窗口已經移動。

    例如:

您可以通過發送對象發送給這些方法的通知參數檢索問題NSWindow對象

NSWindow draggedWindow = [notification object]; 

更多信息可在here找到。

更新:

在回答您的有關獲取該信息的所有窗口的NSApplication類提供了返回應用程序的所有窗口的數組的方法請求。獲取此信息的典型方法是使用NSApplicationDelegate方法之一來獲取對應用程序對象的引用。

例如,在您的應用程序委託(僞):

- (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:

這應該足以讓你開始解決你的問題。

+0

我有點困惑在這裏,我得到了我的課: 「@interface SATEST:NSObject的」 和我實現了windowDidMove方法。雖然我如何將它添加到窗口? (我從哪裏得到這個窗口:P我試圖讓所有窗口的這個移動的東西打開所有的應用程序。) –

+0

你需要在你的筆尖文件中創建一個實例,並按住Ctrl鍵從對象拖動到窗口將其設置爲該窗口的代表。或者,您可以在AppDelegate上實現以保存在nib文件中創建新對象。 –

+0

我還沒有嘗試過,但是這僅僅是我自己的應用程序的窗口?我試圖從其他應用程序中獲取它。我想知道當前任何應用程序的任何窗口正在移動。雖然要嘗試一些東西,謝謝! –