Углерод, LSUIElement и отображение окна

У меня есть приложение Carbon LSUIElement, которое работает в фоновом режиме (возможно, со значком в строке меню, в зависимости от предпочтения) и иногда ему требуется отображать диалог для пользователя - иногда в ответ на пользовательское событие, но иногда в ответ на сбой фоновой задачи или подобное.

(Я использую Qt 4.5, поэтому приложение основано на углероде; с Qt 4.6 все будет на основе какао, но похоже, что проблема может существовать и там).

Проблема в том, что когда я открываю окно и показываю его, оно не выводится на передний план. Я предполагаю, что это артефакт приложения LSUIElement. Qt использует SelectWindow в Carbon и [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 */);

Это вроде как работает - окно выходит на передний план, но не выделяется и не фокусируется на клавиатуре. Есть ли дополнительные шаги для решения этих проблем или есть более простое решение всей проблемы?


person James Turner    schedule 20.10.2009    source источник


Ответы (2)


Используйте SetFrontProcessWithOptions, чтобы вывести ваше окно перед другими приложениями.

person JWWalker    schedule 28.05.2010

Пытаться:

[NSApp activateIgnoringOtherApps: YES]
person moala    schedule 03.08.2011