/******************************************************************** * * * * Copyright (C) 2013-2018 uiskin.cn * * 作者: BinGoo QQ:315567586 * * 请尊重作者劳动成果,请保留以上作者信息,禁止用于商业活动。 * * * * 创建时间:2014-08-05 * * 说明:Windows帮助类 * * ********************************************************************/ using Microsoft.Win32; using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace NetWorkHelper.Helper { public class WindowsHelper { #region 开机自动启动 /// /// 开机自动启动,使用注册表 /// /// 是否开机自动启动 /// 取一个唯一的注册表Key名称 /// 启动程序的完整路径 public static void RunWhenStart_usingReg(bool started, string name, string path) { RegistryKey HKLM = Registry.LocalMachine; try { RegistryKey run = HKLM.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\"); if (run == null) { return; } if (started) { run.SetValue(name, path); } else { object val = run.GetValue(name); if (val != null) { run.DeleteValue(name); } } } finally { HKLM.Close(); } } #endregion #region MouseEvent 模拟鼠标/键盘点击 /// /// MouseEvent 模拟鼠标点击 /// [DllImport("user32.dll", EntryPoint = "mouse_event")] public static extern void MouseEvent(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo); //在(34, 258)处点击鼠标 //SetCursorPos(34, 258); //MouseEvent(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero); //MouseEvent(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero); /// /// SetCursorPos 设置光标的绝对位置 /// [DllImport("user32.dll")] public static extern bool SetCursorPos(int x, int y); /// /// KeybdEvent 模拟键盘。已经过期。 /// [DllImport("user32.dll", EntryPoint = "keybd_event")] public static extern void KeybdEvent2(byte key, byte bScan, KeybdEventFlag flags, uint dwExtraInfo); public static void KeybdEvent(byte key, byte bScan, KeybdEventFlag flags, uint dwExtraInfo) { INPUT input = new INPUT(); input.type = 1; //keyboard input.ki.wVk = key; input.ki.wScan = MapVirtualKey(key, 0); input.ki.dwFlags = (int)flags; SendInput(1, ref input, Marshal.SizeOf(input)); } [DllImport("user32.dll")] private static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize); [DllImport("user32.dll")] private static extern byte MapVirtualKey(byte wCode, int wMap); #endregion #region 根据扩展名获取系统图标 /// /// 根据扩展名获取系统图标。 /// /// 文件类型,使用扩展名表示,如".txt" public static Icon GetSystemIconByFileType(string fileType, bool isLarge) { if (isLarge) { return GetIcon(fileType, FILE_ATTRIBUTE.NORMAL, SHGFI.USEFILEATTRIBUTES | SHGFI.ICON | SHGFI.LARGEICON); } return GetIcon(fileType, FILE_ATTRIBUTE.NORMAL, SHGFI.USEFILEATTRIBUTES | SHGFI.ICON | SHGFI.SMALLICON); } private static Icon GetIcon(string path, FILE_ATTRIBUTE dwAttr, SHGFI dwFlag) { SHFILEINFO fi = new SHFILEINFO(); Icon ic = null; int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag); ic = Icon.FromHandle(fi.hIcon); return ic; } #region shell32函数 [DllImport("shell32", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SHGetFileInfo(string pszPath, FILE_ATTRIBUTE dwFileAttributes, ref SHFILEINFO sfi, int cbFileInfo, SHGFI uFlags); // Contains information about a file object [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct SHFILEINFO { public IntPtr hIcon; //文件的图标句柄 public IntPtr iIcon; //图标的系统索引号 public uint dwAttributes; //文件的属性值 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; //文件的显示名 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; //文件的类型名 }; // Flags that specify the file information to retrieve with SHGetFileInfo [Flags] public enum SHGFI : uint { ADDOVERLAYS = 0x20, ATTR_SPECIFIED = 0x20000, ATTRIBUTES = 0x800, //获得属性 DISPLAYNAME = 0x200, //获得显示名 EXETYPE = 0x2000, ICON = 0x100, //获得图标 ICONLOCATION = 0x1000, LARGEICON = 0, //获得大图标 LINKOVERLAY = 0x8000, OPENICON = 2, OVERLAYINDEX = 0x40, PIDL = 8, SELECTED = 0x10000, SHELLICONSIZE = 4, SMALLICON = 1, //获得小图标 SYSICONINDEX = 0x4000, TYPENAME = 0x400, //获得类型名 USEFILEATTRIBUTES = 0x10 } // Flags that specify the file information to retrieve with SHGetFileInfo [Flags] public enum FILE_ATTRIBUTE { READONLY = 0x00000001, HIDDEN = 0x00000002, SYSTEM = 0x00000004, DIRECTORY = 0x00000010, ARCHIVE = 0x00000020, DEVICE = 0x00000040, NORMAL = 0x00000080, TEMPORARY = 0x00000100, SPARSE_FILE = 0x00000200, REPARSE_POINT = 0x00000400, COMPRESSED = 0x00000800, OFFLINE = 0x00001000, NOT_CONTENT_INDEXED = 0x00002000, ENCRYPTED = 0x00004000 } #endregion #endregion #region 设置目标窗体为活动窗体,将其TopLevel在最前。 [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")] private static extern bool SetActiveWindow(IntPtr hWnd); /// /// 设置目标窗体为活动窗体,将其TopLevel在最前。 /// public static void SetForegroundWindow(Form window) { SetActiveWindow(window.Handle); } #endregion } #region MouseEventFlag ,KeybdEventFlag /// /// 模拟鼠标点击的相关标志 。 /// [Flags] public enum MouseEventFlag : uint { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x0040, XDown = 0x0080, XUp = 0x0100, Wheel = 0x0800, VirtualDesk = 0x4000, Absolute = 0x8000 //绝对坐标 } /// /// 模拟键盘点击的相关标志 。 /// [Flags] public enum KeybdEventFlag : uint { Down = 0, Up = 0x0002 } #endregion [StructLayout(LayoutKind.Explicit)] public struct INPUT { [FieldOffset(0)] public Int32 type; [FieldOffset(4)] public KEYBDINPUT ki; [FieldOffset(4)] public MOUSEINPUT mi; [FieldOffset(4)] public HARDWAREINPUT hi; } [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public Int32 dx; public Int32 dy; public Int32 mouseData; public Int32 dwFlags; public Int32 time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public Int16 wVk; public Int16 wScan; public Int32 dwFlags; public Int32 time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct HARDWAREINPUT { public Int32 uMsg; public Int16 wParamL; public Int16 wParamH; } }