-
[C#] - WinForm 특정 윈도우 Show, TopMost 처리.NET/CSharp 2019. 10. 7. 18:02
웹 브라우저에서 웹 소켓을 통하여 특정 프로그램을 실행하는 프로그램을 개발 중에 있다. 해당 프로그램은 프로그램을 실행 후에는 실행된 프로세스와 소켓 통신(TCP/IP)을 통하여 데이터를 주고받고 프로세스에서 데이터를 받으면 웹 소켓을 통하여 데이터를 웹 브라우저 쪽으로 내려주는 구조로 되어있다. 또 프로세스가 하나 이상 실행이 되지 않는 구조로 되어 있다. 그러다 보니 실행되어 있는 상태에서 다시 실행 요청을 하였을 때 해당 프로세스의 메인 윈도우가 축소되어 있거나 다른 윈도우에 가려져 있을 때 처리가 필요하였다.
다행히 User32.dll IsIconic 함수를 통하여 프로세스의 메인 핸들을 넘겨 해당 프로세스 메인 핸들의 창이
최소화 여부를 알 수 있었다.
프로세스의 메인 윈도우가 최소화 되어 있을 경우
최소화 되어 있을 경우 User32.dll ShowWindow 함수를 통하여 창을 뛰운다.
프로세스의 메인 윈도우가 다른창에 가려졌을 경우
보통 WinForm 에서는 Shown 이벤트에서는
TopMost = true;
처리....
TopMost = false;
처리를 하고 있었다.
Shown 이벤트에서 했던 처리를 비슷하게 처리해야만 한다.
다른 창에 가려져 있을 경우 Shown 이벤트에서 처리하는 방식과
비슷하게 TopMost=true;, 처리..., TopMost=false; 처리가 필요하였고 User32.SetWindowPos 함수를 통하여 TopMost 처리를 할수 있었다.
IntPtr handle = _process.MainWindowHandle; if (User32.IsIconic(handle)) { User32.ShowWindow(handle, User32.SW_SHOWNORMAL); } else { Rectangle rect = Rectangle.Empty; User32.SetWindowPos(handle, User32.HWND_TOPMOST, rect.X, rect.Y, rect.Width, rect.Height, User32.SWP_NOMOVE | User32.SWP_NOSIZE | User32.SWP_SHOWWINDOW); Thread.Sleep(100); User32.SetWindowPos(handle, User32.HWND_NOTOPMOST, rect.X, rect.Y, rect.Width, rect.Height, User32.SWP_NOMOVE | User32.SWP_NOSIZE | User32.SWP_SHOWWINDOW); }
'.NET > CSharp' 카테고리의 다른 글
[C#] - Settings.Default.Save() 시 user.config 저장 위치 (0) 2020.11.02 [C#] - .NET Framework 3.5 TLS 1.2 적용하기 (0) 2020.06.15 [C#] - Working Directory (0) 2019.04.16 [C#] - WinForm PropertyGrid 에 표시되는 Enum 값 이름 변경하기 (0) 2018.12.25 [C#] - WinForm Form Esc 키 눌렀을때 종료하기 (0) 2018.09.13