我有一个 Carbon LSUIElement 应用程序,它在后台运行(可能在菜单栏中带有一个图标,取决于首选项),偶尔需要向用户显示一个对话框 - 有时是为了响应用户事件,但有时是为了响应后台任务失败或类似情况。
(我使用的是 Qt 4.5,所以该应用程序是基于 Carbon 的;使用 Qt 4.6 的东西将基于 Cocoa,但听起来好像问题也可能存在在那里)。
问题是当我打开一个窗口并显示它时,它并没有被带到前面。我认为这是作为 LSUIElement 应用程序的人工制品。Qt 使用 Carbon 中的 SelectWindow 和 Cocoa 中的 [makeKeyAndOrderFront] 来将窗口(和应用程序)置于最前面。
为了解决这个问题,我尝试直接访问窗口服务器:(前几个步骤是获取 WindowID,使用 Qt-Cocoa 会更简单,因为我可以使用 NSWindow:nativeWindow)
WindowRef ref = HIViewGetWindow((HIViewRef) aWidget->winId());
CGSWindow wid = GetNativeWindowFromWindowRef(ref);
CGSConnection cid =_CGSDefaultConnection();
CGSOrderWindow(cid, wid, 1 /* above everything */, 0 /* NULL */);
这有点工作 - 窗口出现在前面,但它没有突出显示或键盘聚焦。是否有额外的步骤来解决这些问题,或者是否有更简单的解决方案来解决整个问题?