본문 바로가기
개발언어/C#

[C#] user32.dll API 함수

by 창용이랑 2021. 12. 14.
728x90

프로젝트 준비중 user32.dll를 사용해야 할 필요가 생겼다, 그리고 준비하는 동안 사용했던 user32.dll api 함수들을 정리해본다.

using System.Runtime.InteropServices;

추가해주고, 시작하자 추가하는 이유는 dllimport를 하기위함이다.

 

 

 

윈도우 창 찾아주는 API

- Findwindow를 이용해 찾은 handle을 활용해서 하위 classname 을 검색하는 API 함수 이다.

부모 -> 자식 순서로 찾아야하며 자식 중에 찾지 못하는 경우도 있으니 이럴 땐 당황하지말고 우회 방법을 찾아보도록 하는게 낫다.

[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);

 

 

메세지

-흔히 사용하는 SendMessage, PostMessage도 있는데 차이점은 Message 처리 결과를 기다리냐 안기다리냐로 보면된다.

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

오버로딩으로 SendMessage 한개 더 선언 WM_SETTEXT 날리기 용도로 사용했다.

※ 여기사 잠깐 오버로딩이란? 그냥 말그대로 함수이름은 같지만 받는 인자값이 다른 것을 말한다.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);

 

 

handle을 가지는 윈도우를 젤앞으로 불러오는 용도

이건 handle을 가지는 윈도우를 젤앞으로 불러오는 용도로 사용함.

mouse_evevt 함수를 이용해서 입력 하기전에 땡겨주면 원하는 곳에 이벤트를 발생할 수 있다.

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

 

 

handle 이 가지고 있는 윈도우 영역을 표현 해준다(윈도우좌표를 가져온다)

-handle 이 가지고 있는 윈도우 영역을 표현 해준다 x, y, height, width 가 아닌 left, right, top, bottom 으로 나옴.

만약 left 가 100, right 가 200 이라면 x 가 100 width 가 100 이랑 같은 거로 보면된다 top bottom도 마찬가지 .

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}

 

 

마우스이벤트

-요놈 때문에 개고생했다. 어디서 줏어온 함수를 사용했는데 까먹고 try catch에 Exception 메세지를 출력을 안하게 해두고 이벤트만 날렸더니 왜 mouse move는 되는데 event가 안돼지 이러고 한참을 찾았다, 제길.. 브레이크포인트 한번 찍어볼껄 ㅠㅠ 일단 내가 퍼온 함수는 extern 함수 이름 부터가 틀렸었다(아마 뿌린사람이 일부로 그런듯 캐색..큉) 암튼 지금은 겁나 잘됨

[DllImport("user32.dll")]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, int dwExtraInfo);

 

 

마우스 무브

[DllImport("user32.dll")]
public static extern int SetCursorPos(int x, int y);

//윈도우 메세지 번호 
const int WM_SETTEXT = 0x000C;
//마우스 이벤트 번호 
const int MOUSEEVENT_LEFTDOWN = 0x0002;
const int MOUSEEVENT_LEFTUP   = 0x0004;

public void MouseLbuttonClick() 
{
	try
	{
		mouse_event(MOUSEEVENT_LEFTDOWN, 0, 0, 0, 0);
		mouse_event(MOUSEEVENT_LEFTUP  , 0, 0, 0, 0);
	}
	catch (Exception e)
	{
		MessageBox.Show("MouseLbuttonClick :" + e.Message);
	}
}


public void MousePosMove(int x, int y)
{
	try
	{
		SetCursorPos(x, y);
	}
	catch (Exception e)
	{
		MessageBox.Show("MousePosMove :" + e.Message);
	}
}

 

출처 : https://blog.naver.com/qoop11/221757865283