关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe)

这篇具有很好参考价值的文章主要介绍了关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为最近工作需要用就把基本知识整理了一下

主要操作这个软件写程序和选配置

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 下面例子和Win32以及自己封装的库全在工程文件里面

2023.7.10 :以前写的代码丢了重新写了一下优化了不少 ,所以特此更新一下

以前是1.7的版本目前用的是1.9版本有些不一样需要注意

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 这里放最新的连接(C2prog1.9版本的软件也在里面)

和以前的相比加了不少便捷使用的函数进去

这个是1.7版本
链接:https://pan.baidu.com/s/1imOVeULlxe82Ejv0dPNy_Q?pwd=6666 
提取码:6666 
--来自百度网盘超级会员V1的分享

更新时间:2023.7.26
链接:https://pan.baidu.com/s/1naRrKJX0VMIuXSID4d2bHQ?pwd=6666 
提取码:6666

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

调用示例

 textBox1.Text = classPro.Run19(@"C:\\Program Files (x86)\\C2Prog1.7\\C2Prog.exe", @"D:\Dbug\Template.hex", "F28M35X-C28-512K", "10MHz_4x", "com666","xx").ToString();

注意事项:

里面有两个批处理是用来打开和关闭C2Prog软件的需要放在C2Prog.exe所在的目录下面

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言 这样放

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

1安装句柄抓取工具SPY++ 

我用的工具是SPY++

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

没有这个工具的按照下面方法自己装一下

选中工具菜单下面的"获工具功能"

 1.关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 选择单个组件里面的"C++核心功能" 进行安装就行

 关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

下载这个工具的主要目的为了抓取句柄

看接下来操作

首先打开我们的SPY++工具

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

点击窗口新建一个 

 关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 接下来就会出现程序运行的所有信息

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 我们只查找我们需要的,打开我们需要查找句柄的窗体

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 点击搜索>查找窗口

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 接下来出现这样一个界面

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 我们只需要拖动查找工具,就是哪个圆形东西到指定窗体就能拿到窗体的句柄了

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 我们拖动到 Program 按钮就拿到了按钮句柄关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

接下来在C#中来实操一下

0x00010A3C这个就是我们刚才拿到的句柄  0x0201 和0X0202分别是鼠标左键按下和弹起   我们运行后可以看到软件上按钮确实被单击了,你们要自己实践

 // 导入Windows API函数,用于给窗口发送消息
        [DllImport("User32.dll")]
        public static extern int SendMessage(int hWnd, int msg, int wParam, string lParam);

        private void button7_Click(object sender, EventArgs e)
        {
            PostMessage((IntPtr)0x00010A3C, 0x0201, 0x0001, 0); //左键按下
            Thread.Sleep(200);
            PostMessage((IntPtr)0x00010A3C, 0x0202, 0x0001, 0); //弹起
        }

 这里需要注意一下我们的第三方软件句柄是每次重新打开软件都会重新分配的,所以句柄是一个不确定的值,那么我们该如何获取呢?

  // 导入Windows API函数,用于查找窗口句柄
        [DllImport("user32.dll")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        // 导入Windows API函数,用于查找子窗口句柄
        [DllImport("user32.dll")]
        private static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpClassName, string lpWindowName);


        /// <summary>
        /// 获取主窗体句柄
        /// </summary>
        /// <param name="APPname">主窗体名称 没有就填null</param>
        /// <param name="APPclass">主窗体类 这个必须填</param>
       public IntPtr Get_Main_handle(string APPname,string APPclass)
        {
           return FindWindow(APPclass, APPname);
        }
        /// <summary>
        /// 获取主窗体下面子窗体句柄
        /// </summary>
        /// <param name="Main_APPname">主窗体名称</param>
        /// <param name="Main_APPclass">主窗体类</param>
        /// <param name="child_APPclass">子窗体类</param>
        /// <param name="child_APPname">子窗体名称 可以填null</param>
        /// <returns>返回找到的句柄</returns>
        public IntPtr Get_child_handle(string Main_APPname, string Main_APPclass, string child_APPclass, string child_APPname)
        {           
            IntPtr stmHandle = FindWindow(Main_APPclass, Main_APPname); 
            //在父窗体下 第0个窗体开始查找 类为SWT_Window0标题为null 代表忽略标题    
           return FindWindowEx(stmHandle, IntPtr.Zero, child_APPclass, child_APPname);
        }

 接下来看看实际运行效果

我们写了一个单击事件

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 可以清晰看到我们的效果 文本框里面已经获取到了窗体的句柄 110BA8

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

 自己封装了一些常用到的API   链接放最上边了

关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe),c#,计算机外设,开发语言

接下来实现模拟键盘发送 A

  
        // 导入Windows API函数,用于发送键盘消息
        [DllImport("user32.dll")]
        private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
        private void button7_Click(object sender, EventArgs e)
        {
            //模拟按下A
            keybd_event(0X65, 0, 0, 0);
           
            //松开按键A
            keybd_event(0X65, 0, 2, 0);
        }

下面列举一些比较常见的消息  大家可以自己替换

 这段事件弄了不是这个方面的,很多第三方窗体有下拉列表框,文本框,单选框,等等一系列基本都可以用鼠标点击方式配合键盘发送都能实现文章来源地址https://www.toymoban.com/news/detail-628808.html

这些常见的消息参考网上  C#窗体如何通过keybd_event()函数模拟键盘按键(组合键)产生事件 - 小小邪 - 博客园 (cnblogs.com)

#region bVk参数 常量定义

        public const byte vbKeyLButton = 0x1;    // 鼠标左键
        public const byte vbKeyRButton = 0x2;    // 鼠标右键
        public const byte vbKeyCancel = 0x3;     // CANCEL 键
        public const byte vbKeyMButton = 0x4;    // 鼠标中键
        public const byte vbKeyBack = 0x8;       // BACKSPACE 键
        public const byte vbKeyTab = 0x9;        // TAB 键
        public const byte vbKeyClear = 0xC;      // CLEAR 键
        public const byte vbKeyReturn = 0xD;     // ENTER 键
        public const byte vbKeyShift = 0x10;     // SHIFT 键
        public const byte vbKeyControl = 0x11;   // CTRL 键
        public const byte vbKeyAlt = 18;         // Alt 键  (键码18)
        public const byte vbKeyMenu = 0x12;      // MENU 键
        public const byte vbKeyPause = 0x13;     // PAUSE 键
        public const byte vbKeyCapital = 0x14;   // CAPS LOCK 键
        public const byte vbKeyEscape = 0x1B;    // ESC 键
        public const byte vbKeySpace = 0x20;     // SPACEBAR 键
        public const byte vbKeyPageUp = 0x21;    // PAGE UP 键
        public const byte vbKeyEnd = 0x23;       // End 键
        public const byte vbKeyHome = 0x24;      // HOME 键
        public const byte vbKeyLeft = 0x25;      // LEFT ARROW 键
        public const byte vbKeyUp = 0x26;        // UP ARROW 键
        public const byte vbKeyRight = 0x27;     // RIGHT ARROW 键
        public const byte vbKeyDown = 0x28;      // DOWN ARROW 键
        public const byte vbKeySelect = 0x29;    // Select 键
        public const byte vbKeyPrint = 0x2A;     // PRINT SCREEN 键
        public const byte vbKeyExecute = 0x2B;   // EXECUTE 键
        public const byte vbKeySnapshot = 0x2C;  // SNAPSHOT 键
        public const byte vbKeyDelete = 0x2E;    // Delete 键
        public const byte vbKeyHelp = 0x2F;      // HELP 键
        public const byte vbKeyNumlock = 0x90;   // NUM LOCK 键

        //常用键 字母键A到Z
        public const byte vbKeyA = 65;
        public const byte vbKeyB = 66;
        public const byte vbKeyC = 67;
        public const byte vbKeyD = 68;
        public const byte vbKeyE = 69;
        public const byte vbKeyF = 70;
        public const byte vbKeyG = 71;
        public const byte vbKeyH = 72;
        public const byte vbKeyI = 73;
        public const byte vbKeyJ = 74; 
        public const byte vbKeyK = 75;
        public const byte vbKeyL = 76;
        public const byte vbKeyM = 77;
        public const byte vbKeyN = 78;
        public const byte vbKeyO = 79 ;
        public const byte vbKeyP = 80 ;
        public const byte vbKeyQ = 81 ;
        public const byte vbKeyR = 82 ;
        public const byte vbKeyS = 83 ;
        public const byte vbKeyT = 84 ;
        public const byte vbKeyU = 85 ;
        public const byte vbKeyV = 86 ;
        public const byte vbKeyW = 87 ;
        public const byte vbKeyX = 88 ;
        public const byte vbKeyY = 89 ;
        public const byte vbKeyZ = 90 ;

        //数字键盘0到9
        public const byte vbKey0 = 48 ;    // 0 键
        public const byte vbKey1 = 49 ;    // 1 键
        public const byte vbKey2 = 50 ;    // 2 键
        public const byte vbKey3 = 51 ;    // 3 键
        public const byte vbKey4 = 52 ;    // 4 键
        public const byte vbKey5 = 53 ;    // 5 键
        public const byte vbKey6 = 54 ;    // 6 键
        public const byte vbKey7 = 55 ;    // 7 键
        public const byte vbKey8 = 56 ;    // 8 键
        public const byte vbKey9 = 57 ;    // 9 键


        public const byte vbKeyNumpad0 = 0x60 ;    //0 键
        public const byte vbKeyNumpad1 = 0x61 ;    //1 键
        public const byte vbKeyNumpad2 = 0x62 ;    //2 键
        public const byte vbKeyNumpad3 = 0x63 ;    //3 键
        public const byte vbKeyNumpad4 = 0x64 ;    //4 键
        public const byte vbKeyNumpad5 = 0x65 ;    //5 键
        public const byte vbKeyNumpad6 = 0x66 ;    //6 键
        public const byte vbKeyNumpad7 = 0x67 ;    //7 键
        public const byte vbKeyNumpad8 = 0x68 ;    //8 键
        public const byte vbKeyNumpad9 = 0x69 ;    //9 键
        public const byte vbKeyMultiply = 0x6A ;   // MULTIPLICATIONSIGN(*)键
        public const byte vbKeyAdd = 0x6B ;        // PLUS SIGN(+) 键
        public const byte vbKeySeparator = 0x6C ;  // ENTER 键
        public const byte vbKeySubtract = 0x6D ;   // MINUS SIGN(-) 键
        public const byte vbKeyDecimal = 0x6E ;    // DECIMAL POINT(.) 键
        public const byte vbKeyDivide = 0x6F ;     // DIVISION SIGN(/) 键


        //F1到F12按键
        public const byte vbKeyF1 = 0x70 ;   //F1 键
        public const byte vbKeyF2 = 0x71 ;   //F2 键
        public const byte vbKeyF3 = 0x72 ;   //F3 键
        public const byte vbKeyF4 = 0x73 ;   //F4 键
        public const byte vbKeyF5 = 0x74 ;   //F5 键
        public const byte vbKeyF6 = 0x75 ;   //F6 键
        public const byte vbKeyF7 = 0x76 ;   //F7 键
        public const byte vbKeyF8 = 0x77 ;   //F8 键
        public const byte vbKeyF9 = 0x78 ;   //F9 键
        public const byte vbKeyF10 = 0x79 ;  //F10 键
        public const byte vbKeyF11 = 0x7A ;  //F11 键
        public const byte vbKeyF12 = 0x7B ;  //F12 键

        #endregion

到了这里,关于关于使用C#调用Win32API,抓取第三方句柄,模拟鼠标点击,键盘发送事件(C2Prog.exe)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层, 是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。 通过在接口上声明注解的方式配置HTTP请求接口。 官网: Forest   代码地址: forest: 声明式HTTP客户端API框架,让

    2024年02月04日
    浏览(100)
  • c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于C#如何调用Python,网上提供了很多解决方案,有用ironPython的,也有把python代码打包成exe的,还有通过process类调用python的,但这些方案或多或少都有一些缺陷,比如ironPython无法调用第三方库,打包成

    2024年02月05日
    浏览(28)
  • 如何使用第三方API采集电商数据呢?

    电商商家最常唠叨的就是店铺运营难做。每日多平台店铺数据统计汇总繁琐耗时,人工效率偏低,且工作内容有限。 特别是眼下“618,双十一,双十二,年底大促”将至,如何提高运营的效率和质量、保证产品及服务的良性运作,是电商企业急需解决的难题。 01 数据,电商

    2024年02月20日
    浏览(44)
  • C#使用第三方库ExcelDataReader读取excel数据并呈现

    之前有使用Oledb读取Excel的代码:C#读取excel数据并呈现 使用这种方式读取存在需要安装数据库引擎的隐患(如需要自取)

    2024年02月13日
    浏览(32)
  • 万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求

    业务场景 :在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流; 下面这个例子就包含日常开发中大

    2024年02月05日
    浏览(49)
  • Vue中如何使用Ajax请求是通过第三方库axios或者原生的fetch API来实现的

    在Vue中使用Ajax请求通常是通过第三方库,比如axios或者原生的fetch API来实现的。这里我将为你展示如何使用axios库在Vue中进行Ajax请求。 首先,你需要安装axios库。你可以通过npm或者yarn来安装: 使用npm: bash     复制 npm install axios 或者使用yarn: bash 复制 yarn add axios 安装完成后

    2024年04月13日
    浏览(37)
  • ESP32工程中CMake使用及加入第三方SDK库文件

            本文中使用的是乐鑫官方推出的 ESP-IDF v5.1 对 ESP32S3 设备开发,并非是Arduino、Micro-python等第三方工具开发。在ESP-IDF框架中,乐鑫官方已经将 CMake 和 Ninja 编译构建工具 集成到了ESP-IDF中。         ESP-IDF 即乐鑫物联网开发框架,可为在 Windows、Linux 和 macOS 系统平台

    2024年02月20日
    浏览(32)
  • 【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年04月12日
    浏览(37)
  • AndroidStudio调用第三方so库

    背景         最近公司设备换了新的触摸屏(为I2C接口),该触摸屏有个app,app中可以显示触摸屏固件的版本。我需要做的是在自己的app中读取到触摸屏固件版本。         反编译了apk,得到了源码,发现对方app是通过jni调用so库的方式获取到的触摸屏固件版本。所以

    2024年04月26日
    浏览(28)
  • 我调用第三方接口遇到的13大坑

    在实际工作中,我们经常需要在项目中调用第三方API接口,获取数据,或者上报数据,进行数据交换和通信。 那么,调用第三方API接口会遇到哪些问题?如何解决这些问题呢? 这篇文章就跟大家一起聊聊第三方API接口的话题,希望对你会有所帮助。   一般我们在第一次对接

    2023年04月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包