python根据句柄如何自动点击按钮

python根据句柄如何自动点击按钮,第1张

用python的sendkeys直接模拟键盘,用ctype扩展来点鼠标。你需要做的就是用python打开浏览器,然后输入网站,在找到按钮的坐标(固定到程序里),然后点击就行了。不过简单的可以,复杂点的就要考虑很多问题了,程序截图如下:

Python获取电脑截图有多种方式,具体如下:

PIL中的ImageGrab模块

windows API

PyQt

pyautogui

使用Selenium截图

使用PIL中的ImageGrab模块简单,但是效率有点低,截屏一次需05s。

调用windows API,速度快但是使用较复杂,这里就不做详细介绍了,因为有更好用的PyQt。

PyQt比调用windows API简单很多,而且有windows API的很多优势,比如速度快,可以指定获取的窗口,即使窗口被遮挡。需注意的是,窗口最小化时无法获取截图。

首先需要获取窗口的句柄

程序会打印窗口的hwnd和title,有了title就可以进行截图了。

pyautogui是比较简单的,但是不能指定获取程序的窗口,因此窗口也不能遮挡,不过可以指定截屏的位置,004s一张截图,比PyQt稍慢一点,但也很快了。

使用Selenium只能进行WEB程序截图

给你一个思路。用 python 的 win32gui 可以枚举所有窗口句柄,想办法获取窗口句柄,然后通过 GetWindowText() 方法来获取窗口的标题,也就是结果所在的窗口句柄。

我用WIN32试了一下,我是hook了鼠标所在的句柄,但当鼠标指向结果时,结果的窗口句柄获取不到,只能获取到结果窗口的上一个窗口的句柄(也就是你图中的00280756的句柄),但可以通过枚举子窗口来获取(也就是枚举你中的002F0854句柄),然后经过一系列匹配和判断最终得到结果的值。

# encoding: gb2312

import win32gui

def _MyCallback( hwnd, extra ):

    hwnds = extra

    hwndsappend(hwnd)

def _CallBack(hwnd, extra):

    value, m_index = extra

    if win32guiGetClassName(hwnd) == 'Static':

        m_indexappend(None)

    

    if len(m_index) == 4:

        valueappend(win32guiGetWindowText(hwnd))

def TestEnumWindows():

    windows = []

    results = []

    win32guiEnumWindows(_MyCallback, (windows))

    i = 0

    for hwnd in windows:

        if win32guiGetClassName(hwnd) == 'CalcFrame':

            m_index = []

            win32guiEnumChildWindows(hwnd, _CallBack, (results, m_index))

        i += 1

    for result in results:

        print '计算器的结果为:' , result

TestEnumWindows()

这样更好一些,可能有些特征不同。我是枚举所有窗口,然后获取窗口的classname为CalcFrame的窗口,然后再枚举CalcFrame的子窗口,然后判断第4个出现的Static控件就是结果的控件。

1 使用ossystem函数运行其他程序

2 使用ShellExecute函数运行其他程序

3 使用CreateProcess函数运行其他程序

4 使用ctypes调用kernel32dll中的函数

1 使用ossystem函数运行其他程序

os模块中的system()函数可以方便地运行其他程序或者脚本。其函数原型如下所示。

ossystem(command) 其参数含义如下所示。

command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以使用空格分隔程序及多个参数。

以下实例实现通过ossystem()函数打开系统的记事本程序。

>>> import os # 使用ossystem()函数打开记事本程序 >>> ossystem('notepad') 0 # 关闭记事本后的返回值 # 向记事本传递参数,打开pythontxt文件 >>> ossystem('notepad pythontxt')

>>> import os # 使用ossystem()函数打开记事本程序 >>> ossystem('notepad') 0 # 关闭记事本后的返回值 # 向记事本传递参数,打开pythontxt文件 >>> ossystem('notepad pythontxt')

2 使用ShellExecute函数运行其他程序

除了使用os模块中的ossystem()函数以外,还可以使用win32api模块中的ShellExecute()函数。其函数如下所示。

ShellExecute(hwnd, op , file , params , dir , bShow )

其参数含义如下所示。

hwnd:父窗口的句柄,如果没有父窗口,则为0。

op:要进行的 *** 作,为“open”、“print”或者为空。

file:要运行的程序,或者打开的脚本。

arams:要向程序传递的参数,如果打开的为文件,则为空。

dir:程序初始化的目录。

Show:是否显示窗口。

以下实例使用ShellExecute函数运行其他程序。

>>> import win32api # 打开记事本程序,在后台运行,即显示记事本程序的窗口 >>> win32apiShellExecute(0, 'open', 'notepadexe', '','',0)

# 打开记事本程序,在前台运行 >>> win32apiShellExecute(0, 'open', 'notepadexe', '','',1)

# 向记事本传递参数,打开pythontxt >>> win32apiShellExecute(0, 'open', 'notepadexe', 'pythontxt','',1)

# 在默认浏览器中打开>

1、打开百度到设置到搜索设置界面。

2、箭头所指位置,就是select选项框,打开页面元素定位,下方红色框框区域,可以看到select标签属性。

3、 *** 作非select/option元素,触发下拉列表出现,等待下拉列表中的元素出现,进行选择元素即可。

算办公自动化的一个应用。

先获取窗口的句柄 >>遍历窗口下的所有控件>>通过输入框的特征,比如标识名称,找到对应的输入框>> *** 作输入框属性>>处理获取新字符串>>通过sendpost返回给另一个输入框

handle = win32guiFindWindow('Galaxy2DEngine',None)

left, top, right, bottom = win32guiGetWindowRect(handle)

win32guiMoveWindow(handle, int x, int y, int w,int h,BOOL bRepaint )

pos = win32guiGetCursorPos()

win32apiSetCursorPos([x, y])

title = win32guiGetWindowText(handle)

clsname = win32guiGetClassName(handle)

win32apimouse_event(win32conMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

win32apimouse_event(win32conMOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

win32apimouse_event(win32conMOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)

win32apimouse_event(win32conMOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)

def click_it(self,x,y):

#设置鼠标位置

win32apiSetCursorPos([x, y])

#获取鼠标位置

pos = win32apiGetCursorPos()

#通过鼠标位置获取窗体句柄

handle= win32guiWindowFromPoint(pos)

#通过窗体名称获取窗体句柄(可通过spy++获取)

#handle = win32guiFindWindow('Galaxy2DEngine',None)

#获取Title & ClassName

title = win32guiGetWindowText(handle)

clsname = win32guiGetClassName(handle)

#把在屏幕上鼠标的位置转换为打开的程序的客户区的坐标

client_pos =win32guiScreenToClient(handle,pos)

tmp=win32apiMAKELONG(client_pos[0],client_pos[1])

#发送激活窗口消息 并发送鼠标按下-抬起消息,依赖具体的窗体(handle),窗体内位置(tmp)

win32guiSendMessage(handle, win32conWM_ACTIVATE,win32conWA_ACTIVE,0)

win32guiSendMessage(handle, win32conWM_LBUTTONDOWN,win32conMK_LBUTTON,tmp)

win32guiSendMessage(handle, win32conWM_LBUTTONUP,win32conMK_LBUTTON,tmp)

#win32guiSendMessage(handle, win32conWM_RBUTTONDOWN,win32conMK_LBUTTON,tmp)

#win32guiSendMessage(handle, win32conWM_RBUTTONUP,win32conMK_LBUTTON,tmp)

以上就是关于python根据句柄如何自动点击按钮全部的内容,包括:python根据句柄如何自动点击按钮、Python获取屏幕截图的几种方法、用python win32 获得计算器里的计算结果等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9791976.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存