碳,LSUIElement,并显示一个窗口

时间:2009-10-20 08:47:46

标签: qt macos-carbon

我有一个Carbon LSUIElement应用程序,它在后台运行(可能在菜单栏中有一个图标,取决于一个pref),偶尔需要向用户显示一个对话框 - 有时是为了响应用户事件,但有时候响应后台任务失败或类似。

(我正在使用Qt 4.5,所以应用程序是基于碳的;使用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 */);

这样做有点 - 窗口出现在前面,但它没有突出显示或键盘聚焦。是否有其他步骤来解决这些问题,或者是否有一个更简单的解决方案来处理整个问题?

2 个答案:

答案 0 :(得分:1)

使用SetFrontProcessWithOptions将您的窗口置于其他应用程序之前。

答案 1 :(得分:0)

尝试:

[NSApp activateIgnoringOtherApps: YES]