Domanda

Abbiamo un c ++ applicazione legacy e sono stati estendendolo con C # applet che vengono richiamati con COM dal ++ applicazione genitore c. Portano up che non sono modali. Inoltre, penso che queste finestre .NET non sono figli propri della applicazione C ++, dal momento che EnumChildWindows loro manca, e EnumWindows li trova. Un bambino di età simile comportamento rimane, tuttavia, nel senso che se si chiude il ++ applicazione genitore c, la finestra c # si chiuderà pure.

Il mio problema di base con tutto questo è che se l'utente richiama una di queste c # applet, quindi fa clic inavvertitamente il genitore (c ++) Finestra di applicazione, la finestra c # scende allo sfondo. Se l'utente vuole portare questo torna, essi dovrebbero essere in grado di basta cliccare sulla relativa icona nella barra delle applicazioni. Purtroppo, per qualche strano motivo, è spesso necessario fare clic sull'icona barra delle applicazioni tre volte ! La prima volta che dovrebbe portare una finestra nascosta verso l'alto, ma non è così. Il secondo clic minimizza la finestra nascosta, e la terza lo ripristina con successo.

Qualcun altro ha eseguito attraverso questo bug / funzione quando colmare l'eredità -.> Divide NET? Mi chiedo se posso intercettare il primo clic sulla barra delle applicazioni per la mia C # applet, e in qualche modo costringerlo ad artigliare la via del ritorno verso l'alto. :-)

Ho avuto modo di sperimentare con il seguente:

  [DllImport("User32.dll")]
  private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);

, ma anche se ottengo questo lavoro sarò ancora bisogno di intercettare quel primo click del mouse. Grazie per l'aiuto!

È stato utile?

Soluzione

dovrebbe funzionare se i C # Windows in realtà erano finestre figlio? Potrebbe essere possibile per realizzare questo facendo passare il genitore HWND come argomento per l'oggetto COM C #, e quindi utilizzando PInvoke chiamare SetParent sulle C # Windows. (Non ho mai fatto questo, ma sembra almeno altrettanto sicuro come combattere con ShowWindow e la barra delle applicazioni?)

(Nota i commenti nel documetation per SetParent che si potrebbe anche bisogno di giocherellare con le bandiere delle finestre della finestra secondaria?)

(a seconda del tipo # finestra di C, potrebbe già avere una proprietà Handle è possibile utilizzare,. Altrimenti si potrebbe kludge una chiamata PInvoke per FindWindow per ottenere il suo manico)

Altri suggerimenti

 // 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);
     }
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top