Nous avons une application héritée C++ et l'étendons avec des applets C# qui sont appelés à l'aide de COM à partir de l'application parent C++. Ils font apparaître des fenêtres qui ne sont pas modales. De plus, je pense que ces fenêtres .NET ne sont pas des enfants propres de l'application C++, puisqu'EnumChildWindows leur manque, et EnumWindows les trouve. Cependant, un comportement similaire à celui d'un enfant subsiste: si vous fermez l'application parent C++, la fenêtre C# se ferme également. Mon problème de base avec tout cela est que si l'utilisateur invoque l'une de ces applets C#, puis clique par inadvertance sur la fenêtre de l'application parent (C++), la fenêtre C# passe à l'arrière-plan. Si l'utilisateur veut ramener cela au sommet, il devrait pouvoir cliquer sur son icône dans la barre des tâches. Malheureusement, pour une raison étrange, il est souvent nécessaire de cliquer sur l'icône TaskBar trois fois! La première fois devrait apporter une fenêtre cachée au sommet, mais ce n'est pas le cas. Le deuxième clic minimise la fenêtre cachée, et le troisième le restaure avec succès.Processus enfant C# à partir des problèmes de fenêtrage de l'application C++ héritée
Est-ce que quelqu'un d'autre a rencontré ce bug/cette fonctionnalité lors du pontage de l'héritage ->. NET divide? Je me demande si je peux intercepter le premier clic sur l'icône de la barre des tâches pour mon applet C#, et le forcer en quelque sorte à revenir en haut. :-)
Je l'ai expérimenté avec les éléments suivants:
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
mais même si je reçois ce travail, je vais quand même besoin d'intercepter cette première mouseclick. Merci de votre aide!
que les sons. prometteur. Je voyage demain mais je vais essayer le week-end! –
J'ai donc essayé ceci et cela transforme la fenêtre C# en un enfant de la fenêtre C++ héritée. Il se trouve maintenant dans la zone de la fenêtre du parent affecté et ne peut plus être réduit à la barre des tâches. Très probablement, je vais maintenant devoir le gérer au sein de l'application C++. Merci pour la suggestion! –
// code ... [DllImport ("User32.dll")] static extern int GetForegroundWindow(); [DllImport ("User32.dll")] private static externe int SetParent (int hwndChild, int hwndParent); Public vide ShowMyFormAsChildOf (int hwndParent) { MyForm form = new MyForm(); form.Show(); // appelle immédiatement ... \t SetWindowParent (hwndParent); } private void SetWindowParent (int parenthwnd) { si (0!= parenthwnd) { int handle = GetForegroundWindow(); SetParent (handle, parenthwnd); } } –