9

ウィンドウにフォーカスを当てずに、サード パーティ アプリケーションの上にウィンドウ (タイトル バーなし) を表示する必要があります。

NSPanel非アクティブ化を有効にする設定を使用してみましたが、役に立ちませんでした。

試してみorderFront:selfましたが、それも役に立ちませんでした。

[NSApp activateIgnoringOtherApps:YES];そうしないとウィンドウが表示されないため、常に追加する必要がありました。

この機能だけのサンプル プロジェクトがあります:
http://users.telenet.be/prullen/TopW2.zip

UIElementtrueアプリケーションの plist ファイルで に設定されているため、ドックはありません。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 をサブクラス化し、2 つのメソッドを追加しました。

- (BOOL)canBecomeKeyWindow
{
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

編集: OK、setHidesOnDeactivate のチェックを外すとこれは修正されますが、ウィンドウが非表示になることはありません。ユーザーがその下のアプリを押すか、別のアプリに切り替えると、非表示にする必要があります。

編集 2: OK、これで上記の問題は解決したようです:

- (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];
4

2 に答える 2

4

これらのいずれかがうまくいくはずです:

  • -[NSWindow orderFrontRegardless]対応するアプリをアクティブ化せずに、通常レベルのウィンドウを前面に表示するために使用する、または
  • -[NSWindow setLevel:]ウィンドウレベルをより高いレベルに上げるために使用しますNSNormalWindowLevel
于 2013-02-26T00:45:23.610 に答える
0

@puzzleの有用な答えを奪うわけではありませんが、あなたの問題は のNSPanel代わりにを使用することに関係しているようNSWindowです。

「パネルの仕組み」ドキュメントには次のように書かれています。

  • 警告ダイアログを除くオンスクリーン パネルは、アプリケーションがアクティブでないときに画面から削除され、アプリケーションが再びアクティブになると復元されます。これにより、画面の乱雑さが軽減されます。
  • 具体的には、hidesOnDeactivate メソッドの NSWindow 実装は NO を返しますが、同じメソッドの NSPanel 実装は YES を返します。

hidesOnDeactivateしたがって、おそらくオーバーライドして NO を返すか、次のように変更できます。NSWindow

于 2013-02-26T19:29:07.097 に答える