C# 레거시 C ++ 앱 윈도우 문제의 아동 프로세스
-
20-09-2019 - |
문제
우리는 C ++ 레거시 애플리케이션을 보유하고 있으며 부모 C ++ 앱에서 COM을 사용하여 호출되는 C# 애플릿으로 확장하고 있습니다. 그들은 모달이 아닌 창을 가져옵니다. 또한,이 .NET Windows는 C ++ 애플리케이션의 적절한 어린이가 아니라고 생각합니다. EnumchildWindows가 놓치고 Enumwindows가 찾을 수 있기 때문입니다. 그러나 부모 C ++ 앱을 닫으면 C# 창도 닫히게됩니다.
이 모든 것의 기본 문제는 사용자 가이 C# 애플릿 중 하나를 호출하면 부주의하게 부모 (C ++) 앱 창을 클릭하면 C# 창이 배경으로 떨어집니다. 사용자가 이것을 상단으로 다시 가져 오려면 작업 표시 줄에서 아이콘을 클릭 할 수 있어야합니다. 불행히도 이상한 이유로 작업 표시 줄 아이콘을 클릭해야합니다. 세 번! 처음에는 숨겨진 창을 맨 위로 가져와야하지만 그렇지 않습니다. 두 번째 클릭은 숨겨진 창을 최소화하고 세 번째는 성공적으로 복원합니다.
레거시를 연결할 때 다른 사람 이이 버그/기능을 실행합니까->. Net Divide? C# 애플릿의 작업 표시 줄 아이콘을 첫 번째 클릭 할 수 있는지 궁금합니다. 어떻게 든 상단으로 돌아가도록 강요합니다. :-)
나는 다음을 실험하고있다 :
[DllImport("User32.dll")]
private static extern int ShowWindow(IntPtr hwnd, IntPtr nCmdShow);
그러나 내가이 일을하게 되더라도 나는 여전히 그 첫 번째 mouseclick을 가로 채어야합니다. 당신의 도움을 주셔서 감사합니다!
해결책
C# Windows가 실제로 자식 창인 경우 작동할까요? 부모 HWND를 C# com 객체에 대한 인수로 전달한 다음 Pinvoke를 사용하여 세트 분당 C# Windows에서. (나는 이것을 한 적이 없지만 적어도 Showwindow와 Task Bar와의 싸움만큼 안전하게 들리나요?)
(하위 창문의 창문 플래그와 함께 바이올린이 필요할 수 있다는 SetParent의 Documetation의 주석에서 주석을 두십시오.)
(C# 창 유형에 따라 이미 사용할 수있는 핸들 속성이있을 수 있습니다. 그렇지 않으면 핀 보크 호출을 FindWindow로 핸들을 얻을 수 있습니다.)
다른 팁
// 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);
}
}