C#模拟鼠标、键盘操作
C语言 在程序中打开网页,模拟鼠标点击、键盘输入
一、简述
记--使用C语言 打开指定网页,并模拟鼠标点击、键盘输入。实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码,或有检测"非人为"操作,以防止恶意注册、登录)。
例子打包:链接: https://pan.baidu.com/s/1eStV0lAcmr8kmEA0n3LRcg 提取码: 7kvj
二、效果 (程序填写账号密码,实现半自动登录)

三、工程结构

四、源文件
main.c文件
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h> //ShellExecuteA() //打开某个网址:website (使用默认浏览器)
void open_web(char *website)
{
ShellExecuteA(,"open", website,,,);
} //模拟鼠标点击 (x,y)是要点击的位置
void click(int x, int y)
{
//将鼠标光标移动到 指定的位置 例子中屏幕分辨率1600x900 在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*/, y*/, , ); Sleep();//稍微延时50ms
mouse_event(MOUSEEVENTF_LEFTDOWN,,,,);//鼠标左键按下
mouse_event(MOUSEEVENTF_LEFTUP,,,,);//鼠标左键抬起
} //模拟键盘输入 keybd_event(要按下的字符,0,动作,0);动作为0是按下,动作为2是抬起
void input()
{
char user[]="";//账号
char pwd[]="";//密码 click(,); //点击"用户名输入框"的位置 int i;
//输入账号
for(i=;i<sizeof(user);i++)
{
keybd_event(user[i],,,);
keybd_event(user[i],,,);
Sleep();
} //tab键 对应的编号是0x09 让密码输入框 获取焦点
keybd_event(0x09,,,);//按下
keybd_event(0x09,,,); //松开
Sleep(); //输入密码
for(i=;i<sizeof(pwd);i++)
{
keybd_event(pwd[i],,,);
keybd_event(pwd[i],,,);
Sleep();
} //模拟按下tab键 让登录按钮获取焦点
click(,);//点击"登录按钮"
Sleep();
} //将chrome.exe进程杀掉,在例子中尚未使用
void close()
{
system("taskkill /f /im chrome.exe");
} int main(int argc,char *argv[])
{
open_web("https://www.baidu.com/");//打开某个网址
Sleep();//延时4秒,等待网页打开完毕,再进行其它操作。根据实际情况(浏览器打开速度,网速)
click(, );//点击"登录"(1454,126)
Sleep();
click(,);//点击"用户名登录"
Sleep();
input();//模拟鼠标动作,键盘输入
return ;
}
五、总结
5.1 ShellExecute()函数
| 功能 | 对指定的文件执行操作。(可以实现调用第三方程序) | |
| 头文件 | Windows.h | |
| 原型 | HINSTANCE ShellExecuteA( HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd ); | |
| 参数 | hwnd | 父窗口的句柄。如果操作与窗口不关联,则此值可以为空 |
| lpOperation |
指定要执行的操作(谓词) edit:启动编辑器并打开文档进行编辑。要打开的文档文件由lpFile指定 explore:浏览由参数lpFile指定的文件夹 find:搜索由参数lpDirectory指定的目录 open:打开lpFile参数指定的项。可以是文件或文件夹,或者是网页。 print:打印由lpFile指定的文件。 NULL:默认操作。如果没有,则使用“open”动词。如果“open”不可用,系统将使用注册表中列出的第一个谓词。 |
|
| lpFile | 操作对象(文件等。。。) | |
| lpParameters | 如果lpFile指定可执行文件,则此参数是指向以-结束的字符串的指针,该字符串指定要传递给应用程序的参数。此字符串的格式由要调用的谓词决定。如果lpFile指定文档文件,则lpParameters应为空。 | |
| lpDirectory | 指定操作的默认(工作)目录。如果此值为NULL,则使用当前工作目录。 | |
| nShowCmd |
指定打开应用程序时如何显示的标志。如果lpFile指定文档文件,则只需将标志传递给关联的应用程序。应该由应用程序来决定如何处理它。这些值是定义的。 SW_HIDE:隐藏 SW_MAXIMIZE :最大化 SW_MINIMIZE :最小化 。。。 |
|
| 返回值 | 如果函数成功,则返回大于32的值。如果函数失败,它将返回一个错误值 | |
| 备注 |
更多详见:https://docs.microsoft.com/en-us/windows/desktop/api/Shellapi/nf-shellapi-shellexecutea
|
|
打开指定网页:
ShellExecute(, "open", "https://www.baidu.com/",, , );//最后的参数是控制最大化、最小化,隐藏
打开某个可执行文件:
#include <stdio.h>
#include <windows.h> //ShellExecute() int main(int argc, char *argv[])
{
ShellExecute(, "open", "C:\\Users\\newuser\\Desktop\\串口助手.exe",, , );//最后的参数是控制最大化、最小化
printf("Hello World!\n");
return ;
}

5.2 mouse_event()函数
| 功能 | 合成鼠标运动和按钮单击。(模拟鼠标动作) | ||
| 头文件 | Windows.h | ||
| 原型 | void mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo ); |
||
| 参数 | dwFlags |
控制鼠标运动和按钮点击的各个方面(鼠标动作类型) MOUSEEVENTF_LEFTDOWN:鼠标左键按下 MOUSEEVENTF_LEFTUP:鼠标左键抬起 MOUSEEVENTF_RIGHTDOWN:鼠标右键按下 MOUSEEVENTF_RIGHTUP:鼠标右键抬起 MOUSEEVENTF_WHEEL:鼠标滚轮,数值由参数dwData指定 MOUSEEVENTF_ABSOLUTE:鼠标光标位置,由参数dx,dy指定。 |
|
| dx | x坐标 | ||
| dy | y坐标 | ||
| dwData | 滚轮滚动值 | ||
| dwExtraInfo | 与鼠标事件关联的附加值。调用GetMessageExtraInfo()以获取此额外信息 | ||
| 返回值 | 无返回值 | ||
| 备注 |
详见:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-mouse_event
|
||
示例一:将鼠标移动到指定(绝对)位置(x,y)
//例子中屏幕分辨率1600x900 在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*/, y*/, , );
示例二:按下鼠标左键,然后抬起
mouse_event(MOUSEEVENTF_LEFTDOWN,,,,);//鼠标左键按下
mouse_event(MOUSEEVENTF_LEFTUP,,,,);//鼠标左键抬起
5.3 keybd_event()函数
| 功能 | 合成击键。(模拟键盘输入) | ||
| 头文件 | Windows.h | ||
| 原型 | void keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo ); | ||
| 参数 | bVk | 虚拟按键代码编号 | |
| bScan | 按键的的硬件扫描代码 | ||
| dwFlags |
控制功能操作的各个方面 KEYEVENTF_EXTENDEDKEY:如果指定,扫描代码前面有一个前缀字节,其值为0xE0 KEYEVENTF_KEYUP:如果指定,则抬起按键。 |
||
| dwExtraInfo | 按键动作的附加信息 | ||
| 返回值 | 无返回值 | ||
| 备注 |
详见:https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-keybd_event
|
||
示例三:模拟按下数字按键"9": (‘9’的和0x39都表示数字按键9)
keybd_event('',,,);//按下按键 ‘9’
keybd_event('',,,);//抬起按键 ‘9’
或 0x39
keybd_event(0x39,,,);//按下按键 ‘9’
keybd_event(0x39,,,);//抬起按键 ‘9’
虚拟按键 代码列表:https://docs.microsoft.com/zh-cn/windows/desktop/inputdev/virtual-key-codes
出处:https://blog.csdn.net/nanfeibuyi/article/details/85119726
C#模拟鼠标、键盘操作的更多相关文章
- 将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作
CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...
- selenium webdriver(4)---模拟鼠标键盘操作
webdriver提供Actions来模拟鼠标悬浮.拖拽和键盘输入等操作,详细代码见org.openqa.selenium.interactions.Actions.本文通过几个实例来说明Action ...
- python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为
0.关键实现:程序窗口前置 python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过pyauto实现右键菜单和另存为操作 1.参考 aut ...
- Java+selenium之WebDriver模拟鼠标键盘操作(六)
org.openqa.selenium.interactions.Actions类,主要定义了一些模拟用户的鼠标mouse,键盘keyboard操作.对于这些操作,使用 perform()方法进行执行 ...
- selenium webdriver模拟鼠标键盘操作
在测试使用Selenium webdriver测试WEB系统的时候,用到了模拟鼠标.键盘的一些输入操作. 1.鼠标的左键点击.双击.拖拽.右键点击等: 2.键盘的回车.回退.空格.ctrl.alt.s ...
- selenuim2模拟鼠标键盘操作
有时候有些元素不便点击或者做其他的操作,这个时候可以借助selenium提供的Actions类,它可以模拟鼠标和键盘的一些操作,比如点击鼠标右键,左键,移动鼠标等操作.对于这些操作,使用perform ...
- selenium模拟鼠标键盘操作
简单操作: 1.点击(鼠标左键)页面按钮:click() 2.清空输入框:clear() 3.输入字符串:send_keys()submit提交表单: 1.一般情况可以点击搜索按钮来搜索 2.也可以用 ...
- selenium webdriver从安装到使用(python语言),显示等待和隐性等待用法,切换窗口或者frame,弹框处理,下拉菜单处理,模拟鼠标键盘操作等
selenium的用法 selenium2.0主要包含selenium IDE 和selenium webDriver,IDE有点类似QTP和LoadRunner的录制功能,就是firefox浏览器的 ...
- Delphi下利用WinIo模拟鼠标键盘详解 有参考价值
https://blog.csdn.net/fgrass_163/article/details/6365296 Delphi下利用WinIo模拟鼠标键盘详解 2011年04月26日 21:03:00 ...
- C#模拟鼠标键盘控制其他窗口(一)
编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的执行,开发 ...
随机推荐
- IIS指定站点网卡IP进行网络部署
服务器一般有多块网卡,有时候每块网卡会绑定不同的公网ip,也就是一个机器可以有多个公网ip,那IIS部署时可以选择此项目使用那个IP部署.(当然,一块网卡也可以绑定多个IP) 编辑绑定-编辑-IP地址 ...
- python中判断对象类型的函数——isinstance
isinstance是Python中的一个内建函数.是用来判断一个对象的变量类型. isinstance(object, class-or-type-or-tuple) 如果参数object是clas ...
- [转帖][区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得
[区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得 置顶 2017-03-12 18:31:19 乐扣老师lekkoliu 阅读数 127953 收藏 更多 分类专栏: 技术管理 区 ...
- 抽象工厂(AbstractFactory)模式
抽象工厂模式又称工具箱模式.其实抽象工厂模式可以简单的理解为一个工厂生成一个产品族的产品. 抽象工厂模式可以向客户端提供一个接口,使得客户端在不指定产品的具体类型的情况下,创建多个产品族中的产品对象. ...
- JAVA–利用Filter和session防止页面重复提交
JAVA–利用Filter和session防止页面重复提交解决思路:1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.2 表单响应到浏览 ...
- Spring-AOP切面编程(3)
https://www.jianshu.com/p/be69b874a2a9 目录 1. Web MVC发展史历程2.Spring概要3.Spring-依赖注入概要(IOC)4.属性注入的三种实现方式 ...
- CSP J/S 2019受虐记
一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...
- 2019-07-24 require 和 include的区别
require 和 include 都是文件引入的常用用法.那他们有什么区别吗? 首先我们创建一个需要引入的文件叫做test.php,里面写上简单的一行代码: echo "我是要被引入的文件 ...
- ASPxComboBox默认情况下不显示代码和名称,特别头疼,直到发现了关键
1.ASPxComboBox 默认不开启 AutoPostBack: 既是开启,总显示第一行(好像是个bug) 2.只好ajax,但是默认情况下不显示代码和名称,特别头疼,直到发现了关键 <dx ...
- 【转载】C#中List集合使用Max()方法查找到最大值
在C#的List集合操作中,有时候需要查找到List集合中的最大值,此时可以使用List集合的扩展方法Max方法,Max方法有2种形式,一种是不带任何参数的形式,适用于一些值类型变量的List集合,另 ...


