国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠

這篇具有很好參考價值的文章主要介紹了[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠

  • 最近在玩搬磚游戲晶核, 每天有很多重復繁瑣的"打卡"操作, 得知隔壁御三家游戲就有大佬做了自動收割的輔助工具,我就想模仿寫一個.
  • 不過大佬們寫的開源工具厲害得多,加了神經網絡自動識別,實現(xiàn)尋路和點擊功能.我目前最多就是實現(xiàn)一個簡單連點器加色塊識別而已,而且這種原始手動的方法很不方便,我原本還想著寫個表格導入操作功能.最后也不了了之了.太懶了.
  1. << Python調用羅技驅動實現(xiàn)功能 >> https://www.python100.com/html/1S27NYQO8H34.html
  2. << FPS游戲自動槍械識別+壓槍(以PUBG為例) >> https://blog.csdn.net/weixin_37827742/article/details/124242964
  3. << AimLab OPENCV開源(包含Sendinput + Fov等代碼) >> https://www.bilibili.com/video/BV1q34y1e7ic/

一、準備工作

  • 需要安裝python 3.8.10 64位IDLE 的版本. 因為我會使用pyautogui來獲取屏幕分辨率等操作,使用tkinter來創(chuàng)建簡易彈窗提示操作;
  • 如果你只需要控制鼠標的話就不需要上述2個軟件包,不然最好和我一樣的python版本,32位或是版本太新太久都不支持pyautogui,或者使用其他軟件包代替也可以.tkinter軟件包是安裝IDLE時自帶的,不能手動安裝,只能通過安裝IDLE來安裝,很奇怪.我嘗試了很久得出這樣一個個結論.
  • 本教程使用的是動態(tài)鏈接驅動庫是羅技的LGS_9.02.65_x64_Logitech.exe版本, 注意不能是其他版本,不然對不上,先安裝這個驅動程序,那動態(tài)鏈接庫才有效果.安裝完成后的軟件界面是這樣的:

[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠,# Python 學習筆記,python,開發(fā)語言,驅動開發(fā)

  • 最后在程序中加載dll文件, 就可以驅動鍵鼠了.該軟件只需要開機打開一次即可.打開后退出也會繼續(xù)生效.但是關機重啟后又失效,所以開機后要打開一次,之后關閉退出就行.
  • 另外關于dll文件,第一次接觸的人可能不懂是什么,沒關系,因為我也不懂是啥.不過不影響使用,dll有點像別人打包好的庫,具有一些函數,你導入到自己的.py后,就可以直接使用這些函數.使用一些工具depends22_x64可以查看dll打包了什么函數,這里我只會通過名字和實踐猜測每個函數的功能.

[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠,# Python 學習筆記,python,開發(fā)語言,驅動開發(fā)

  • 注意!!! 不同地方下載的dll文件可能是不同人打包的,可能函數名或函數功能不太一樣.

二、開始敲代碼

1. 框架

  • 先寫個基本框架, 里面包含了開頭注釋, 軟件包導入, 打印函數打包, pid函數打包, 主函數打包; 一個等待填寫的空類;

"""
時間 : 2023年12月30日 07:34:48
作者 : Lovely_him
說明 : 興趣使然
"""

#!/usr/bin/env python3
import sys
import win32api
import os # 獲取文件路徑
import time # 獲取時間和延時
import ctypes # 調用dll文件

import tkinter as tk # python 內置庫,需要安裝時勾選安裝IDE才會安裝,坑爹
import threading # 多線程
import pyautogui # 獲取屏幕鼠標坐標
import random # 隨機數

def print_tkui(strs):
    """ 打包控制臺輸出 """
    print(strs)

class PID:
    """PID"""
    def __init__(self, P=0.35, I=0, D=0):
        """PID"""
        self.kp = P # 比例 
        self.ki = I # 積分
        self.kd = D # 微分
        self.uPrevious = 0 # 上一次控制量
        self.uCurent = 0 # 這一次控制量
        self.setValue = 0 # 目標值
        self.lastErr = 0 # 上一次差值
        self.errSum = 0 # 所有差值的累加
        self.errSumLimit = 10 # 近兩次的差值累加
        
    def pidPosition(self, setValue, curValue):
        """位置式 PID 輸出控制量"""
        self.setValue = setValue # 更新目標值
        err = self.setValue - curValue # 計算差值, 作為比例項
        dErr = err - self.lastErr # 計算近兩次的差值, 作為微分項
        self.errSum += err # 累加這一次差值,作為積分項
        outPID = (self.kp * err) + (self.ki * self.errSum) + (self.kd * dErr) # PID
        self.lastErr = err # 保存這一次差值,作為下一次的上一次差值
        return outPID # 輸出
    
    def pidIncrease(self, setValue, curValue):
        """增量式 PID 輸出控制量的差值"""
        self.uCurent = self.pidPosition(setValue, curValue) # 計算位置式
        outPID = self.uCurent - self.uPrevious # 計算差值 
        self.uPrevious = self.uCurent # 保存這一次輸出量
        return outPID # 輸出

class LOGITECH:
    """羅技動態(tài)鏈接庫"""
    pass
    
def Mymain():
    """ 主函數 """
    pass

if __name__ == "__main__":
    """ 主運行 """
    Mymain()

2. 導入

  • 然后開始往空類里填寫內容, 第一步導入dll文件,直接寫在類的開頭,只要這個類被導入,那就導入文件作準備.注意,我還添加了幾個局部的常量,用于判斷后續(xù)的保護措施.
  • 記得注意路徑是否正確,還有提前打開羅技驅動軟件.成功執(zhí)行運行就會有以下提示

[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠,# Python 學習筆記,python,開發(fā)語言,驅動開發(fā)

class LOGITECH:
    """羅技動態(tài)鏈接庫"""
    try:
        file_path = os.path.abspath(os.path.dirname(__file__)) # 當前路徑
        dll = ctypes.CDLL(f'{file_path}/logitech_driver.dll') # 打開路徑文件
        state = (dll.device_open() == 1) # 啟動, 并返回是否成功
        WAIT_TIME = 0.5 # 等待時間
        RANDOM_NUM = 0.1 # 最大時間隨機數
        if not state:
            print('錯誤, 未找到GHUB或LGS驅動程序')
    except FileNotFoundError:
        print(f'錯誤, 找不到DLL文件')

    def __init__(self) -> None:
        pass

3. 鼠標點擊

  • 然后開始逐一打包調用dll庫內的函數,實現(xiàn)功能; 先是鼠標按下和松開,合并為點擊的功能;為了模擬真實點擊,我加了按下后隨機延時再松開.
    @classmethod
    def mouse_down(self, code):
        """ 鼠標按下 code: 左 中 右 """
        if not self.state:
            return
        print_tkui(f'按下{code}鍵')
        if code == '左':
            code = 1
        elif code == '中':
            code = 2
        elif code == '右':
            code = 3
        else: # 默認
            code = 1 
        self.dll.mouse_down(code)

    @classmethod
    def mouse_up(self, code):
        """ 鼠標松開 code: 左 中 右 """
        if not self.state:
            return
        print_tkui(f'松開{code}鍵')
        if code == '左':
            code = 1
        elif code == '中':
            code = 2
        elif code == '右':
            code = 3
        else: # 默認
            code = 1 
        self.dll.mouse_up(code)
    
    @classmethod
    def mouse_click(self, code, wait_time=0):
        """ 鼠標點擊 code: 左 中 右 """
        if wait_time == 0: # 如果沒有規(guī)定等待時間
            wait_time = self.WAIT_TIME # 默認等待時間
        if wait_time != 0: # 如果等待時間不是0
            wait_time += random.uniform(0, self.RANDOM_NUM)
            time.sleep(wait_time) # 延時時間,秒,生成隨機小數0~1.0
            
        if not self.state:
            return
        print_tkui(f'等待{wait_time:.2f}秒后, 點擊{code}鍵')
        if code == '左':
            code = 1
        elif code == '中':
            code = 2
        elif code == '右':
            code = 3
        else: # 默認
            code = 1 

        self.dll.mouse_down(code)
        time.sleep(random.uniform(0, self.RANDOM_NUM)) # 延時時間,秒,生成隨機小數0~1.0
        self.dll.mouse_up(code)

4. 鍵盤點擊

  • 和鼠標點擊相似, 鍵盤點擊也一樣, 有按下和松開組合.
    @classmethod
    def key_down(self, code):
        """鍵盤下去 code: 'a'-'z':A-Z, '0'-'9':0-9"""
        if not self.state:
            return
        print_tkui(f'按下{code}鍵')
        self.dll.key_down(code)

    @classmethod
    def key_up(self, code):
        """鍵盤起來 code: 'a'-'z':A-Z, '0'-'9':0-9"""
        if not self.state:
            return
        print_tkui(f'松開{code}鍵')
        self.dll.key_up(code)

    @classmethod
    def key_click(self, code, wait_time=0, time_down=0):
        """鍵盤點擊 code: 'a'-'z':A-Z, '0'-'9':0-9"""
        if wait_time == 0: # 如果沒有規(guī)定等待時間
            wait_time = self.WAIT_TIME # 默認等待時間
        if wait_time != 0: # 如果等待時間不是0
            wait_time += random.uniform(0, self.RANDOM_NUM)
            time.sleep(wait_time) # 延時時間,秒,生成隨機小數0~1.0
        if time_down != 0: # 如果有長按時間,就會變成長按
            wait_time = 0
            
        if not self.state: # 保護措施
            return
        print_tkui(f'等待{wait_time:.2f}秒后, 點擊{code}鍵, 長按時間{time_down:.2f}')

        self.dll.key_down(code)
        time.sleep(wait_time + time_down +random.uniform(0, self.RANDOM_NUM)) # 延時時間,秒,生成隨機小數0~1.0, 不可以延時, 
        self.dll.key_up(code)

5. 鼠標移動

  • 然后是比較抽象的鼠標移動, 它的函數輸入是移動量, 就是模擬實際鼠標的移動距離, 而不是屏幕鼠標的移動距離. 屏幕鼠標的移動距離受電腦設置的鼠標速度, 和實際鼠標的cpi有很大關系. 實際我們使用的時候, 肯定只希望以屏幕作為參考系,在屏幕上以坐標移動.所以我打包了一下,使用pid自動調節(jié)的方式,實現(xiàn)輸入屏幕坐標,鼠標移動到相應坐標位置;
    @classmethod
    def mouse_move(self, end_xy, wait_time=0, min_xy=2, min_time=0.1):
        """
        等待多久后 緩慢移動 \n
        end_x       絕對橫坐標 \n
        end_y       絕對縱坐標 \n
        time_s      等待時間 \n
        min_xy      最小移動控制量 \n
        min_time    最小移動時間 \n
        """
        if wait_time == 0: # 如果沒有規(guī)定等待時間
            wait_time = self.WAIT_TIME # 默認等待時間
        if wait_time != 0: # 如果等待時間不是0
            wait_time += random.uniform(0, self.RANDOM_NUM)
            time.sleep(wait_time) # 延時時間,秒,生成隨機小數0~1.0
        if not self.state: # 保護措施
            return
        
        end_x, end_y = end_xy
        print_tkui(f'等待{wait_time:.2f}秒后, 移動到坐標{(end_x, end_y)}')

        pid_x = PID() # 創(chuàng)建pid對象
        pid_y = PID()

        while True: # 循環(huán)控制鼠標直到重合坐標
            time.sleep(min_time) # 延時時間,秒,生成隨機小數0~1.0
            new_x, new_y = pyautogui.position() # 獲取當前鼠標位置

            move_x = pid_x.pidPosition(end_x, new_x) # 經過pid計算鼠標運動量
            move_y = pid_y.pidPosition(end_y, new_y)

            # print(f'x={new_x}, y={new_y}, xd={move_x}, yd={move_y}')
            if end_x == new_x and end_y == new_y: # 如果重合就退出循環(huán)
                break
            
            if move_x > 0 and move_x < (min_xy): # 限制正最小值
                move_x = (min_xy)
            elif move_x < 0 and move_x > -(min_xy): # 限制負最小值
                move_x = -(min_xy)
            else:
                move_x = int(move_x) # 需要輸入整數,小數會報錯

            if move_y > 0 and move_y < (min_xy):
                move_y = (min_xy)
            elif move_y < 0 and move_y > -(min_xy):
                move_y = -(min_xy)
            else:
                move_y = int(move_y)

            self.dll.moveR(move_x, move_y, True) # 貌似有第三個參數,但是沒試出來什么用

6. 鼠標滾輪

  • 同理, 最后還有一個鼠標滾輪的滾動, 它也是模擬滾動量, 這個就不太好跟蹤, 因為不同頁面滾動范圍不一樣, 而且這個功能用得很少. 我考慮的是在有滾動條的情況下,使用鼠標點擊滾動條或拖拽滾動條, 是更加穩(wěn)妥的操作,所以我只寫了個簡單的調用;
    @classmethod
    def mouse_scroll(self, num):
        """ 鼠標滾輪 num : 正數向下, 負數向上 """
        if not self.state:
            return
        if num > 0:
            str_scroll = '下'
        elif num < 0:
            str_scroll = '上'
        else: # 保護措施
            return
        print_tkui(f'滾輪{str_scroll}轉動{num}單位')
        self.dll.scroll(num) # 鼠標滾輪

7. 總結

  • 自此, dll驅動庫內的0~9序號,10個函數中, 后8個函數的功能都實現(xiàn)了.第0個delay,應該是延時,使用python自帶的更加方便,所以沒有用. 第1個device_close應該是和第2個device_open相對應的,屬于關閉模塊,但我嘗試了一下沒成功,考慮到別人寫的例程,也是一開始就導入了dll并調用了dll.device_open,后續(xù)并沒有考慮關閉,也不需要關閉,所以我也寫在類開頭,導入類就導入dll并打開,不考慮關閉.

  • 大致功能就上面這些了, 然后使用最原始的方式實現(xiàn)連點器功能.我原本還打算寫個連點器操作表格導入功能, 將操作羅列,然后執(zhí)行持續(xù)識別表格,開始設置的操作.我嘗試一下后就放棄了,這種方法太原始了,現(xiàn)在應該采用更加智能的ai識別才對.而不是輸入固定坐標點移動.

  • 筆記到這里, 結束.文章來源地址http://www.zghlxwxcb.cn/news/detail-827477.html

到了這里,關于[python] 羅技動態(tài)鏈接驅動庫DLL 控制 鍵鼠的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • LabVIEW調用動態(tài)鏈接庫DLL

    LabVIEW調用動態(tài)鏈接庫DLL

    LabVIEW調用動態(tài)鏈接庫DLL 要調用DLL,首先必須確定該庫是C/?C?++?DLL還是Microsoft?.NET?Assembly?/?.NET?DLL。 若要確定具有哪種類型的庫,可以檢查DLL文件的可移植可執(zhí)行(PE)標頭。 DLL 是 C/?C?++?DLL : 1.???????如果沒有頭文件,請查找頭文件(*?.h)或函數原型定義,請?zhí)?/p>

    2024年02月03日
    瀏覽(22)
  • 如何查看.dll文件函數接口?(DLL動態(tài)鏈接庫)(查看動態(tài)鏈接庫、查看接口、查看函數)(Visual Studio的dumpbin工具)(Dependency Walker)

    如何查看.dll文件函數接口?(DLL動態(tài)鏈接庫)(查看動態(tài)鏈接庫、查看接口、查看函數)(Visual Studio的dumpbin工具)(Dependency Walker)

    查看DLL(動態(tài)鏈接庫)文件的接口,通常需要使用一些專門的工具。這里有兩個比較常見的方法: Dependency Walker 使用Dependency Walker:Dependency Walker是一個免費的實用工具,可以列出DLL文件中的所有導出函數以及它們可能依賴的其他DLL。只需在Dependency Walker中打開想查看的DLL文件

    2024年02月08日
    瀏覽(20)
  • Java JNA調用dll動態(tài)鏈接庫

    Java JNA調用dll動態(tài)鏈接庫

    記錄學習內容 C編譯dll環(huán)境: ? ? ? ? IDE:Clion ? ? ? ? ToolChains:MinGW64 Java環(huán)境: ? ? ? ? 版本:jdk1.8 64位 ? ? ? ? JNA依賴版本:5.2.0 (可根據需要升級,本文以此版本為例) JNA(Java Native Access )提供一組Java工具類用于在運行期間動態(tài)訪問系統(tǒng)本地庫(native library:如W

    2024年02月12日
    瀏覽(13)
  • Rust:使用libloader調用動態(tài)鏈接庫 (DLL)

    掘金為同人創(chuàng)作:掘金 最近需要使用Rust 動態(tài)調用 動態(tài)鏈接庫,本來打算是使用 libloading 的,但是 libloading 在調用dll中的函數的時,是必須要在編譯時確定參數和return的類型的。但后來發(fā)現(xiàn)了 libloader 這個包包, libloader 是基于 libloading 的,但是操作起來卻比 libloader 方便。

    2023年04月10日
    瀏覽(49)
  • 前端(node.js)調用dll動態(tài)鏈接庫

    使用 js node 調用dll 動態(tài)鏈接庫. github地址如下,包含dll,里面就一個Add方法暴露出來 github Windows 11 22H2 node v16.20.0 Python 3.11.2 需要安裝這倆庫 ffi-napi app.js 第一種不好使,曲線救國的方式這個是。 python-shell app.js python

    2024年02月16日
    瀏覽(21)
  • 以動態(tài)庫鏈接庫 .dll 探索結構體參數

    以動態(tài)庫鏈接庫 .dll 探索結構體參數

    Dev c++ C語言實現(xiàn)第一個 dll 動態(tài)鏈接庫 創(chuàng)建與調用-CSDN博客 ?在寫dll 插件中發(fā)現(xiàn)的函數指針用途和 typedef 的定義指針的用法-CSDN博客 兩步之后,嘗試加入結構體實現(xiàn)整體數據使用。 注意結構體 Ak 是相同的 代碼如下 DLL文件有兩個,dll.dll是上面提到的鏈接里的 dllv2.dll是這個代

    2024年04月12日
    瀏覽(15)
  • VS2019編譯生成動態(tài)鏈接庫dll的兩種方式

    VS2019編譯生成動態(tài)鏈接庫dll的兩種方式

    ?dll項目的默認結構如下: ?四個文件的內容因為是默認生成的,不是特別重要, 接下來就是重要的修改部分: 方法一: 修改“pch.h”和“dllmain.cpp”文件,可以參考以下博主鏈接,但博主的引用部分有些繁瑣,文末會介紹我的引用方法,和正常引用外部庫步驟是一樣的。這

    2023年04月09日
    瀏覽(21)
  • Unity——在C#中調用C++動態(tài)鏈接庫(DLL)

    Unity——在C#中調用C++動態(tài)鏈接庫(DLL)

    1、新建C++空項目 打開VS,新建一個C++空項目,自命名項目名稱與位置。 2、配置項目屬性為動態(tài)鏈接庫 右鍵項目,點擊屬性,打開項目屬性頁,將常規(guī)中的配置類型改為動態(tài)庫(.dll)。 ?3、添加.h頭文件 右鍵頭文件,點擊添加—新建項,選擇頭文件.h,命名為DllForUnity.h,點擊

    2024年02月10日
    瀏覽(20)
  • VS2019 DLL動態(tài)鏈接庫生成多個正在運行的Windows應用之間共享的DLL [三]

    VS2019 DLL動態(tài)鏈接庫生成多個正在運行的Windows應用之間共享的DLL [三]

    ? ????????本例程演示如何使用 Visual Studio IDE 通過 Microsoft C++ (MSVC) 編寫自己的動態(tài)鏈接庫 (DLL)。 然后,該演練演示如何從其他 C++ 應用中使用 DLL。 DLL(在基于 UNIX 的操作系統(tǒng)中也稱為“共享庫”)是最有用的 Windows 組件類型之一 。 可以將其用作共享代碼和資源、縮小應

    2024年02月17日
    瀏覽(52)
  • Python Selenium 獲取動態(tài)網頁指定元素的超鏈接

    Python Selenium 獲取動態(tài)網頁指定元素的超鏈接

    本文是個人使用Python Selenium 獲取動態(tài)網頁指定元素的超鏈接的電子筆記,由于水平有限,難免出現(xiàn)錯漏,敬請批評改正。 更多精彩內容,可點擊進入Python日常小操作專欄或我的個人主頁查看 熟悉Python 熟悉Requests 熟悉XPath 熟悉Selenium Python是一種跨平臺的計算機程序設計語言。

    2024年01月19日
    瀏覽(44)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包