Python驱动级按键-pywin32的使用_python驱动级按键防封号-程序员宅基地

技术标签: Python  

实践证明 pyinput会被游戏屏蔽

winio只适合PS/2 圆口键盘

下面使用

参考:https://mp.weixin.qq.com/s/WXf5JVyyFZqp-DYlGigL-g

win32api:

准备:安装好pywin32,pip insatall pywin32

然后使用时

import win32api

import win32con   #导入这两个模块

import time  #导入时间模块要有中断时间

import ctypes

def keydownup(num):
    MapVirtualKey = ctypes.windll.user32.MapVirtualKeyA
    time.sleep(0.4)
    win32api.keybd_event(num, MapVirtualKey(num, 0), 0, 0)
    time.sleep(0.2)
    win32api.keybd_event(num, MapVirtualKey(num, 0), win32con.KEYEVENTF_KEYUP, 0)

 

其中MapVirtualkey是扫描码,一般不使用这个,如果要制作控制游戏人物的脚本时一定要填入扫描码才能在游戏中实现硬件级键盘模拟。

方法很简单

win32api.keybd_event(虚拟码,扫描码,0,0)

第一个参数是虚拟码有一些是不太一样的,需要自己根据自己的电脑测出相关的虚拟码,其中一些虚拟码,

left_arrow = 0x61
up_arrow = 0x65
right_arrow = 0x63
down_arrow = 0x62
a = 0x41
d = 0x44
x = 0x58

 

第二个参数是扫描码,如果一个一个去寻找扫描码会很麻烦,可以像我那样,在方法开始处或者程序起始处添加这么一句

MapVirtualKey = ctypes.windll.user32.MapVirtualKeyA

然后就可以传入虚拟码来寻找相应的扫描码

 

第三个是参数是作为判断按下与抬起的标识,按下时为0即可,因为键盘的全过程是按下与抬起,所有两个keybd_event才是一个完整的过程,其中一定要给其中添加一个时间暂停的,不然还是无法使用,即使在操作台或者pycharm上可以输入,在游戏中便没有效果了,时间自己可以传参数进去,也可以规定一个固定的值,这个时间便是你按住的时间

 

第四个参数直接为0即可

 

最重要的一点,如果要在游戏中使用,一定要以管理员的权限运行脚本,这样才可以使用。

参考自:https://blog.csdn.net/qq_33371343/article/details/78916751

一、pywin32常用函数
(1)获取鼠标位置
win32api.GetCursorPos()

(2)鼠标左键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

(3)鼠标左键放开
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

(4)鼠标右键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

(5)鼠标右键放开
 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

(6)设置鼠标位置
win32api.SetCursorPos((x, y))

(7)键盘输入事件
win32api.keybd_event(VK_CODE[word], 0, 0, 0)
win32api.keybd_event(VK_CODE[word], 0, win32con.KEYEVENTF_KEYUP, 0)

二、封装接口
(1)获取当前鼠标位置
def cursor_point(self):
    """
     获取当前鼠标位置
    """
    pos = win32api.GetCursorPos()
    return int(pos[0]), int(pos[1])

(2)鼠标左击事件
def mouse_left_click(self, new_x=None, new_y=None, times=1):
    """
    鼠标左击事件
    :param new_x: 新移动的坐标x轴坐标
    :param new_y: 新移动的坐标y轴坐标1506240215
    :param times: 点击次数
    """
    self.mouse_move(new_x, new_y)
    time.sleep(0.05)
    while times:
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        times -= 1

(3)鼠标右击事件
    def mouse_right_click(self, new_x=None, new_y=None):
        """
        鼠标右击事件
        :param new_x: 新移动的坐标x轴坐标
        :param new_y: 新移动的坐标y轴坐标
        """
        self.mouse_move(new_x, new_y)
        time.sleep(0.05)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

(4)移动鼠标位置
def mouse_move(self, new_x, new_y):
    if new_y is not None and new_x is not None:
        point = (new_x, new_y)
        win32api.SetCursorPos(point)
        self.x = new_x
        self.y = new_y

(5)键盘输入文本
def key_input(self, input_words=''):
    for word in input_words:
        win32api.keybd_event(VK_CODE[word], 0, 0, 0)
        win32api.keybd_event(VK_CODE[word], 0, win32con.KEYEVENTF_KEYUP, 0)
        time.sleep(0.1)

(6)键盘输入事件
def key_even(self, input_key):
    win32api.keybd_event(VK_CODE[input_key], 0, 0, 0)
    win32api.keybd_event(VK_CODE[input_key], 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(1)
 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lbh199466/article/details/88817398

智能推荐

Adapte抽取操作-程序员宅基地

文章浏览阅读153次。首先先写一个类继承一个baseAdapte类这是一个抽象类 public abstract class MyBaseAdapter3<T> extends BaseAdapter { public List<T> list; //通过构造方法获取集合数..._adapter客户端定时抽取

SAP BW DSO与InfoCube比较-程序员宅基地

文章浏览阅读4k次。SAP BW DSO与InfoCube比较:

计算机复试问题_计算机复试问项目细节-程序员宅基地

文章浏览阅读76次。英语部分自我介绍为什么喜欢长跑,介绍一下长跑的经历介绍一下STITP项目实现的细节雅思考试各个模块得到的分数抽题部分不记得了,反正不会答,貌似是隐式模式什么的专业课部分快速傅立叶变换的原理,用算法实现它所需要的复杂度简诉实现快速傅立叶变换最小时间复杂度算法的原理利用深度学习对图片进行去雨,判断去雨效果所使用的指标自己在学习编程过程中遇到困难,如何去解决计算机网络的结构层次,传输层所使用的协议TCP协议可靠传输的原理,如何进行无差错传输UDP协议_计算机复试问项目细节

数据结构(一)线性结构(1)顺序表_判断顺序表是否为空-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏6次。线性表是最基本、最常用的数据结构,大部分线性表中数据元素之间的关系是一对一的关系,除了首尾元素,其它元素都是首尾相连的其表示方法主要有顺序表示(顺序表)以及链式表示(链表),在本节介绍顺序表的一些操作实现顺序表至少包含一个用于存储数据的数组和一个表示数据个数的变量,因此顺序表可定义为:typedef struct { int aiArray[ARRAY_SIZE]; i..._判断顺序表是否为空

【robotframework之一】搭建robotframework的环境-程序员宅基地

文章浏览阅读436次。1、下载Python并安装在环境变量path中加上:C:\Python27 和 C:\Python27\Scripts2、查看Python是否安装成功执行Python3、执行:pip install robotframework4、验证是否安装成功:pybot --version5、执行:pip install robotframework-sel...

react生命周期的基本用法-程序员宅基地

文章浏览阅读1.8k次。转载于:https://www.jianshu.com/p/c9bc994933d5首先,看一下一个组件的构造import React,{ Component } from 'react';class Demo extends Component { constructor(props,context) { super(props,context) ...

随便推点

自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机_58nlp-程序员宅基地

文章浏览阅读1.9k次。自然语言处理技术(NLP)在推荐系统中的应用原2017.06.29人工智能头条作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机器学习,也做过计算广告、反作弊等相关工作,并热衷于探索大数据和机器学习技术在其他领域的应用实践。 责编:何永灿([email protected]) 本文为《程序员》原创文_58nlp

golang strings包整理-程序员宅基地

文章浏览阅读1.3k次。所有语言都有字符串处理的包,今天整理下golang的strings包 完整的介绍doc上有golang strings docContains, ContainsAny, ContainsRune ContainsRune(s,p)用于查找unicode编码为p的unicode是否在s里面 ContainsAny(s,p)只要满足p中的1个unicode字符在s中即可,Contains需...

堡垒机Jumpserver的源码部署教程_jumpserver 源码-程序员宅基地

文章浏览阅读2.9k次。使用Jumpserver源码部署堡垒机,前后端分离,文章中的nginx配置文件是针对的构建方式,所以在编译时lina和luna使用构建方式,不用运行前端服务。_jumpserver 源码

oracle配置jdk版本,升级oracle中的JDK版本-程序员宅基地

文章浏览阅读1.2k次。Oracle自8i起就全面支持java,但各个版本的oracle中默认jdk版本均不相同,oracle8i中为jdk1.2,oracle9i中为jdk1.3,oracle10g中为jdk1.4~~至笔者行为之际,当前的最新版本为jdk1.5 update 11.因笔者java开发出身,在做oracle开发中经常会用java来扩展oracle功能,但是由于oracle自带jdk版本过低,可能会造成一..._oracle安装好后可以重新安装jdk吗

浅谈:winform界面设计-程序员宅基地

文章浏览阅读3.6w次,点赞19次,收藏41次。winform客户端设计_winform界面设计

不使用spring的aop功能实现日志输出_不用aop做日志-程序员宅基地

文章浏览阅读914次。第一种:public class TimeBook { private Logger logger = Logger.getLogger(this.getClass().getName()); //审核数据的相关程序 public void doAuditing(String name){ logger.log(Level.INFO, name + "开始审核数据..."_不用aop做日志