全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1786|回复: 18

请教python大佬一个问题

[复制链接]
发表于 2023-4-12 15:07:51 | 显示全部楼层 |阅读模式
本帖最后由 Kevil 于 2023-4-12 15:13 编辑

如何使用python在不用模拟鼠标点击的情况下操作ERP软件

比如打开指定路径下的ERP.exe, 然后获取它的窗口句柄, 填入用户名密码到编辑框内, 然后使用句柄点击按钮登录

目前我是下载了好多抓窗口句柄的软件, 比如GUIPropView, 精易编程助手, picker, spyxx等, 但抓到的句柄都没**确在pywinauto这个库中用,

之前也用过pywin32这个库... 也是各种NotFoundError...

pywinauto这个库打开程序是没什么问题, 我那记事本测试也可以正常保存之类的操作, 但是用作其他复杂点的ERP程序就不行了.

有没有大佬帮忙分析分析该怎么做

下面是操作记事本的测试小demo




然后下面是我随便找的一个ERP系统想做测试用的, 也是怎么都抓取不到有用的id
发表于 2023-4-12 15:20:48 | 显示全部楼层
下面是我用pywin32模拟的通达信输入股票代码查行情的代码,稳定使用一年多了,你对照改下就可以
当时也是网上查的,原理什么的早忘了。

import win32api,win32gui,win32con,pythoncom,win32com.client


keydic = {'0':48,'1':49,'2':50,'3':51,'4':52,'5':53,'6':54,'7':55,'8':56,'9':57}
    tdx = win32gui.FindWindow("TdxW_MainFrame_Class", None) #获取窗口
    if code.isdigit() and len(code) == 6:
        if tdx != 0:
            ### shell 行为pywin32 setfroregroundwindow 小BUG,只是提前发送一个键给屏幕,没其它用处,但要保留
            pythoncom.CoInitialize()
            shell = win32com.client.Dispatch("WScript.Shell")
            shell.SendKeys('%')
            win32gui.SetForegroundWindow(tdx)
            time.sleep(0.2)
            codelist = list(code)
            for n in codelist:                    
                win32api.keybd_event(keydic[n],0,0,0)
                win32api.keybd_event(keydic[n],0,win32con.KEYEVENTF_KEYUP,0)
            time.sleep(0.2)
            win32api.keybd_event(13,0,0,0)
            win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
            win32gui.ShowWindow(tdx, win32con.SW_SHOW)
发表于 2023-4-12 15:09:26 | 显示全部楼层
有问题找Google  
有问题找GPT
 楼主| 发表于 2023-4-12 15:11:36 | 显示全部楼层
本帖最后由 Kevil 于 2023-4-12 15:15 编辑
aipage 发表于 2023-4-12 15:09
有问题找Google  
有问题找GPT


找过了  GPT只能告诉我如何操作市面上常见的程序, 但这个ERP系统市面上没有, 关键信息又抓不到
发表于 2023-4-12 15:21:30 | 显示全部楼层
如果是自绘窗口的话用AccExplorer查看下,有的可以用IAccessible接口操作。其实获取主窗口后,用发送消息的相对坐标也能实现啊。
 楼主| 发表于 2023-4-12 15:22:14 | 显示全部楼层
acpp 发表于 2023-4-12 15:21
如果是自绘窗口的话用AccExplorer查看下,有的可以用IAccessible接口操作。其实获取主窗口后,用发送消息的 ...

领导有要求不能用坐标点击, 说是什么后期要改多线程...鼠标不能多线程操作
发表于 2023-4-12 15:23:52 | 显示全部楼层
Kevil 发表于 2023-4-12 15:22
领导有要求不能用坐标点击, 说是什么后期要改多线程...鼠标不能多线程操作 ...

发送消息是可以后台的,也支持多线程的。不是前台真实模拟键盘鼠标。
SendMessage 这个函数你查询下。

如果窗口坐标是固定的,又没检测你这类消息操作,就可以用这个实现。
 楼主| 发表于 2023-4-12 15:28:49 | 显示全部楼层
acpp 发表于 2023-4-12 15:23
发送消息是可以后台的,也支持多线程的。不是前台真实模拟键盘鼠标。
SendMessage 这个函数你查询下。

大佬说的这个SendMessage是pywinauto库里的方法吗   还是什么库, 我也是强行被领导叫去搞python的...平时都是面向百度编程
发表于 2023-4-12 15:31:29 | 显示全部楼层
Kevil 发表于 2023-4-12 15:28
大佬说的这个SendMessage是pywinauto库里的方法吗   还是什么库, 我也是强行被领导叫去搞python的...平时 ...

那是win系统 api可以调用。 我就贴下chagpt的回答,你试下。
  1. import win32api
  2. import win32con

  3. # 获取目标窗口句柄(这里假设已知窗口标题)
  4. hwnd = win32api.FindWindow(None, '窗口标题')

  5. # 构造鼠标左键单击事件(将屏幕坐标转换为窗口客户区坐标)
  6. x = 123
  7. y = 456
  8. lparam = y * 65536 + x
  9. wparam = win32con.MK_LBUTTON
  10. msg = win32con.WM_LBUTTONDOWN
  11. win32api.SendMessage(hwnd, msg, wparam, lparam)
  12. win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, lparam)
复制代码
发表于 2023-4-12 15:35:42 | 显示全部楼层
还有那个窗口客户区的坐标转换,这个你谷歌搜索下。
chatgpt代码贴不出有违规被过滤。

简单点说就是 获取目标erp软件的窗口句柄,然后找到要点击的坐标。再把坐标转换成相对这个窗口的。再用发送消息的方式投递过去后台实现点击或者键盘输入等等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-3 19:22 , Processed in 0.063647 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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