Pergunta

Temos um aplicativo C ++ Legacy e o estendemos com os applets C# que são invocados usando COM do aplicativo pai C ++. Eles trazem janelas que não são modais. Além disso, acho que essas janelas .NET não são filhos adequados do aplicativo C ++, já que o EnumChildWindows sente falta delas e Enumwindows as encontra. Um comportamento infantil permanece, no entanto, no entanto, se você fechar o aplicativo pai C ++, a janela C# também será fechada.

Meu problema básico com tudo isso é que, se o usuário invocar um desses applets C#, clique inadvertidamente na janela do aplicativo pai (C ++), a janela C# cai para o plano de fundo. Se o usuário quiser trazer isso de volta ao topo, ele poderá apenas clicar em seu ícone na barra de tarefas. Infelizmente, por algum motivo estranho, geralmente é necessário clicar no ícone da barra de tarefas três vezes! A primeira vez deve trazer uma janela escondida para o topo, mas não. O segundo clique minimiza a janela oculta e o terceiro restaura com sucesso.

Alguém mais se depara com esse bug/recurso ao preencher o legado->. Net Divide? Gostaria de saber se posso interceptar o primeiro clique no ícone da barra de tarefas para o meu applet C# e, de alguma forma, forçá -lo a recuperar o caminho de volta ao topo. :-)

Eu tenho experimentado o seguinte:

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

Mas mesmo se eu conseguir isso, ainda precisarei interceptar esse primeiro mouseclick. Obrigado pela ajuda!

Foi útil?

Solução

Funcionaria se o Windows C# fosse realmente janelas para crianças? Pode ser possível realizar isso ao passar aos pais como um argumento para o objeto C# com, e depois usando Pinvoke para chamar Setparent no Windows C#. (Eu nunca fiz isso, mas parece pelo menos tão seguro quanto lutar com o showwindow e a barra de tarefas?)

(Observe os comentários na documentação para o SetParent que você também pode precisar mexer com as bandeiras da janela da criança?)

(Dependendo do tipo de janela C#, ele já pode ter uma propriedade de manipulação que você pode usar; caso contrário, você pode kludge uma chamada de pinvoke para findwindow para obter seu identificador.)

Outras dicas

 // 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);
     }
  }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top