/********************************************************************
* *
* * 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;
}
}