2008-10-23 4 views
0

Je fais la fenêtre d'une autre application pour s'assurer qu'un clic dans mon application amène le dialogue de l'autre dans les vues. Le problème que j'ai est que je ne me concentre pas sur mon application après l'appel. Si l'autre application a plus de fenêtres, l'une d'entre elles finit par avoir le focus, et sinon aucune fenêtre (en regardant uniquement la barre des tâches) n'est mise au point. Où dois-je commencer à enquêter sur le problème?focus perdu après avoir fait la fenêtre d'une autre application topmost

Mon code pour faire l'autre de l'application est le plus élevé:

Process p = Process.GetProcessById(trackedProcessID); 
IntPtr h = p.MainWindowHandle; 
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS; 
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 

avec des constantes

public static readonly uint SWP_NOMOVE = 0x0002; 
public static readonly uint SWP_NOSIZE = 0x0001; 
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000; 
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 

Répondre

2

connexes: Unexpected behaviour of Process.MainWindowHandle

Fondamentalement MainWindowHandle vous donne la plus haute fenêtre actuelle de la processus malgré ce que la documentation dit. Cela explique pourquoi la fenêtre principale de votre autre processus n'est pas nécessairement mise au point.

Votre autre problème est que vous ne revenez pas à votre application après l'avoir donnée.

En fait, le terme correct pour ce que vous faites est z-order. Au lieu d'essayer de contrôler l'ordre z - ce qui ne peut pas être garanti - il vaut mieux envoyer des messages à l'autre processus.

+0

Très intéressant! Mais même si ma deuxième application ne dispose que d'une fenêtre visible (encore une fois, depuis la barre des tâches qui pourrait ne pas être une bonne source), je m'attendais à ce que la boîte de dialogue dans l'autre application mette le focus. Ou? – Oskar

+0

Non, pas nécessairement, vous auriez besoin de retourner focus (en fait le terme ici est correctement z-order) à votre application. –

+0

Pourrais-je faire cela en alignant l'autre application juste devant moi dans l'ordre Z, ou dois-je obtenir l'autre application pour me pousser vers le haut (s'il vous plaît dites-moi que je peux ...) – Oskar

2

Avez-vous essayé SWP_NOACTIVATE?

+0

Ne semble pas avoir un effet, que voulez-vous qu'il fasse? – Oskar

+0

Je m'attendrais à ce qu'il n'active pas l'autre fenêtre de niveau supérieur. Sans activation, il ne sera pas mis au point. –

0

[solution réelle utilisée]

Jusqu'à présent, je vais avec l'envoi de la poignée de fenêtre de la fenêtre appelant à l'application cible, et de le faire pour le pousser en arrière sur le dessus lorsque vous avez terminé. C'est une vraie douleur car j'aurai environ 50 fenêtres à gérer, mais ça semble stable. La prochaine approche, si cela s'avère être un problème, sera de rappeler l'application qui appelle et de lui demander de pousser la fenêtre au premier plan, mais je préférerais ne pas le faire car cela introduit une possibilité que l'utilisateur puisse faire quelque chose. l'application appelante pendant que le message est en transit (seulement un problème s'il y a beaucoup de messages arrivant sur le même protocole de transport, ce qui pourrait arriver)

N'essayez pas d'utiliser la poignée de fenêtre entrante et réglez le parent d'une fenêtre montré dans l'application cible à cette poignée, il ne fait que la montre de dialogue apparaître dans les limites de la fenêtre de l'application d'appel et recadrée si nécessaire - inutile

Un grand merci pour les réponses ci-dessus à la question

Questions connexes