using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace SuMouseKey
{
public class Mkey
{
#region 参数
/// <summary>
/// //模拟键盘按键按下
/// </summary>
public static int KEYEVENTF_DOWN = 0;
/// <summary>
/// //模拟键盘按键抬起
/// </summary>
public static int KEYEVENTF_KEYUP = 0x2;
/// <summary>
/// //移动鼠标
/// </summary>
public static int MOUSEEVENTF_MOVE = 0x0001;
/// <summary>
/// //模拟鼠标左键按下参数
/// </summary>
public static int MOUSEEVENTF_LEFTDOWN = 0x0002;
/// <summary>
/// //模拟鼠标左键抬起参数
/// </summary>
public static int MOUSEEVENTF_LEFTUP = 0x0004;
/// <summary>
/// //模拟鼠标右键按下
/// </summary>
public static int MOUSEEVENTF_RIGHTDOWN = 0x0008;
/// <summary>
/// //模拟鼠标右键抬起
/// </summary>
public static int MOUSEEVENTF_RIGHTUP = 0x0010;
/// <summary>
/// //模拟鼠标中键按下
/// </summary>
public static int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
/// <summary>
/// // 模拟鼠标中键抬起
/// </summary>
public static int MOUSEEVENTF_MIDDLEUP = 0x0040;
/// <summary>
/// //标示是否采用绝对坐标
/// </summary>
public static int MOUSEEVENTF_ABSOLUTE = 0x8000;
public static int WM_CHAR = 0X102;
#endregion
#region 公共模拟方法
/// <summary>
/// 模拟键盘
/// </summary>
/// <param name="bVk">按键的虚拟键值</param>
/// <param name="bScan">扫描码,一般不用设置,用0代替就行</param>
/// <param name="dwFlags">参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP" 或是 "0x2"</param>
/// <param name="dwExtraInfo">一般也是置0即可</param>
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
/// <summary>
/// 模拟鼠标
/// </summary>
/// <param name="dwFlags">第一个参数为代表所要模拟的鼠标消息</param>
/// <param name="dx">x</param>
/// <param name="dy">y</param>
/// <param name="cButtons">0</param>
/// <param name="dwExtraInfo">0</param>
[DllImport("user32.dll", EntryPoint = "mouse_event")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
/// <summary>
/// 设置鼠标位置
/// </summary>
/// <param name="X">X</param>
/// <param name="Y">y</param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern bool SetCursorPos(int X, int Y);
/// <summary>
/// 查找句柄
/// </summary>
/// <param name="hwndParent"> 父窗体句柄</param>
/// <param name="hwndChildAfter">获取同一类型中的第几个子窗体 如IntPtr.Zero为第一个</param>
/// <param name="lpszClass">需要找的子窗体类型可以为null 如"EDIT"</param>
/// <param name="lpszWindow">一般为null</param>
/// <returns></returns>
[DllImport("User32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
/// <summary>
/// 发送按键消息SendMessage
/// </summary>
/// <param name="hWnd">hWnd-窗口句柄。窗口可以是任何类型的屏幕对象</param>
/// <param name="Msg">-用于区别其他消息的常量值</param>
/// <param name="wParam">通常是一个与消息有关的常量值,也可能是窗口或控件的句柄</param>
/// <param name="lParam">通常是一个指向内存中数据的指针</param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
/// <summary>
/// 发送按键消息PostMessage
/// </summary>
/// <param name="hWnd">目标窗口句柄</param>
/// <param name="Msg">被张贴的消息(指定被发送的消息)</param>
/// <param name="wParam">第一个消息参数(指定附加消息的特定信息)</param>
/// <param name="lParam">第二个消息参数(指定附加消息的特定信息)</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "PostMessage", SetLastError = true)]
public extern static bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
/// <summary>
/// //获取窗口句柄
/// </summary>
/// <param name="lpClassName">窗体类型 可以为null</param>
/// <param name="lpWindowName">窗体标题 例如:IntPtr findPtr = FindWindow(null, "QQ游戏")</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
/// 激活窗口
/// </summary>
/// <param name="hWnd">要激活的窗口句柄</param>
[DllImport("User32.dll")]
public static extern void SetActiveWindow(IntPtr hWnd);
/// <summary>
/// 创建指定窗口的线程设置到前台,并且激活该窗口
/// </summary>
[DllImport("User32.dll")]
public static extern void SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// 发送一个字符串
/// </summary>
/// <param name="myIntPtr">窗口句柄</param>
/// <param name="Input">字符串</param>
public static void InputStr(IntPtr myIntPtr, string Input)
{
byte[] ch = (ASCIIEncoding.ASCII.GetBytes(Input));
for (int i = 0; i < ch.Length; i++)
{
SendMessage(myIntPtr, WM_CHAR, ch[i], 0);
}
}
#endregion
}
}