2016-01-05 49 views
8

我需要在OS X的程序中創建一個「全屏疊加窗口」。準確地說,窗口必須始終位於所有其他窗口之上,包括在非最大化窗口空間的菜單欄頂部,並在他們自己的空間中最大化的窗口之上,並在Exposé期間排在最前面。它不得參與「變化空間」動畫;即其位置必須始終相對於物理屏幕固定。 (該窗口將是半透明的,將忽略鼠標事件,但我知道如何做到這一點。)如何製作出現在全屏窗口頂部的可可窗口?

如何實現此「覆蓋窗口」行爲?我有這麼遠:

  • 我應該設置window.levelCGWindowLevelKey(kCGMaximumWindowLevelKey)所以它總是在同一個空間中其他窗口的頂部。
  • 我應該設置NSWindowCollectionBehaviorStationary,以便在Exposé期間窗口保持原位。

我不知道如何在切換空格時保持這種行爲。我以爲我應該設置NSWindowCollectionBehaviorCanJoinAllSpaces,但它的行爲有兩個問題:

  • 該窗口不出現在其他全屏窗口之上。
  • 窗口是重複在每個空間,而不是停留在所有空間頂部的同一個地方。由於空間切換動畫,這很重要。

I have heard that an NSPanel would help me,但我還沒有能夠做到這一點。

總之,在OS X中,全屏窗口頂部是否會出現一個窗口?你能提供一個簡短的完整例子嗎?

+0

我不認爲你已經找到了答案呢?我還需要在另一個應用程序的全屏窗口上顯示一個窗口。 –

+0

@MarkBessey我確實使用'NSPanel'找到了一個解決方案。我會嘗試用一些示例代碼回答這個問題,當我有一個時刻 – jameshfisher

+0

@jameshfisher你能分享你的解決方案嗎?我有類似的問題,我已經嘗試了你在描述中提到的內容,但不幸的是它們不起作用。 –

回答

1

您應該使用window.level = CGWindowLevelForKey(.MaximumWindowLevelKey)

我幫不了你的空間部分。

+0

啊,是的,我已經這麼做了 - 抱歉不清楚。我編輯了我的問題。 – jameshfisher

0

這是我的解決方案,它工作正常。

NSPanel *test_panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(300, 300, 500, 500) styleMask:NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:YES]; 
[test_panel setReleasedWhenClosed:YES]; 
[test_panel setHidesOnDeactivate:NO]; 
[test_panel setFloatingPanel:YES]; 
[test_panel setStyleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask]; 
[test_panel setLevel:kCGMainMenuWindowLevel-1]; 
[test_panel setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces|NSWindowCollectionBehaviorFullScreenAuxiliary]; 
[test_panel setCanBeVisibleOnAllSpaces:YES]; 
[test_panel center]; 
[test_panel orderFront:nil];