C# 指定点的 鼠标点击事件、获取指定位置控件的文本

需要调用user32.dll

csharp 复制代码
[DllImport("user32.dll")]
        public static extern bool ScreenToClient(IntPtr hWnd, ref Point lpPoint);



        public static int WM_GETTEXT = 0x0D;//应用程序发送此消息来复制对应窗口的文本到缓冲区
        public static int WM_GETTEXTLENGTH = 0x0E;//得到与一个窗口有关的文本的长度(不包含空字符)
        public static int BM_CLICK = 0xF5; //鼠标点击的消息,对于各种消息的数值,大家还是得去API手册
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;
        bool isRuning = false;
        IntPtr lastHwnd = IntPtr.Zero;
        System.Threading.AutoResetEvent resetEvent = new System.Threading.AutoResetEvent(true);
private bool SendClid(Point p)
        {
            try
            {
                //Point p = new Point(1200, 150);

                IntPtr curHwnd = WindowFromPoint(p);//获取当前坐标位置的控件句柄(不能获取Disabled未激活的控件)
                ScreenToClient(curHwnd, ref p);//将屏幕坐标转换为窗口客户区坐标
                curHwnd = ChildWindowFromPoint(curHwnd, p);//从当前坐标查找子控件(可获取Disabled未激活的控件).如果没有则返回自己

                SendMessage(curHwnd, WM_LBUTTONDOWN, 0, 0);//按下鼠标左键
                SendMessage(curHwnd, WM_LBUTTONUP, 0, 0);//抬起鼠标左键

                return true;
            }
            catch (Exception)
            {
                return false;
            }

        }

        /// <summary>
        /// 获取 指定点 控件文本
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        private string GetCtlText(Point p)
        {
            string ret;
            try
            {

                IntPtr curHwnd = WindowFromPoint(p);//获取当前坐标位置的控件句柄(不能获取Disabled未激活的控件)
                ScreenToClient(curHwnd, ref p);//将屏幕坐标转换为窗口客户区坐标
                curHwnd = ChildWindowFromPoint(curHwnd, p);//从当前坐标查找子控件(可获取Disabled未激活的控件).如果没有则返回自己


                int len = SendMessage(curHwnd, WM_GETTEXTLENGTH, 0, 0);
                StringBuilder sb = new StringBuilder(len + 1);
                SendMessage(curHwnd, WM_GETTEXT, sb.Capacity, sb);
                ret = sb.ToString();

                return ret;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

调用:

csharp 复制代码
Invoke((Action)delegate
            {
        
                string s_text = GetCtlText(new Point(200, 240));            // 读取 SN      
                MessageBox.Show(s_text);             
                SendClid(new Point(400, 100));        // 该位置是一个按钮


            });
相关推荐
瓯雅爱分享13 分钟前
Java+Vue构建的采购招投标一体化管理系统,集成招标计划、投标审核、在线竞价、中标公示及合同跟踪功能,附完整源码,助力企业实现采购全流程自动化与规范化
java·mysql·vue·软件工程·源代码管理
mit6.8243 小时前
[C# starter-kit] 命令/查询职责分离CQRS | MediatR |
java·数据库·c#
诸神缄默不语3 小时前
Maven用户设置文件(settings.xml)配置指南
xml·java·maven
任子菲阳3 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
学Linux的语莫3 小时前
机器学习数据处理
java·算法·机器学习
找不到、了3 小时前
JVM的即时编译JIT的介绍
java·jvm
西瓜er4 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .4 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮4 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀4 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试