Class name of Windows Form?




 Win32API 를 이용한 윈도우 프로그래밍에서 응용프로그램 실행 과정을 보면 처음 windows 클래스를 생성하고 등록하여 실행시키는 과정을 거치게 된다. 이때 windows 클래스 이름을 사용자가 임의로 설정하게 되며 외부 프로그램에서 해당 응용프로그램을 찾을 때 FindWindow() 함수에 해당 클래스 이름을 지정하여 찾게 된다.

 작업 하려 했던 내용은 다음과 같다.


MFC 응용프로그램에서 FindeWindow 로 C# 응용프로그램의 핸들을 얻는다. 이때 FindWindow 함수의 인수로 윈도우의 캡션 이름이 아닌 클래스 이름으로 찾으려 한다. (윈도우 캡션 이름으로 윈도우를 찾는 것은 성공! but, 이 방법은 보안에 너무 취약하다.) 윈도우 핸들을 얻었다면 해당 핸들값을 이용하여 SendMessage() 로 윈도우 메시지를 전송한다.



WindowsForm 의 Class Name

C# 응용프로그램 즉, WinForm 의 클래스 이름은 어떻게 구할까??
우선 Spy++ 를 이용하여 WinForm 의 클래스 이름을 찾아보니 다음과 같았다.



클래스 이름이 참 길다... 그리고 나는 WinForm 프로그램을 만들 때 클래스 이름을 지정해 준 적도 없다. 즉, 자동으로 만들어 주는 것 같다. 우선 위에서 구한 클래스 이름으로 FindWindow() 함수 호출 시 WinForm 프로그램의 핸들을 얻어올 수 있다.

Win32 API 함수 GetClassName 을 사용하여 WinForm 프로그램의 윈도우 클래스 이름을 구해 보았다.
public partial class Form1 : Form
    {
        [DllImport("user32.dll", SetLastError=true)]
        public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                StringBuilder className = new StringBuilder(255);
                GetClassName(this.Handle, className, 255);
                MessageBox.Show("Window Class Name : " + className.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }           
        }
    }

user32.dll 을 import 하여 GetClassName 함수를 호출하였다.
WinForm  자신의 핸들은 Handle 프로퍼티로 구할 수 있다.
아래와 같이 윈도우 클래스 이름을 구할 수 있다.






Class Name 의 동적 생성

아쉽게도 WinForm 의 윈도우 클래스 이름은 동적으로 생성된다. 따라서 위에서와 찾은 클래스 이름은 항상 유효하지 않게 된다.
따라서 FindWindow 로 구한 윈도우 핸들을 이용하여 통신하는 것은 추천되지 않는 방법이다. Inter Process  Communication 방법으로 .NET Remoting, Named Pipe, Socket 을 이용하는게 더 효율적이다.



System.Windows.Forms.CreateParams

자료를 찾다 보니 WinForm 의 클래스 이름은 CreateParams 의 ClassName 프로퍼티로 얻을 수 있다. 이 프로퍼티 값을 변경해서 클래스 이름을 고정시킬 수 있나 코딩해 보았더니 Win32Exception 예외가 발생한다.







결론

WinForm 의 윈도우 클래스 이름으로 FindWindow 함수를 사용하여 핸들을 얻을 수 있지만 휘발성 데이터 이다.
다른 IPC 방법을 이용하는게 효율적이다.

잘못된 내용이나 참고 자료가 있으면 댓글 남겨 주세요 :)



참조 URL

Posted by six605
,