文章目录
一、幽灵键鼠:
1.概述
幽灵键鼠是一款硬件键鼠,通过编写脚本指令而模拟人工操作的一款硬件
幽灵键鼠分为两个型号KM系列和SR系列,两大系列的不同在与KM系列是只能在前台运行,而SR系列是KM系列的升级版,是可以把纯键盘鼠标按键放入硬件里的,下面我开始介绍两者是如何使用的。
-
KM系列简介
Km系列现在主打的产品是KM03.04它低廉的价格和优异的性能也得到了大家的信赖。
Km系列
我们提供COM和DLL两种形式的SDK,支持32位和64位开发、运行环境,可供所有主流开发工具调用。
我们提供按键精灵、易语言、TC、C#、Python、VB、VC、Delphi等常开发工具调用SDK的同时我们也提供DEMO程序
提供专用的 [幽灵键鼠集成开发环境 kmlIDE],支持脚本编写、运行、编译,供用户免费使用。(注:因涉及复杂运算km系列是有进程的)
-
SR系列
SR系列有两种模式可以使用
直接使用SRIDE编辑器(注:纯键盘鼠标按键可直接写入硬件无进程),KMLIDE模式(涉及找图找色等复杂运算,有进程)
-
KM系列和SR系列是如何使用的。
首先把购买的硬件插入电脑的USB接口
插入之后,硬件会亮起绿灯这说明它现在是正常的,而硬件插入之后在我的电脑是不显示U盘形式(注:我们的产品是一款无实体按键的键盘鼠标,所以,在我的电脑里不是U盘形式出现的),需要打开任务管理器才能看到,右键单击我的电脑,或者我的计算机打开设备管理找到键盘和鼠标选项。
插入前看到,现在键盘和鼠标里只会出现一套鼠标键盘。
插入后产品已经默认为另外一套键盘鼠标了,现在大家都可以开始操作了。SR系列和KM系列的插入方式是一样的,这里目前是我电脑使用的幽灵键鼠版本。
2.幽灵键鼠硬件检测
①硬件检测程序
- 打开如下程序,能够识别插入后的幽灵键鼠的【产品信息】,【硬件信息】,【支持的功能】
- 我这边购买的幽灵键鼠只支持【键盘,鼠标】,这两个算是最常用的功能点了。其他的根据自身业务功能情况去购买时找商家了解清楚即可。
3.幽灵键鼠开发文档
①幽灵键鼠支持如下技术,需要能访问COM组件
②功能特点
③开发接口
-
设备函数
-
时钟函数
-
加密锁函数
-
键盘函数
-
鼠标函数
-
KM21专用函数
-
辅助函数
二、自定义-幽灵键鼠
1. C#封装的exe程序
①使用cmd或者Powershell调用封装程序
- 调用模拟按键输入,输入一个方法名和一个参数,如果提示如下异常内容,表示当前运行设备(电脑)未和幽灵键鼠硬件连接,建议使用检测工具检测是否连接
-
如果设备已连接,再次执行刚才的命令
-
如果调用的方法要传入多个参数,用英文逗号隔开
-
调用参数描述说明
封装程序.exe的绝对路径 方法名 输入参数(单个或多个;多个用,隔开)
②模拟按键输入
/*
* 模拟按键输入(只支持英文,数字,特殊符号,自动识别大小写)
* 传入参数类型:字符串(String):待模拟人工输入的字符串
* 返回结果类型:整型数
* 大于0:成功,返回输入的字符串字节数,例如1代表2个字节,即是返回2
* 0:失败
*/
public static extern int SimulationPressKey(String Keys);
③模拟人工鼠标移动
/* 模拟鼠标移动(单纯移动鼠标,不对鼠标的按键进行操作)
* 传入参数类型:1.数字整型(int):X:整型数,屏幕的水平坐标 2.数字整型(int):Y:整型数,屏幕的垂直坐标
* 返回结果类型:布尔值(Boolean)
* 整型数:大于0:成功 ;0:失败
*/
public static extern int Simulation_Move(int X,int Y);
③模拟滑动鼠标移动
/* 模拟鼠标移动(左键按下后移动,适用于滑动验证码处理)
* 传入参数类型:1.数字整型(int):X:整型数,屏幕的水平坐标 2.数字整型(int):Y:整型数,屏幕的垂直坐标
* 返回结果类型:布尔值(Boolean)
* 整型数:大于0:成功 ;0:失败
*/
public static extern int Move_To(int X,int Y);
④ 鼠标滚轮滚动
/* 鼠标滚轮滚动
* 传入参数类型:数字整型(int):Count 滚动次数:Count:整型数,移动次数,范围-127至127,正数向上移动,负数向下移动
* 返回结果类型: 整型数->1:成功 ; 0:失败
*/
public static extern int Wheels_Move(int Count)
⑤单键按下
/*
* 单键按下
* 键盘单个键按下,键码表请参考USB键盘
* 传入参数类型:字符串,按下的键名
* 返回结果类型:整型数
* 1:成功
0:失败
*/
public static extern int KeyDown(String Key);
⑥单击弹起
/*
* 单键弹起
* 键盘键弹起,键码表请参考USB键盘
* 传入参数类型:字符串,弹起的键名
* 返回结果类型:整型数
* 1:成功
0:失败
*/
public static extern int KeyUp(String Key);
⑦所有键弹起
/* 所有键盘按键弹起,在复杂的代码中容易忘记哪些键已经按下,该函数可将所有按键都弹起
* 传入参数类型:无
* 返回结果类型:整型数; 1:成功; 0:失败
*/
public static extern int KeyUpAll();
⑧获取键盘大写灯状态
/* 获取键盘大定灯状态
* 无需输入参数
* 返回结果类型:整型数
* 1:CapsLock灯熄灭
* 2:CapsLock灯亮
* 0:失败
*/
public static extern int GetCapsLock();
⑨鼠标左键按下
/*
* 鼠标左键按下
* 传入参数类型:无
* 返回结果类型:整型数
* 1:成功
* 0:失败
*/
public static extern int LeftDown();
⑩鼠标左键弹起
/*
* 鼠标左键弹起
* 传入参数类型:无
* 返回结果类型:整型数
* 1:成功
* 0:失败
*/
public static extern int LeftUp();
2.注意
①需要把COM组件程序集(kmllib.dll)存放到C盘根目录下能调用封装exe程序
三、幽灵键鼠资源下载
1.工具资源网盘下载:
工具资源网盘下载
提取码: mty9
因为有人提到是否能够提供源码,非常抱歉之前忙于其他的疏忽了,代码如下;C#语言编写,仅供参考哈。感谢大家支持。
想扩展功能参考网盘链接的开发文档哈。
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace InvokeMouceKey
{
public class MouseEventFlag
{
/*
初始化设备
* 打开设备,有多个设备时默认打开第一个。使用我们的脚本开发工具时不需调用该接口,kmlIDE会自动管理设备连接。
* 传入参数类型:无
* 返回结果类型:整型数
* 1:成功
* 0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern bool OpenDevice();
/*
关闭设备
* 检查设备是否连接,设备拔出后再次插入会自动连接
* 传入参数类型:无
* 返回结果类型:整型数
* 1:连接
* 0:未连接
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern bool CloseDevice();
/*
* 模拟按键输入(只支持英文,特殊符号,自动识别大小写)
* 传入参数类型:字符串(String):待模拟人工输入的字符串
* 返回结果类型:整型数
* 大于0:成功,返回输入的字符串字节数,例如1代表2个字节,即是返回2
* 0:失败
*/
[DllImport("C:\\kmllib.dll")]
public static extern int SimulationPressKey(String Keys);
/*
模拟人工鼠标移动
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int SimulationMove(int X, int Y);
/* 获取键盘大定灯状态
* 无需输入参数
* 返回结果类型:整型数
* 1:CapsLock灯熄灭
* 2:CapsLock灯亮
* 0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int GetCapsLock();
/*
鼠标滚轮滚动
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int WheelsMove(int Count);
/* 检查设备是否连接,设备拔出后再次插入会自动连接
* 传入参数类型:无
* 返回结果类型: 整数型:1:连接; 不为1:未连接
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int CheckDevice();
/*
一次组合按键
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int CombinationKeyPress(String key1, String key2, String key3, String key4, String key5, String key6,int count);
/* 所有键盘按键弹起,在复杂的代码中容易忘记哪些键已经按下,该函数可将所有按键都弹起
* 传入参数类型:无
* 返回结果类型:整型数; 1:成功; 0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int KeyUpAll();
/*
* 组合键按下
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int CombinationKeyDown(String key1, String key2, String key3, String key4, String key5, String key6);
/*
* 组合键弹起
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int CombinationKeyUp(String key1, String key2, String key3, String key4, String key5, String key6);
/*
* 鼠标左键按下
* 传入参数类型:无
* 返回结果类型:整型数
* 1:成功
* 0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int LeftDown();
/*
* 鼠标左键弹起
* 传入参数类型:无
* 返回结果类型:整型数
* 1:成功
* 0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int LeftUp();
/*
* 单键按下
* 键盘单个键按下,键码表请参考USB键盘
* 传入参数类型:字符串,按下的键名
* 返回结果类型:整型数
* 1:成功
0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int KeyDown(String Key);
/*
* 鼠标左键单击
* 键盘键弹起,键码表请参考USB键盘
* 传入参数类型:字符串,弹起的键名
* 返回结果类型:整型数
* 1:成功
0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int KeyUp(String Key);
/*
* 单键弹起
* 传入参数类型:Count:整型数,单击次数
* 返回结果类型:整型数
* 大于0:成功
0:失败
*/
[DllImport("C:\\kmllib.dll", CharSet = CharSet.Auto)]
public static extern int LeftClick(int Count);
//自定义方法入口
/* 鼠标滚轮滚动
* 传入参数类型:数字整型(int):Count 滚动次数:Count:整型数,移动次数,范围-127至127,正数向上移动,负数向下移动
* 返回结果类型: 整型数->1:成功 ; 0:失败
*/
public static int Wheels_Move(String Keys)
{
//滚动次数
int Count = Convert.ToInt32(Keys);
return WheelsMove(Count);
}
/* 模拟鼠标移动(单纯移动鼠标,不对鼠标的按键进行操作)
* 传入参数类型:1.数字整型(int):X:整型数,屏幕的水平坐标 2.数字整型(int):Y:整型数,屏幕的垂直坐标
* 返回结果类型:布尔值(Boolean)
* 整型数:大于0:成功 ;0:失败
*/
public static int Simulation_Move(String Keys)
{
//横坐标
int X = Convert.ToInt32(Keys.Split(',')[0]);
//纵坐标
int Y = Convert.ToInt32(Keys.Split(',')[1]);
return SimulationMove(X, Y);
}
/* 模拟鼠标移动(左键按下后移动,适用于滑动验证码处理)
* 传入参数类型:1.数字整型(int):X:整型数,屏幕的水平坐标 2.数字整型(int):Y:整型数,屏幕的垂直坐标
* 返回结果类型:布尔值(Boolean)
* 整型数:大于0:成功 ;0:失败
*/
public static int Move_To(String Keys)
{
//鼠标左键按下
LeftDown();
//横坐标
int X = Convert.ToInt32(Keys.Split(',')[0]);
//纵坐标
int Y = Convert.ToInt32(Keys.Split(',')[1]);
//移动鼠标
int i =SimulationMove(X, Y);
//鼠标左键松开
LeftUp();
return i;
}
/* 一次组合按键
* 传入参数类型:整型数,字符串,按下的字符键名1;字符串,按下的字符键名2
* 返回结果类型:整型数; 1:成功; 0:失败
*
*/
public static int CombinationKey_Press(String Keys)
{
var status = CombinationKeyPress(Keys.Split(',')[1], "", "", Keys.Split(',')[0], "", "",1);
return status;
}
/* 键盘组合键按下
* 传入参数类型:整型数,字符串,按下的字符键名1;字符串,按下的字符键名2
* 返回结果类型:整型数; 1:成功; 0:失败
*
*/
public static int CombinationKey_Down(String Keys)
{
var status = CombinationKeyDown(Keys.Split(',')[1],"", "", Keys.Split(',')[0], "", "");
KeyUpAll();
return status;
}
/* 键盘组合键弹起
* 传入参数类型:整型数,字符串,按下的字符键名1;字符串,按下的字符键名2
* 返回结果类型:整型数; 1:成功; 0:失败
*
*/
public static int CombinationKey_Up(String Keys)
{
return CombinationKeyUp(Keys.Split(',')[0], Keys.Split(',')[1], "", "", "", "");
}
/**
* MoveClickMouseAndInputKey 方法名
* 特殊情况ukey:内置【模拟人工移动鼠标】+【鼠标点击】+【模拟按键输入】
* [Simulation_Move(keys)]+[LeftClick(1)]+SimulationPressKey(keys)
* 参数输入介绍: x坐标,y坐标,要输入的字符串内容
* 100,200,验证ukey密码框输入
*/
public static int MoveClickMouseAndInputKey(String Keys) {
//模拟人工移动鼠标
//横坐标
int X = Convert.ToInt32(Keys.Split(',')[0]);
//纵坐标
int Y = Convert.ToInt32(Keys.Split(',')[1]);
SimulationMove(X, Y);
//鼠标点击
LeftClick(1);
//模拟输入
return SimulationPressKey(Keys.Split(',')[2]);
}
//主方法入口
static void Main(String[] args)
{
try
{
Type t = typeof(MouseEventFlag);//参数为所要使用的函数所在的类的类名。
MethodInfo mt = t.GetMethod(args[0]);
Object successfulObj = false;
if (CheckDevice() == 1)
{
Console.WriteLine("幽灵键鼠设备已连接!");
}
else if (OpenDevice() != true)
{
throw new Exception("设备未连接,请插入符合要求的幽灵键鼠硬件!!");
}
if (mt == null)
{
throw new Exception($"没有获取到相应的【{args[0]}】函数!!");
}
else
{
if (args.Length >1)
{
String Keys = "";
for (int i = 1; i < args.Length; i++)
{
if (i == 1)
{
Keys +=args[i];
}
else {
Keys += " " + args[i];
}
}
successfulObj = mt.Invoke(null, new object[] { Keys });
}
else
{
successfulObj = mt.Invoke(null, null);
}
}
Console.WriteLine(successfulObj.ToString());
}
catch (Exception e)
{
Console.WriteLine($"异常内容为:{e.Message};{e.InnerException};{e.StackTrace};时间为:{DateTime.Now}\n");
}
}
}
}