2013-02-25 80 views
6

我需要顯示一個窗口(沒有標題欄)上方的第三方應用程序沒有我的窗口焦點。顯示窗口沒有激活(讓應用程序在它下面激活)

我曾嘗試使用NSPanel並設置啓用非激活,但沒有幫助。

我試過orderFront:self,但那也沒有幫助。

我總是需要添加[NSApp activateIgnoringOtherApps:YES];,因爲窗口不會顯示。

我這裏有一個示例項目只是這個功能:
http://users.telenet.be/prullen/TopW2.zip

UIElement是在應用程序的plist文件設置爲true,所以沒有碼頭。您可以同時按ALT + SPACE來激活窗口。你會看到它下面的應用程序失去了重點。有關如何解決這個問題的任何想法?我見過其他應用程序這樣做,所以我知道這是可能的。

編輯:這是迄今的代碼。請記住,該窗口是非激活的NSPanel。 我仍然需要最後的NSApp activateIgnoringOtherApps行或否則它不顯示。但當然,這使窗戶成爲活躍的窗口。

_windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"]; 

    [[_windowController window] setLevel:NSNormalWindowLevel+1]; 
    [[_windowController window] orderFrontRegardless]; 

    [_windowController showWindow:self]; 

    [NSApp activateIgnoringOtherApps:YES]; 

我也子類NSPanel並添加兩個方法:

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL)canBecomeMainWindow 
{ 
    return YES; 
} 

編輯:OK,取消選中setHidesOnDeactivate修復了這個,但現在的窗口將不會躲藏。我需要它隱藏,當用戶按下它下面的應用程序或切換到另一個應用程序。

編輯2:好了,這似乎解決上述問題:如果

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideWindow) name:NSWindowDidResignKeyNotification object:nil]; 
} 
- (void)hideWindow { 
    [self setHidesOnDeactivate:YES]; 
} 

不知道有更好的辦法。

而對於那些想知道如何顯示窗口:

[[_windowController window] setLevel:NSPopUpMenuWindowLevel]; 
    [[_windowController window] orderFrontRegardless]; 
    [[_windowController window] makeKeyWindow]; 

    [_windowController showWindow:self]; 

回答

3

無論這些人應該做的伎倆:

  • 使用-[NSWindow orderFrontRegardless]得到正常水平窗口前而不激活相應的應用程序,或者
  • 使用-[NSWindow setLevel:]可將窗口級別提高到高於NSNormalWindowLevel
+0

感謝,可惜這仍然無法正常工作。我仍然需要添加activateIgnoringOtherApps:true調用,否則它不顯示。那個電話當然會使它成爲活躍的窗口。 – Wesley 2013-02-26 07:28:30

+2

@Wesley取消選中NIB面板中的「取消激活時隱藏」。 – puzzle 2013-02-26 22:19:26

+2

謝謝,我爲什麼沒有想到這一點?這個選項,連同orderFrontRegardless和setLevel使它最終工作。謝謝! – Wesley 2013-02-27 07:39:12

1

不要從@ puzzle的有用答案中拿走,但它聽起來像是您的問題與使用NSPanel而不是NSWindow有關。

「如何專家組的工作」文件說:

  • 熒幕面板,除了警告對話框,從屏幕上消失時,該應用程序是不活動的恢復,當應用程序再次變得活躍。這減少了屏幕雜亂。
  • 具體而言,hindOnDeactivate方法的NSWindow實現返回NO,但同一方法的NSPanel實現返回YES。

那麼也許你可以重寫hidesOnDeactivate返回NO,或改變NSWindow

+0

我認爲問題出在NIB上,在那裏檢查hideOnDeactivate。 – puzzle 2013-02-26 22:20:06

+0

我沒有選擇隱藏在停用,但現在面板永遠不會隱藏。不是當我點擊它下面的應用程序,而不是當我切換到另一個應用程序。有任何想法嗎? – Wesley 2013-02-27 09:29:17