C# 调用windows api 操作鼠标、键盘、窗体合集
2018-02-13 11:01
471 查看
1.根据句柄查找窗体
引自http://www.2cto.com/kf/201410/343342.html使用SPY++工具获取窗体
![](http://www.2cto.com/uploadfile/Collfiles/20141014/20141014092235324.jpg)
首先打开spy++工具,同时点击"查找窗口"按钮(望远镜),再点击"查找程序工具"中按钮拖拽至要查看的窗体中,点击"确定"按钮.
![](http://www.2cto.com/uploadfile/Collfiles/20141014/20141014092235325.jpg)
IntPtr awin = MouseHookHelper.FindWindow("WeChatMainWndForPC", "微信"); if (awin == IntPtr.Zero) { MessageBox.Show("没有找到窗体"); return; }
2.获取窗体坐标信息
MouseHookHelper.RECT rect = new MouseHookHelper.RECT(); MouseHookHelper.GetWindowRect(awin, ref rect); int width = rect.Right - rect.Left; //窗口的宽度 int height = rect.Bottom - rect.Top; //窗口的高度 int x = rect.Left; int y = rect.Top;
3.设置为当前窗体
MouseHookHelper.SetForegroundWindow(awin); MouseHookHelper.ShowWindow(awin,MouseHookHelper.SW_SHOWNOACTIVATE);//4、5
4.点击某个坐标
LeftMouseClick(new MouseHookHelper.POINT() { X = ppp.MsgX, Y = ppp.MsgY });
private static void LeftMouseClick(MouseHookHelper.POINT pointInfo) { //先移动鼠标到指定位置 MouseHookHelper.SetCursorPos(pointInfo.X, pointInfo.Y); //按下鼠标左键 MouseHookHelper.mouse_event(MouseHookHelper.MOUSEEVENTF_LEFTDOWN, pointInfo.X * 65536 / Screen.PrimaryScreen.Bounds.Width, pointInfo.Y * 65536 / Screen.PrimaryScreen.Bounds.Height, 0, 0); //松开鼠标左键 MouseHookHelper.mouse_event(MouseHookHelper.MOUSEEVENTF_LEFTUP, pointInfo.X * 65536 / Screen.PrimaryScreen.Bounds.Width, pointInfo.Y * 65536 / Screen.PrimaryScreen.Bounds.Height, 0, 0); }
5.复制粘贴操作
//复制到剪贴板 Clipboard.SetText("test"); //从剪贴板获取数据 Clipboard.GetText(); //粘贴 SendKeys.SendWait("^V"); //回车键 SendKeys.Send("{Enter}");
6.钩子的使用
private void button1_Click(object sender, EventArgs e) { if (hHook == 0) { MyProcedure = new MouseHookHelper.HookProc(this.MouseHookProc); //这里挂节钩子 hHook = MouseHookHelper.SetWindowsHookEx(WH_MOUSE_LL, MyProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); if (hHook == 0) { MessageBox.Show("请以管理员方式打开"); return; } button1.Text = "卸载钩子"; } else { bool ret = MouseHookHelper.UnhookWindowsHookEx(hHook); if (ret == false) { MessageBox.Show("请以管理员方式打开"); return; } hHook = 0; button1.Text = "安装钩子"; } } private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { MouseHookHelper.MouseHookStruct MyMouseHookStruct = (MouseHookHelper.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookHelper.MouseHookStruct)); if (nCode < 0) { return MouseHookHelper.CallNextHookEx(hHook, nCode, wParam, lParam); } else { String strCaption = "x = " + MyMouseHookStruct.pt.X.ToString("d") + " y = " + MyMouseHookStruct.pt.Y.ToString("d"); this.Text = strCaption; return MouseHookHelper.CallNextHookEx(hHook, nCode, wParam, lParam); } }
7.MouseHookHelper代码
public class MouseHookHelper { #region 根据句柄寻找窗体并发送消息 [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] //参数1:指的是类名。参数2,指的是窗口的标题名。两者至少要知道1个 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle); [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, int wParam, string lParam); [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam); #endregion #region 获取窗体位置 [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; //最左坐标 public int Top; //最上坐标 public int Right; //最右坐标 public int Bottom; //最下坐标 } #endregion #region 设置窗体显示形式 public enum nCmdShow : uint { SW_NONE,//初始值 SW_FORCEMINIMIZE,//:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。 SW_MIOE,//:隐藏窗口并激活其他窗口。 SW_MAXIMIZE,//:最大化指定的窗口。 SW_MINIMIZE,//:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。 SW_RESTORE,//:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。 SW_SHOW,//:在窗口原来的位置以原来的尺寸激活和显示窗口。 SW_SHOWDEFAULT,//:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。 SW_SHOWMAXIMIZED,//:激活窗口并将其最大化。 SW_SHOWMINIMIZED,//:激活窗口并将其最小化。 SW_SHOWMINNOACTIVATE,//:窗口最小化,激活窗口仍然维持激活状态。 SW_SHOWNA,//:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。 SW_SHOWNOACTIVATE,//:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。 SW_SHOWNOMAL,//:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。 } public const int SW_HIDE = 0; public const int SW_SHOWNORMAL = 1; public const int SW_SHOWMINIMIZED = 2; public const int SW_SHOWMAXIMIZED = 3; public const int SW_MAXIMIZE = 3; public const int SW_SHOWNOACTIVATE = 4; public const int SW_SHOW = 5; public const int SW_MINIMIZE = 6; public const int SW_SHOWMINNOACTIVE = 7; public const int SW_SHOWNA = 8; public const int SW_RESTORE = 9; [DllImport("User32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("User32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); #endregion #region 控制鼠标移动 //移动鼠标 public const int MOUSEEVENTF_MOVE = 0x0001; //模拟鼠标左键按下 public const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键抬起 public const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标右键按下 public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键抬起 public const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标中键按下 public const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键抬起 public const int MOUSEEVENTF_MIDDLEUP = 0x0040; //标示是否采用绝对坐标 public const int MOUSEEVENTF_ABSOLUTE = 0x8000; [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 } //[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] [DllImport("user32.dll")] public static extern bool SetCursorPos(int X, int Y); [DllImport("user32.dll")] public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); #endregion #region 获取坐标钩子 [StructLayout(LayoutKind.Sequential)] public class POINT { public int X; public int Y; } [StructLayout(LayoutKind.Sequential)] public class MouseHookStruct { public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); //安装钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //卸载钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); //调用下一个钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); #endregion }
相关文章推荐
- C# 调用windows api 操作鼠标、键盘、窗体合集...更新中
- C#通过Windows API 获取键盘和鼠标操作的时间的类
- C# WPF 中用代码模拟鼠标和键盘的操作
- 在C#中如何模拟鼠标键盘操作
- winform窗体 一段时间鼠标键盘无操作
- C#获取键盘和鼠标操作的时间的类
- 用C#调用Windows API和其它进程通信及C# 获得另外一程序 句柄 后控制该程序 控制其透明 窗体大小
- C# 模拟 鼠标 键盘操作
- C#获取键盘和鼠标操作的时间的类
- C# 判断系统空闲(键盘、鼠标不操作一段时间)
- 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】
- C#捕获鼠标键盘未操作的时间长度
- C# 操作键盘及鼠标
- C# 判断系统空闲(键盘、鼠标不操作一段时间)
- C#运行时鼠标移动控件 - 调用Windows API(ReleaseCapture)
- 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】
- c#让窗体永在最前 调用windows api 将窗体设为topmost
- C# 判断系统空闲(键盘、鼠标不操作一段时间)
- c#模拟鼠标键盘操作
- C# 模拟 鼠标 键盘操作