C# Processo infantil de problemas de janela de aplicativos C ++ legados
-
20-09-2019 - |
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!
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);
}
}