■ GetSystemMetrics API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System.Runtime.InteropServices; using System.Runtime.Versioning; #region 시스템 구성 설정 구하기 - GetSystemMetrics(index) /// <summary> /// 시스템 구성 설정 구하기 /// </summary> /// <param name="index">인덱스</param> /// <returns>시스템 구성 설정</returns> [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Auto)] [ResourceExposure(ResourceScope.None)] private static extern int GetSystemMetrics(int index); #endregion |
■ MonitorFromWindow API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System.Runtime.InteropServices; using System.Runtime.Versioning; #region 윈도우에서 모니터 핸들 구하기 - MonitorFromWindow(windowHandleRef, flag) /// <summary> /// 윈도우에서 모니터 핸들 구하기 /// </summary> /// <param name="windowHandleRef">윈도우 핸들 참조</param> /// <param name="flag">플래그</param> /// <returns>윈도우 핸들</returns> [DllImport("user32", ExactSpelling = true)] [ResourceExposure(ResourceScope.None)] private static extern IntPtr MonitorFromWindow(HandleRef windowHandleRef, int flag); #endregion |
■ GetCursorPos API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
using System.Runtime.InteropServices; using System.Runtime.Versioning; #region 커서 위치 구하기 - GetCursorPos(point) /// <summary> /// 커서 위치 구하기 /// </summary> /// <param name="point">포인트</param> /// <returns>처리 결과</returns> [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Auto)] [ResourceExposure(ResourceScope.None)] private static extern bool GetCursorPos([In, Out] POINT point); #endregion /// <summary> /// 포인트 /// </summary> public struct POINT { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// X 좌표 /// </summary> public int X; /// <summary> /// Y 좌표 /// </summary> public int Y; #endregion } |
■ EnumDisplayMonitors API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; #region 디스플레이 모니터 열거하기 - EnumDisplayMonitors(deviceContextHandle, clippingRectangleHandle, monitorEnumProc, dataHandle) /// <summary> /// 디스플레이 모니터 열거하기 /// </summary> /// <param name="deviceContextHandle">디바이스 컨텍스 핸들</param> /// <param name="clippingRectangleHandle">클리핑 사각형 핸들</param> /// <param name="monitorEnumProc">모니터 열거 프로시저</param> /// <param name="dataHandle">데이터 핸들</param> /// <returns>처리 결과</returns> [DllImport("user32", ExactSpelling = true)] [ResourceExposure(ResourceScope.None)] private static extern bool EnumDisplayMonitors ( HandleRef deviceContextHandle, IntPtr clippingRectangleHandle, MonitorEnumProc monitorEnumProc, IntPtr dataHandle ); #endregion #region 모니터 열거 프로시저 대리자 - MonitorEnumProc(monitorHandle, deviceContextHandle, monitorRectangleHandle, dataHandle) /// <summary> /// 모니터 열거 프로시저 대리자 /// </summary> /// <param name="monitorHandle">모니터 핸들</param> /// <param name="deviceContextHandle">디바이스 컨텍스트 핸들</param> /// <param name="monitorRectangleHandle">모니터 사각형 핸들</param> /// <param name="dataHandle">데이터 핸들</param> /// <returns>처리 결과</returns> private delegate bool MonitorEnumProc(IntPtr monitorHandle, IntPtr deviceContextHandle, IntPtr monitorRectangleHandle, IntPtr dataHandle); #endregion |
■ GetMonitorInfo API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
using System.Runtime.InteropServices; using System.Runtime.Versioning; #region 모니터 정보 구하기 - GetMonitorInfo(monitorHandleRef, monitorInfo) /// <summary> /// 모니터 정보 구하기 /// </summary> /// <param name="monitorHandleRef">모니터 참조 핸들</param> /// <param name="monitorInfo">모니터 정보</param> /// <returns>처리 결과</returns> [DllImport("user32", CharSet = CharSet.Auto)] [ResourceExposure(ResourceScope.None)] private static extern bool GetMonitorInfo(HandleRef monitorHandleRef, [In, Out]MONITOR_INFORMATION monitorInfo); #endregion /// <summary> /// 사각형 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct RECTANGLE { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 왼쪽 /// </summary> public int Left; /// <summary> /// 위쪽 /// </summary> public int Top; /// <summary> /// 오른쪽 /// </summary> public int Right; /// <summary> /// 아래쪽 /// </summary> public int Bottom; #endregion } /// <summary> /// 모니터 정보 /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)] public class MONITOR_INFORMATION { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 크기 /// </summary> public int Size = Marshal.SizeOf(typeof(MONITOR_INFORMATION)); /// <summary> /// 디스플레이 사각형 /// </summary> public RECTANGLE DisplayRectangle = new RECTANGLE(); /// <summary> /// 작업 영역 사각형 /// </summary> public RECTANGLE WorkingAreaRectangle = new RECTANGLE(); /// <summary> /// 플래그 /// </summary> public int Flag = 0; /// <summary> /// 장치명 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] DeviceName = new char[32]; #endregion } |
■ GetMonitorInfo API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
using System; using System.Runtime.InteropServices; #region 모니터 정보 구하기 - GetMonitorInfo(monitorHandle, monitorInfo) /// <summary> /// 모니터 정보 구하기 /// </summary> /// <param name="monitorHandle">모니터 핸들</param> /// <param name="monitorInfo">모니터 정보</param> /// <returns>처리 결과</returns> [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool GetMonitorInfo(IntPtr monitorHandle, ref MONITOR_INFO_EX monitorInfo); #endregion /// <summary> /// 사각형 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct RECTANGLE { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 왼쪽 /// </summary> public int Left; /// <summary> /// 위쪽 /// </summary> public int Top; /// <summary> /// 오른쪽 /// </summary> public int Right; /// <summary> /// 아래쪽 /// </summary> public int Bottom; #endregion } /// <summary> /// 모니터 정보 확장 /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)] public struct MONITOR_INFO_EX { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 크기 /// </summary> public uint Size; /// <summary> /// 디스플레이 사각형 /// </summary> public RECTANGLE DisplayRectangle; /// <summary> /// 작업 영역 사각형 /// </summary> public RECTANGLE WorkingAreaRectangle; /// <summary> /// 플래그 /// </summary> public uint Flag; /// <summary> /// 장치명 /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] DeviceName; #endregion } |
■ MonitorFromPoint API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System; using System.Drawing; using System.Runtime.InteropServices; #region 포인트에서 모니터 구하기 - MonitorFromPoint(point, flag) /// <summary> /// 포인트에서 모니터 구하기 /// </summary> /// <param name="point">포인트</param> /// <param name="flag">플래그</param> /// <returns>모니터 핸들</returns> [DllImport("user32", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern IntPtr MonitorFromPoint(Point point, uint flag); #endregion |
■ SetWindowPos API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
using System; using System.Runtime.InteropServices; #region 윈도우 위치 설정하기 - SetWindowPos(windowHandle, windowHandleInsertAfter, x, y, width, height, flag) /// <summary> /// 윈도우 위치 설정하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="windowHandleInsertAfter">삽입 이후 윈도우 핸들</param> /// <param name="x">X</param> /// <param name="y">Y</param> /// <param name="width">너비</param> /// <param name="height">높이</param> /// <param name="flag">플래그</param> /// <returns>처리 결과</returns> [DllImport("user32")] private static extern bool SetWindowPos ( IntPtr windowHandle, IntPtr windowHandleInsertAfter, int x, int y, int width, int height, uint flag ); #endregion |
■ AttachThreadInput API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System.Runtime.InteropServices; #region 스레드 입력 연결하기 - AttachThreadInput(sourceThreadID, targetThreadID, attach) /// <summary> /// 스레드 입력 연결하기 /// </summary> /// <param name="sourceThreadID">소스 스레드 ID</param> /// <param name="targetThreadID">타겟 스레드 ID</param> /// <param name="attach">연결 여부</param> /// <returns>처리 결과</returns> [DllImport("user32")] private static extern bool AttachThreadInput(uint sourceThreadID, uint targetThreadID, bool attach); #endregion |
■ GetForegroundWindow API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Runtime.InteropServices; #region 전경 윈도우 구하기 - GetForegroundWindow() /// <summary> /// 전경 윈도우 구하기 /// </summary> /// <returns>윈도우 핸들</returns> [DllImport("user32")] private static extern IntPtr GetForegroundWindow(); #endregion |
■ GetWindowThreadProcessId API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System; using System.Runtime.InteropServices; #region 윈도우 스레드 프로세스 ID 구하기 - GetWindowThreadProcessId(windowHandle, processID) /// <summary> /// 윈도우 스레드 프로세스 ID 구하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="processID">프로세스 ID</param> /// <returns>스레드 ID</returns> [DllImport("user32")] private static extern uint GetWindowThreadProcessId(IntPtr windowHandle, out IntPtr processID); #endregion |
■ ShowCursor API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 커서 표시하기 - ShowCursor(show) /// <summary> /// 커서 표시하기 /// </summary> /// <param name="show">표시 여부</param> /// <returns>디스플레이 카운트</returns> [DllImport("user32")] private static extern int ShowCursor(bool show); #endregion |
■ BlockInput API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 입력 방지하기 - BlockInput(blocking) /// <summary> /// 입력 방지하기 /// </summary> /// <param name="blocking">입력 방지 여부</param> /// <returns>처리 결과</returns> [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern bool BlockInput([In, MarshalAs(UnmanagedType.Bool)]bool blocking); #endregion |
■ ShowWindow API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
using System.Runtime.InteropServices; #region 윈도우 표시하기 - ShowWindow(windowHandle, command) /// <summary> /// 윈도우 표시하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="command">명령</param> /// <returns>처리 결과</returns> [DllImport("user32")] private static extern int ShowWindow(int windowHandle, int command); #endregion /// <summary> /// SW_HIDE /// </summary> private const int SW_HIDE = 0; /// <summary> /// SW_SHOW /// </summary> private const int SW_SHOW = 1; |
■ FindWindow API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 윈도우 찾기 - FindWindow(className, windowText) /// <summary> /// 윈도우 찾기 /// </summary> /// <param name="className">클래스명</param> /// <param name="windowText">윈도우 텍스트</param> /// <returns>윈도우 핸들</returns> [DllImport("user32")] private static extern int FindWindow(string className, string windowText); #endregion |
■ SetCursorPos API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 커서 위치 설정하기 - SetCursorPos(x, y) /// <summary> /// 커서 위치 설정하기 /// </summary> /// <param name="x">X 좌표</param> /// <param name="y">Y 좌표</param> /// <returns>처리 결과</returns> [DllImport("user32")] private static extern bool SetCursorPos(int x, int y); #endregion |
■ ExitWindowsEx API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 윈도우 종료하기 - ExitWindowsEx(flag, reserved) /// <summary> /// 윈도우 종료하기 /// </summary> /// <param name="flag">플래그</param> /// <param name="reserved">예약</param> /// <returns>처리 결과</returns> [DllImport("user32", ExactSpelling=true, SetLastError=true) ] private static extern bool ExitWindowsEx(int flag, int reserved); #endregion |
■ LookupPrivilegeValue API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System.Runtime.InteropServices; #region 특권 값 조사하기 - LookupPrivilegeValue(hostName, name, luid) /// <summary> /// 특권 값 조사하기 /// </summary> /// <param name="hostName">호스트명</param> /// <param name="name">명칭</param> /// <param name="luid">LUID</param> /// <returns>처리 결과</returns> [DllImport("advapi32", SetLastError=true) ] private static extern bool LookupPrivilegeValue(string hostName, string name, ref long luid); #endregion |
■ AdjustTokenPrivileges API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
using System; using System.Runtime.InteropServices; #region 토큰 특권 조정하기 - AdjustTokenPrivileges(tokenHandle, disableAllPrivileges, newState, bufferLength, previousState, returnLength) /// <summary> /// 토큰 특권 조정하기 /// </summary> /// <param name="tokenHandle">토큰 핸들</param> /// <param name="disableAllPrivileges">모든 특권 비활성화 여부</param> /// <param name="newState">새로운 상태</param> /// <param name="bufferLength">버퍼 길이</param> /// <param name="previousState">이전 상태</param> /// <param name="returnLength">반환 길이</param> /// <returns>처리 결과</returns> [DllImport("advapi32", ExactSpelling = true, SetLastError = true)] private static extern bool AdjustTokenPrivileges ( IntPtr tokenHandle, bool disableAllPrivileges, ref TOKEN_PRIVILEGES newState, int bufferLength, IntPtr previousState, IntPtr returnLength ); #endregion #region 토큰 특권 - TOKEN_PRIVILEGES /// <summary> /// 토큰 특권 /// </summary> [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct TOKEN_PRIVILEGES { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 특권 카운트 /// </summary> public int PrivilegeCount; /// <summary> /// LUID /// </summary> public long LUID; /// <summary> /// 속성 /// </summary> public int Attributes; #endregion } #endregion |
■ OpenProcessToken API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System; using System.Runtime.InteropServices; #region 프로세스 토큰 열기 - OpenProcessToken(processHandle, desiredAccess, tokenHandle) /// <summary> /// 프로세스 토큰 열기 /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="desiredAccess">희망 액세스</param> /// <param name="tokenHandle">토큰 핸들</param> /// <returns>처리 결과</returns> [DllImport("advapi32", ExactSpelling = true, SetLastError = true)] private static extern bool OpenProcessToken(IntPtr processHandle, int desiredAccess, ref IntPtr tokenHandle); #endregion |
■ GetCurrentProcess API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Runtime.InteropServices; #region 현재 프로세스 구하기 - GetCurrentProcess() /// <summary> /// 현재 프로세스 구하기 /// </summary> /// <returns>현재 프로세스 핸들</returns> [DllImport("kernel32", ExactSpelling = true)] private static extern IntPtr GetCurrentProcess(); #endregion |
■ ExitWindowsEx API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 윈도우즈 종료하기 (확장) - ExitWindowsEx(flag, reason) /// <summary> /// 윈도우즈 종료하기 (확장) /// </summary> /// <param name="flag">플래그</param> /// <param name="reason">이유</param> /// <returns>처리 결과</returns> [DllImport("user32")] private static extern bool ExitWindowsEx(uint flag, uint reason); #endregion |
■ LockWorkStation API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 워크스테이션 잠그기 - LockWorkStation() /// <summary> /// 워크스테이션 잠그기 /// </summary> [DllImport("user32")] private static extern void LockWorkStation(); #endregion |
■ GetDpiForMonitor API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
using System; using System.Runtime.InteropServices; #region 모니터에서 DPI 구하기 - GetDpiForMonitor(monitorHandle, dpiType, dpiX, dpiY) /// <summary> /// 모니터에서 DPI 구하기 /// </summary> /// <param name="monitorHandle">모니터 핸들</param> /// <param name="dpiType">모니터 DPI 타입</param> /// <param name="dpiX">DPI X</param> /// <param name="dpiY">DPI Y</param> [DllImport("shcore", CharSet = CharSet.Unicode, PreserveSig = false)] pprivate static extern void GetDpiForMonitor(IntPtr monitorHandle, MonitorDPIType dpiType, ref uint dpiX, ref uint dpiY); #endregion /// <summary> /// 모니터 DIP 타입 /// </summary> public enum MonitorDPIType { /// <summary> /// MDT_Effective_DPI /// </summary> /// <remarks> /// 접근성을 통합하는 효과적인 DPI는 데스크톱 응용 프로그램을 확장하기 위해 /// 데스크톱 창 관리(DWM)가 사용하는 것과 일치한다. /// </remarks> EffectiveDPI = 0, /// <summary> /// MDT_Angular_DPI /// </summary> /// <remarks> /// 접근성 재정의를 통합하지 않고 화면에서 호환되는 각도 해상도로 렌더링을 보장하는 DPI /// </remarks> AngularDPI = 1, /// <summary> /// MDT_Raw_DPI /// </summary> /// <remarks>화면 자체의 측정 값으로 화면의 선형 DPI</remarks> RawDPI = 2, /// <summary> /// MDT_Default /// </summary> Default = EffectiveDPI, } |
■ MonitorFromWindow API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
using System; using System.Runtime.InteropServices; #region 윈도우에서 모니터 핸들 구하기 - MonitorFromWindow(windowHandle, defaultType) /// <summary> /// 윈도우에서 모니터 핸들 구하기 /// </summary> /// <param name="windowHandle">윈도우 핸들</param> /// <param name="defaultType">모니터 디폴트 타입</param> /// <returns>모니터 핸들</returns> [DllImport("user32", CharSet = CharSet.Unicode, SetLastError = true)] private static extern IntPtr MonitorFromWindow(IntPtr windowHandle, MonitorDefaultType defaultType); #endregion /// <summary> /// 모니터 디폴트 타입 /// </summary> public enum MonitorDefaultType { /// <summary> /// MONITOR_DEFAULTTONULL /// </summary> MONITOR_DEFAULTTONULL = 0, /// <summary> /// MONITOR_DEFAULTTOPRIMARY /// </summary> MONITOR_DEFAULTTOPRIMARY = 1, /// <summary> /// MONITOR_DEFAULTTONEAREST /// </summary> MONITOR_DEFAULTTONEAREST = 2, } |