2009-10-20 3 views
1

J'ai une application Carbon LSUIElement, qui fonctionne en arrière-plan (éventuellement avec une icône dans la barre de menus, en fonction d'un préfixe) et doit parfois montrer un dialogue à l'utilisateur - parfois dans réponse à un événement utilisateur, mais parfois en réponse à une tâche d'arrière-plan échouant ou similaire.Carbone, LSUIElement, et montrant une fenêtre

(j'utilise Qt 4.5, donc l'application est basée sur le carbone, avec Qt 4.6 les choses seront basées sur le cacao, mais il semble que le problème existe aussi).

Le problème est que lorsque j'ouvre une fenêtre et que je l'affiche, elle n'est pas portée vers l'avant. Je suppose que c'est un artefact d'être une application LSUIElement. Qt utilise SelectWindow dans Carbon, et [makeKeyAndOrderFront] dans Cocoa, pour amener une fenêtre (et l'application) à l'avant.

Pour contourner le problème, j'ai essayé d'aller directement au serveur de fenêtre: (les premières étapes consistent à obtenir le WindowID, ce sera plus simple avec Qt-cacao, depuis que je peux utiliser NSWindow: nativeWindow)

WindowRef ref = HIViewGetWindow((HIViewRef) aWidget->winId()); 
CGSWindow wid = GetNativeWindowFromWindowRef(ref); 
CGSConnection cid =_CGSDefaultConnection(); 
CGSOrderWindow(cid, wid, 1 /* above everything */, 0 /* NULL */); 

Cela fonctionne, en quelque sorte - la fenêtre vient à l'avant, mais elle n'est pas mise en surbrillance ou mise au point sur le clavier. Existe-t-il des étapes supplémentaires pour résoudre ces problèmes ou existe-t-il une solution plus simple à l'ensemble du problème?

Répondre

1

Utilisez SetFrontProcessWithOptions pour placer votre fenêtre devant d'autres applications.

0

Essayez:

[NSApp activateIgnoringOtherApps: YES] 
Questions connexes