鱼C论坛

 找回密码
 立即注册
查看: 3244|回复: 1

关于python的ctypes库和pyautogui库的一些问题

[复制链接]
发表于 2022-11-16 02:34:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
就是需要这么一个功能, 每当屏幕的一组坐标点变成特定颜色的时候, 鼠标会自动点击某一固定位置,代码如下:

import ctypes
from ctypes import wintypes
import pyautogui
user32 = ctypes.WinDLL('user32', use_last_error=True)
# 注册user32中的GetDC参数和返回值
user32.GetDC.restype = wintypes.HDC
user32.GetDC.argtypes = (wintypes.HWND,)

gdi32 = ctypes.WinDLL('gdi32', use_last_error=True)
# 注册GetPixel中的GetPixel参数和返回值
gdi32.GetPixel.restype = wintypes.COLORREF
gdi32.GetPixel.argtypes = (wintypes.HDC, ctypes.c_int, ctypes.c_int)

def get_color(x, y):
    hdc = user32.GetDC(None)
    color = gdi32.GetPixel(hdc, x, y)
    return color
while True:
    if get_color(1592, 1036) == 255 or get_color(1593, 1039) == 65280:
        pyautogui.moveTo(1666, 1060)
        if pyautogui.position() == (1666, 1060):
            pyautogui.click()

现在有2个问题, 第一个是while True肯定用的不合适, 因为程序是一直打开使用的, 如果一直死循环的执行, 电脑慢慢就会卡顿死机了, 我对win32编程不是很懂, 里面应该有专门的写法, 请大佬们帮帮忙
第二个问题是 pyautogui.moveTo(1666, 1060) 移动到要点击的位置时, pyautogui.click()会判断鼠标的位置然后点击, 但是因为鼠标也是一直人为操作的, 只是get_color(1592, 1036) == 255 or get_color(1593, 1039) == 65280的时候
才会触发自动点击功能, 当pyautogui.moveTo(1666, 1060) 移动到要点击的位置时, 恰好人为将鼠标移开了这个位置, 也就一瞬间的时间, 所以鼠标的点击位置就发生改变就失效了, 所以有什么办法可以让pyautogui.moveTo(1666, 1060) 移动到要点击的位置时,
让鼠标悬停或失灵0.1秒, 在这0.1秒的时间人为操作鼠标是不起作用的, 直到自动点击后才恢复, 希望大佬们多多指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-16 03:15:06 | 显示全部楼层
百度折腾了一会, 试着改了下:
import ctypes
from ctypes import wintypes
from ctypes import windll
import pyautogui
import threading
user = windll.LoadLibrary(r"C:\Windows\System32\user32.dll")
user32 = ctypes.WinDLL('user32', use_last_error=True)
# 注册user32中的GetDC参数和返回值
user32.GetDC.restype = wintypes.HDC
user32.GetDC.argtypes = (wintypes.HWND,)

gdi32 = ctypes.WinDLL('gdi32', use_last_error=True)
# 注册GetPixel中的GetPixel参数和返回值
gdi32.GetPixel.restype = wintypes.COLORREF
gdi32.GetPixel.argtypes = (wintypes.HDC, ctypes.c_int, ctypes.c_int)

def get_color(x, y):
    hdc = user32.GetDC(None)
    color = gdi32.GetPixel(hdc, x, y)
    return color
m, n = pyautogui.size()
def ls_k_thread():
    while True:
        if get_color(1592, 1036) == 255 or get_color(1593, 1039) == 65280:
            pyautogui.moveTo(1666, 1060)
            user.BlockInput(True)
            if pyautogui.position() == (1666, 1060):
                pyautogui.click()
                user.BlockInput(False)
            pyautogui.moveTo(x=m / 2, y=n / 2)

def analyse_pic_thread():
    r = threading.Thread(target=ls_k_thread)
    r.start()
analyse_pic_thread()

如果有更好的方法,希望大佬们指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 15:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表