즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2021.04] C#에서 WIN32 API를 이용한 객체로 폼 이동방법

다물칸 2021. 4. 6. 15:59
728x90
반응형

제목 만들기 참 까다롭고 설명하기 난해할 것 같은데, 예를 들어 설명해보겠습니다. 

 

폼의 Borderstyle을 None으로 해서 툴박스나 X박스 없이 이미지를 백그라운드로 입혀서 이쁘게 만들려고 하면, 어? 툴박스가 사라져서 폼을 이동할 수 있는 방법이 사라집니다. 

 

이런 어플리케이션 보면 거의 움직이는 것을 본적이 없는 것 같네요. 

그런데 난 움직이게 하고 싶다. 하면 이 글을 잘 찾아오신 겁니다. 

 

단, 윈도우32 API를 이용할 것이기 때문에 윈도우에서만 됩니다. 

아래 예제는 폼 자체에 이벤트를 후킹할 것이기 때문에 폼의 영역 아무곳을 클릭해서 잡아 끌면 폼 자체가 이동됩니다. 

 

옛날 윈도우 개발하시던 분들 SendMessage, ReleaseCapture 많이 보셨을 겁니다. 이것을 이용합니다.

const int WM_SYSCOMMAND = 0x0112;
const int SC_FORMMOVE = 0xF012;
 
[System.Runtime.InteropServices.DllImport("User32")]
private static extern int ReleaseCapture();
[System.Runtime.InteropServices.DllImport("User32")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

private void frmLogin_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_FORMMOVE, 0);
    }
}
 
private void frmLogin_MouseUp(object sender, MouseEventArgs e)
{
    ReleaseCapture();
}

지금 확인해보니 MouseUp 이벤트는 발생하지 않는 것 같긴합니다. 

 

P.S. 태그 따기 어려운 글이네요. T_T

반응형