ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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);
    }
    

     

    댓글

Designed by Tistory.