2012-06-06 69 views
5

我有一個透明的NSWindow,它隨處可見用戶的屏幕(NSWindow停留在每個應用程序前面,不管是甚麼全屏應用程序)。
在那NSWindow我有一個mouseDown事件,顯示一個彈出。假設我在全屏模式下進行Safari瀏覽,並在其前面有我的窗口,我點擊Safari瀏覽器,然後再次點擊我的窗口:沒有任何反應,mouseDown不會發生。我必須再次點擊才能觸發mouseDown事件。
我如何強制我的NSWindow始終處於活動狀態,因此我不必點擊它2次即可觸發mouseDown當我點擊一個後臺應用程序並再次單擊我的窗口時?
謝謝!如何強制NSWindow始終保持主動/專注?

+0

能否請您闡述一下你的窗口的透明度:它不是完全透明的,是它? – Tim

+0

與圖像 –

回答

2

如果向窗口視圖添加無邊界NSButton實例並將圖像設置爲按鈕圖像(並將其作爲其替代圖像以使其更加美觀),那麼它可以開箱即用:只需連接按鈕的操作方法添加到您的應用程序委託(或您想要處理點擊操作的對象)。點擊圖像(即按鈕)將觸發按鈕的操作方法,無論哪個窗口處於活動狀態。

+0

謝謝!那只是我想要的方式!這麼簡單,我沒有注意到。 –

2

我不知道這是否是你想要的東西(它不是相當的窗口範圍的設置),但是,從documentation

默認情況下,在一個窗口中的鼠標按下事件不是關鍵窗口 只是把窗口向前並使其成爲關鍵;該事件不是 發送到發生鼠標點擊的對象NSViewNSView可以聲明一個初始的鼠標按下事件,但是,通過覆蓋 acceptsFirstMouse:返回YES

該方法的參數是發生在非鍵窗口,其中該視圖 對象可以檢查以確定其是否想要接收鼠標事件 和潛在的成爲第一響應的 鼠標按下事件。例如,您希望此方法的默認行爲爲 ,例如,影響窗口中所選對象的控件。

但是,在某些情況下,它適用於覆蓋此行爲,例如對於即使在窗口處於非活動狀態時也應接收mouseDown:消息的控件。 支持此點擊行爲的控件的示例是窗口的標題欄按鈕 。

或者你可以嘗試用

- (void)sendEvent:(NSEvent *)theEvent 

擺弄,看看你是否可以在自定義的方式處理事件。

+0

我做了文檔中的一些研究,但我無法找到任何工作完全透明:/ –

+0

你嘗試做-acceptsFirstMouse:回報是?這將使控件立即可用於您的窗口,即使它不是關鍵,這聽起來像你想要的。 – Vervious

+0

不行,不按我想要的方式工作。我希望窗口始終處於活動/關注的狀態。 –

-2

我覺得你真正應該做的是使用NSPanel(浮動面板 - 一種特殊的NSWindow的),將做的正是你的方式,與操作系統保持一致,而不是試圖對抗預期行爲想要什麼。

這裏的NSPanel文檔:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nspanel_Class/Reference/Reference.html

下面是一些有用而有力的信息:

http://cocoadev.com/wiki/NSPanel

默認情況下,NSPanel會當應用程序處於非活動狀態消失,但你可以關閉此功能。

我不更充分地鋪設出來道歉......時間緊迫。

編輯:

注意,你也許可以得到表現你的窗口根據需要簡單:

「的一個NSView可以申請初始鼠標按下事件,但是,通過覆蓋acceptsFirstMouse:返回YES。 「

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html

你需要任何的NSView子類來跳過「點擊激活」來做到這一點。

+0

它的行爲與nswindow類似。點擊背景窗口後,我必須觸摸它2次才能聚焦:/ –

+0

這是您必須覆蓋的默認行爲。如果您查看系統字符查看器(NSPanel),它會接受第一次點擊並保留在前面。請參閱文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html – podperson

1

這爲我工作,希望會有所幫助,這將始終保持你的窗口上方的所有應用程序

[self.window makeKeyAndOrderFront:nil]; 
[self.window setLevel:NSStatusWindowLevel];