using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; namespace HandyControl.Tools.Interop { public delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "IdentifierTypo")] internal class NativeMethods { public const int WS_CHILD = 0x40000000, BITSPIXEL = 12, PLANES = 14, BI_RGB = 0, DIB_RGB_COLORS = 0, NIF_MESSAGE = 0x00000001, NIF_ICON = 0x00000002, NIF_TIP = 0x00000004, NIF_INFO = 0x00000010, NIN_BALLOONSHOW = WM_USER + 2, NIN_BALLOONHIDE = WM_USER + 3, NIN_BALLOONTIMEOUT = WM_USER + 4, NIM_ADD = 0x00000000, NIM_MODIFY = 0x00000001, NIM_DELETE = 0x00000002, NIIF_NONE = 0x00000000, NIIF_INFO = 0x00000001, NIIF_WARNING = 0x00000002, NIIF_ERROR = 0x00000003, WM_KEYDOWN = 0x0100, WM_KEYUP = 0x0101, WM_SYSKEYDOWN = 0x0104, WM_SYSKEYUP = 0x0105, WM_MOUSEMOVE = 0x0200, WM_LBUTTONDOWN = 0x0201, WM_LBUTTONUP = 0x0202, WM_LBUTTONDBLCLK = 0x0203, WM_RBUTTONDOWN = 0x0204, WM_RBUTTONUP = 0x0205, WM_RBUTTONDBLCLK = 0x0206, WM_MBUTTONDOWN = 0x0207, WM_MBUTTONUP = 0x0208, WM_MBUTTONDBLCLK = 0x0209, WM_USER = 0x0400, TB_GETBUTTON = WM_USER + 23, TB_BUTTONCOUNT = WM_USER + 24, TB_GETITEMRECT = WM_USER + 29, STANDARD_RIGHTS_REQUIRED = 0x000F0000, SYNCHRONIZE = 0x00100000, PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, MEM_COMMIT = 0x1000, MEM_RELEASE = 0x8000, PAGE_READWRITE = 0x04, TBSTATE_HIDDEN = 0x08, VERTRES = 10, HORZRES = 8, DESKTOPVERTRES = 117, DESKTOPHORZRES = 118, LOGPIXELSX = 88, LOGPIXELSY = 90, CXFRAME = 32, CXSIZEFRAME = CXFRAME; [Flags] public enum ProcessAccess { AllAccess = CreateThread | DuplicateHandle | QueryInformation | SetInformation | Terminate | VMOperation | VMRead | VMWrite | Synchronize, CreateThread = 0x2, DuplicateHandle = 0x40, QueryInformation = 0x400, SetInformation = 0x200, Terminate = 0x1, VMOperation = 0x8, VMRead = 0x10, VMWrite = 0x20, Synchronize = 0x100000 } [Serializable, StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; public RECT(int left, int top, int right, int bottom) { Left = left; Top = top; Right = right; Bottom = bottom; } } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct TBBUTTON { public int iBitmap; public int idCommand; public IntPtr fsStateStylePadding; public IntPtr dwData; public IntPtr iString; } [Flags] public enum AllocationType { Commit = 0x1000, Reserve = 0x2000, Decommit = 0x4000, Release = 0x8000, Reset = 0x80000, Physical = 0x400000, TopDown = 0x100000, WriteWatch = 0x200000, LargePages = 0x20000000 } [Flags] public enum MemoryProtection { Execute = 0x10, ExecuteRead = 0x20, ExecuteReadWrite = 0x40, ExecuteWriteCopy = 0x80, NoAccess = 0x01, ReadOnly = 0x02, ReadWrite = 0x04, WriteCopy = 0x08, GuardModifierflag = 0x100, NoCacheModifierflag = 0x200, WriteCombineModifierflag = 0x400 } [StructLayout(LayoutKind.Sequential)] public struct TRAYDATA { public IntPtr hwnd; public uint uID; public uint uCallbackMessage; public uint bReserved0; public uint bReserved1; public IntPtr hIcon; } [Flags] public enum FreeType { Decommit = 0x4000, Release = 0x8000, } [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; public POINT(int x, int y) { X = x; Y = y; } } [DllImport(ExternDll.User32, CharSet = CharSet.Auto)] [ResourceExposure(ResourceScope.None)] public static extern int RegisterWindowMessage(string msg); [DllImport(ExternDll.User32, SetLastError = true, CharSet = CharSet.Auto)] public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, ref RECT lpPoints, uint cPoints); [DllImport(ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, out TBBUTTON lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport(ExternDll.Kernel32, SetLastError = true)] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, out RECT lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport(ExternDll.Kernel32, SetLastError = true)] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, out TRAYDATA lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport(ExternDll.User32, CharSet = CharSet.Auto)] public static extern uint SendMessage(IntPtr hWnd, uint Msg, uint wParam, IntPtr lParam); [DllImport(ExternDll.User32, SetLastError = true, CharSet = CharSet.Auto)] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [DllImport(ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr OpenProcess(ProcessAccess dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwProcessId); [DllImport(ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, AllocationType flAllocationType, MemoryProtection flProtect); [DllImport(ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] public static extern int CloseHandle(IntPtr hObject); [DllImport(ExternDll.Kernel32, SetLastError = true, CharSet = CharSet.Auto)] public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, FreeType dwFreeType); [DllImport(ExternDll.User32, SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport(ExternDll.User32, SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport(ExternDll.User32)] public static extern int GetWindowRect(IntPtr hwnd, out RECT lpRect); [DllImport(ExternDll.User32, CharSet = CharSet.Auto)] public static extern bool GetCursorPos(out POINT pt); [SecurityCritical] [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [DllImport(ExternDll.User32)] public static extern int GetSystemMetrics(SM nIndex); } }