2009-12-16 8 views
0

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!

Répondre

1

Cela fonctionnerait-il si les fenêtres C# étaient en réalité des fenêtres enfants? Il peut être possible d'accomplir cela en passant le parent HWND en tant qu'argument à l'objet COM C#, puis en utilisant PInvoke pour appeler SetParent sur les fenêtres C#. (Je ne l'ai jamais fait, mais cela semble au moins aussi sûr que de se battre avec ShowWindow et la barre des tâches?)

(Notez les commentaires dans la documentation pour SetParent que vous pourriez aussi avoir besoin de jouer avec la fenêtre de l'enfant ? drapeaux de fenêtre)

(en fonction du type de fenêtre C#, il pourrait déjà avoir une propriété handle vous pouvez utiliser, sinon vous pourriez kludge un appel PInvoke à FindWindow pour obtenir sa poignée)

+0

que les sons. prometteur. Je voyage demain mais je vais essayer le week-end! –

+0

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! –

+0

// 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); } } –

0
// Here's the code... 
[DllImport("User32.dll")] 
    static extern int GetForegroundWindow(); 
    [DllImport("User32.dll")] 
    private static extern int SetParent(int hwndChild, int hwndParent); 


    public void ShowMyFormAsChildOf (int hwndParent) 
    { 
    MyForm form = new MyForm(); 
    form.Show(); // immediately after .Show(), it is the foreground window! 
    SetWindowParent(hwndParent); 
    } 

    private void SetWindowParent(int parenthwnd) 
    { 
    if (0 != parenthwnd) 
    { 
     int handle = GetForegroundWindow(); 
     SetParent(handle, parenthwnd); 
    } 
    } 
+0

IntPtr ne serait pas plus sûr? HWND est un type pointeur/handle, donc vous voudriez qu'il se développe sur des plates-formes 64 bits. – ChrisV