c#控制windows 鼠标移动、点击和输入

c#控制windows 鼠标移动、点击和输入

    • 首先可以使用ViewWizard获取窗口的类名和Title
    • MouseHookHelper 鼠标相关的函数
    • 主函数调用MouseHookHelper实现鼠标点击和字符输入
    • 可能遇到的问题

首先可以使用ViewWizard获取窗口的类名和Title

ViewWizard下载地址:https://download.csdn.net/download/th_num/10737076
在这里插入图片描述

图中:窗口标题和窗口类名,可以使用下面的程序获取窗口的句柄。

MouseHookHelper 鼠标相关的函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing; //Pointnamespace FDTDControl
{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);/// <summary>   /// 获取鼠标的坐标   /// </summary>   /// <param name="lpPoint">传址参数,坐标point类型</param>   /// <returns>获取成功返回真</returns>   [DllImport("User32")]public extern static bool GetCursorPos(ref Point lpPoint);#endregion}
}

主函数调用MouseHookHelper实现鼠标点击和字符输入

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing; //Pointnamespace FDTDControl
{class Program{private static void LeftMouseClick(MouseHookHelper.POINT pointInfo){//先移动鼠标到指定位置MouseHookHelper.SetCursorPos(pointInfo.X, pointInfo.Y);//按下鼠标左键MouseHookHelper.mouse_event(MouseHookHelper.MOUSEEVENTF_LEFTDOWN,pointInfo.X,pointInfo.Y, 0, 0);//松开鼠标左键MouseHookHelper.mouse_event(MouseHookHelper.MOUSEEVENTF_LEFTUP,pointInfo.X ,pointInfo.Y , 0, 0);}//实时打印鼠标的相对(x,y)位置private static void PrintMousePoint(int x,int y){int x1 = x;int y1 = y;while (true){Point p = new Point(1, 1);//定义存放获取坐标的point变量   MouseHookHelper.GetCursorPos(ref p);if (x1 != p.X && y1 != p.Y){System.Console.WriteLine("相对于父类窗口 dx:");System.Console.WriteLine(p.X - x);System.Console.WriteLine("相对于父类窗口 dy:");System.Console.WriteLine(p.Y - y);x1 = p.X;y1 = p.Y;}}}static void Main(string[] args){IntPtr awin = MouseHookHelper.FindWindow("HwndWrapper[DefaultDomain;;6e277d51-7be9-45b5-879e-37e195024ec9]", "FDTDControl - Microsoft Visual Studio(管理员)");if (awin == IntPtr.Zero){MessageBox.Show("没有找到窗体");return;}else{//MessageBox.Show(String.Format("{0:D}",awin));MouseHookHelper.RECT rc = new MouseHookHelper.RECT();MouseHookHelper.GetWindowRect(awin,ref rc);int width = rc.Right - rc.Left;  //窗口的宽度int height = rc.Bottom - rc.Top; //窗口的高度int x = rc.Left;int y = rc.Top;MouseHookHelper.SetForegroundWindow(awin);  // 设置当前窗口置前MouseHookHelper.ShowWindow(awin, MouseHookHelper.SW_SHOWNOACTIVATE);//4、5LeftMouseClick(new MouseHookHelper.POINT()  //点击鼠标{X = x,Y = y,});/*IntPtr editBtn= MouseHookHelper.FindWindowEx(awin, IntPtr.Zero, null, null);MouseHookHelper.RECT rc2 = new MouseHookHelper.RECT();MouseHookHelper.GetWindowRect(editBtn, ref rc2);int x2 = rc2.Left;int y2 = rc2.Top;LeftMouseClick(new MouseHookHelper.POINT()  //点击鼠标{X = x2,Y = y2,});*/// 实时获取鼠标的位置//PrintMousePoint(x, y);LeftMouseClick(new MouseHookHelper.POINT()  //点击鼠标(x+466,y+466){X = x+466,Y = y+466,});// 在鼠标点击的地方打印数字SendKeys.SendWait("12");return;}}}
}

可能遇到的问题

  • 找不到using System.Windows.Forms;
    在这里插入图片描述
    在上图中,引用右键点击 --》“添加引用”
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/62549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手势控制鼠标进行操作的方法和源码

网上有不少用手势控制鼠标移动进行简单操作的视频 于是我也做了一个 实现方法简述&#xff1a; 1、肤色检测找到手势区域&#xff0c;&#xff08;加上kalman滤波等会提高准确度&#xff0c;但也会影响实时性&#xff09;&#xff0c; 2、判断手势&#xff0c;只有两种&…

手势识别控制鼠标和键盘

项目已经及上传github&#xff0c;需者自取。 https://github.com/grey-wood-wolf/Gesture-recognition-mouse-and-keyboard-control 完成人&#xff1a;李政廉 黄鑫杰 傅英伦 实现功能 实现左右手的手势识别&#xff0c;并非触摸控制鼠标的移动和点击&#xff0c;以及键盘上下…

【Parsec】远程控制鼠标消失不可见的解决方法

转载连接&#xff1a;https://www.cnblogs.com/cowmax/p/13577769.html 一、问题描述 通过在云端的主机上部署 frp 服务&#xff0c;实现「使用Windows 远程桌面&#xff08;RDP&#xff09;从互联网侧访问内网的主机」。但是&#xff0c;使用 Windows 自带的远程桌面工具 RD…

员工离职倾向尽在公司掌握,争议发生后,监控系统研发商悄悄下架相关服务

你上班时会使用公司WiFi还是自己的流量呢&#xff1f;如果你平时经常用公司的网络摸鱼&#xff0c;那你现在可要注意了&#xff0c;因为你的上网记录很有可能都被监控下来了。 事情经过 上周&#xff0c;有一个网友发帖称自己开工第一天就被裁&#xff0c;原因竟是领导知道了…

2017 年 IT 界最严重的裁员事件汇总

程序猿&#xff08;微信号&#xff1a;imkuqin&#xff09; 猿妹 整编 裁员年年都有&#xff0c;今年特别多从微软、Oracle、IBM&#xff0c;到思科、HPE&#xff0c;再到雅虎、stackoverflow&#xff0c;无论是处于转型变革中的老牌巨头&#xff0c;还是日渐成熟的创新型公司&…

这可能是2018年IT界规模最大的裁员事件了

作者&#xff1a;焱公子&#xff0c;发型光芒万丈的跨界理工男。多年500强&#xff0c;专注写职场。解薄情人世&#xff0c;书深情故事。 来自&#xff1a;焱公子&#xff08;ID&#xff1a;Yangongzi2015&#xff09; 这可能是2018年IT界规模最大的裁员事件了。近日&#xff0…

阿里最新发布2023版Java八股文PDF版,是真的很强

大家好&#xff0c;今天给大家分享一套 阿里10w字 Java 面试手册。266页&#xff0c;涵盖基础篇、JVM篇、多线程并发篇、Spring篇、MyBatis篇、SpringBoot篇、MySQL篇、SpringCloud篇、Dubbo篇、Nginx篇、MQ篇、数据结构与算法篇、Linux篇、Zookeeper篇、Redis篇、分布式篇、网…

阿里原来这么容易就能进去…

最近和阿里的一个老朋友闲聊&#xff0c;感触颇深&#xff0c;据他说公司近期招聘的测试工程师&#xff0c;大多数候选人都有一个“通病”&#xff1a;在工作2-3年的时候遇到瓶颈&#xff0c;而且是一道很难跨越的坎。 为什么会遇到这种情况&#xff1f;因为大部分测试工程师在…

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

阿里巴巴原来这么容易就能进去…

最近和阿里的一个老朋友闲聊&#xff0c;感触颇深&#xff0c;据他说公司近期招聘的测试工程师&#xff0c;大多数候选人都有一个“通病”&#xff1a;在工作2-3年的时候遇到瓶颈&#xff0c;而且是一道很难跨越的坎。 为什么会遇到这种情况&#xff1f;因为大部分测试工程师在…

这是一篇能够教会你运营阿里巴巴国际站的文章

对于很多跨境人来说&#xff0c;运营真的是一个让人头疼的大事情。不知道要从哪个方面下手&#xff0c;不知道要往哪方面努力等等问题都是很常见的&#xff0c;所以今天龙哥就解剖一下阿里巴巴国际站的运营方法&#xff0c;简单地给大家讲一下要掌握哪些方面的知识。运营这条路…

威洛特:狗狗骨折如何应急的去处理?

狗狗这种喜欢活蹦乱跳的动物&#xff0c;真的一不小心可能就把自己骨头折了。骨折会影响狗狗的身体健康和正常生活&#xff0c;必须及时治疗。接下来威洛特就给大家分享一些狗狗骨折的相关注意事项。 一、狗狗骨折的应急处理 当狗狗骨折的时候&#xff0c;它的骨头很可能错位了…

安全狗的绕过

环境&#xff1a; phpstudy2018 安全狗apache版 sqllabs靶场 安全狗绕过思路&#xff1a; 安全狗是基于正则匹配的绕过&#xff0c;所以总是能够绕过其正则匹配实现sql的命令执行&#xff0c;需要对数据库语句灵活掌握。经过对安全狗的fuzz&#xff0c;测试其拦截规则&#xff…

Android Watchdog 狗子到底做了啥

作者&#xff1a;流浪汉kylin 原文链接&#xff1a;https://juejin.cn/post/7215498393429983291 前言 有一定开发经验的或多或少有听过Watchdog&#xff0c;那什么是Watchdog呢&#xff1f;Watchdog又称看门狗&#xff0c;看门狗是育碧开发的一款游戏&#xff0c;目前已出到《…

python程序编程代码大全,python编程代码详解

大家好&#xff0c;本文将围绕python程序编程代码大全展开说明&#xff0c;python编程游戏代码是一个很多人都想弄明白的事情&#xff0c;想搞清楚python代码大全简单需要先了解以下几个事情。 1、python编程例子有哪些&#xff1f; python编程经典例子&#xff1a; 1、画爱心…

宝峰数科带你读懂数字家庭的真正内涵

由建标〔2021〕28号文《关于加快发展数字家庭提高居住品质的指导意见》开启的数字家庭国家建设已有一年多&#xff0c;但仍有不少人不能清晰理解数字家庭与早已存在的智能家居、智慧家庭、全屋智能等传统智能之间的区别&#xff0c;业内对数字家庭的认识还不够深入、有待提高。…

易观数科代码埋点、全埋点、可视化埋点

讲埋点的文章那么多&#xff0c;我们为什么还要写它&#xff1f;首先&#xff0c;这不是一篇纯技术文章&#xff0c;而是从一个非技术人员的角度&#xff0c;希望通过浅显的语言描述&#xff0c;让运营同学能快速了解概念。 此外&#xff0c;目前市面的埋点文章&#xff0c;要…

京东数科(实习一面)

数据库之范式数据库之索引线程间通信反射什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f;Java如何实现一次编译到处运行的。 数据库之范式 目前关系型数据库一共有 6 种范式&#xff0c;按照范式级别&#xff0c;从低到高分别是&#xff1a;1NF&#xff08;第…

360数科发布2020全年财报:全年收入上涨47.1%,科技为运营效率提供第一动力

3月16日&#xff0c;360数科发布2020年第4季度及全年未经审计的财务报告。2020财年&#xff0c;360数科实现收入135.64亿元&#xff0c;较2019年92.2亿元增长47.1%&#xff1b;非美国会计准则&#xff08;Non-GAAP&#xff09;下净利润为37.97亿元&#xff0c;较2019年27.52亿元…

不追逐标准化产品,360数科的一站式风控体系有何不同?

新冠肺炎疫情无疑加速了金融行业数字化转型&#xff0c;竞争者不断涌入&#xff0c;逐渐形成由BATJ、传统银行旗下金融科技子公司、以及专注于金融机构的数字化服务公司构成的竞争格局。然而&#xff0c;风控始终是金融行业的核心。作为定位于中国零售金融领域科技服务商的360数…