全球主机交流论坛

标题: 请教python大佬一个问题 [打印本页]

作者: Kevil    时间: 2023-4-12 15:07
标题: 请教python大佬一个问题
本帖最后由 Kevil 于 2023-4-12 15:13 编辑

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

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

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

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

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

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

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




然后下面是我随便找的一个ERP系统想做测试用的, 也是怎么都抓取不到有用的id

作者: aipage    时间: 2023-4-12 15:09
有问题找Google  
有问题找GPT
作者: Kevil    时间: 2023-4-12 15:11
本帖最后由 Kevil 于 2023-4-12 15:15 编辑
aipage 发表于 2023-4-12 15:09
有问题找Google  
有问题找GPT


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

领导有要求不能用坐标点击, 说是什么后期要改多线程...鼠标不能多线程操作
作者: acpp    时间: 2023-4-12 15:23
Kevil 发表于 2023-4-12 15:22
领导有要求不能用坐标点击, 说是什么后期要改多线程...鼠标不能多线程操作 ...

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

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

大佬说的这个SendMessage是pywinauto库里的方法吗   还是什么库, 我也是强行被领导叫去搞python的...平时都是面向百度编程
作者: acpp    时间: 2023-4-12 15:31
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)
复制代码

作者: acpp    时间: 2023-4-12 15:35
还有那个窗口客户区的坐标转换,这个你谷歌搜索下。
chatgpt代码贴不出有违规被过滤。

简单点说就是 获取目标erp软件的窗口句柄,然后找到要点击的坐标。再把坐标转换成相对这个窗口的。再用发送消息的方式投递过去后台实现点击或者键盘输入等等。
作者: Kevil    时间: 2023-4-12 15:39
acpp 发表于 2023-4-12 15:35
还有那个窗口客户区的坐标转换,这个你谷歌搜索下。
chatgpt代码贴不出有违规被过滤。

好的, 谢谢大佬, 我试一下
作者: Kevil    时间: 2023-4-13 09:08
dd
作者: 251768938    时间: 2023-4-13 09:10
问问厂商有没有接口
作者: longkulo    时间: 2023-4-13 09:35
本帖最后由 longkulo 于 2023-4-13 09:40 编辑

你别光找窗口的
那个登录是窗口里面的一个组件, 找到那个句柄再发消息的.
一共三个函数就能解决你的需求.
你用python,不要用那个auto库,用python调用大漠插件,里面一堆功能函数让你调用.

一个自动完成扫码任务的工具


1.遍历所有句柄


2.后台输入的功能函数


3.后台点击按钮

作者: Kevil    时间: 2023-4-13 10:48
longkulo 发表于 2023-4-13 09:35
你别光找窗口的
那个登录是窗口里面的一个组件, 找到那个句柄再发消息的.
一共三个函数就能解决你的需求.

我草 大佬! 你这个自动扫码任务的程序可不可以发给我,  我这边也有云pos的需求
作者: longkulo    时间: 2023-4-13 11:19
Kevil 发表于 2023-4-13 10:48
我草 大佬! 你这个自动扫码任务的程序可不可以发给我,  我这边也有云pos的需求 ...

这软件你没啥用,半自动的.
它作用是不在店里的时候扫码, 用手机扫码,然后远程发给这软件,控制自动扫码.
就是相当于把手机当扫码枪远程使用的.


作者: Kevil    时间: 2023-4-13 11:21
longkulo 发表于 2023-4-13 11:19
这软件你没啥用,半自动的.
它作用是不在店里的时候扫码, 用手机扫码,然后远程发给这软件,控制自动扫码.
...

哦哦 我以为是自动完成烟草每天必须扫几十单的任务..
作者: longkulo    时间: 2023-4-13 13:10
Kevil 发表于 2023-4-13 11:21
哦哦 我以为是自动完成烟草每天必须扫几十单的任务..

以前可以的,现在不行
以前我一天扫了一千单,被警告

现在限制了一个微信每天只能扫2笔,所以不能自动化.没那么多微信放着给他自动扫
作者: Kevil    时间: 2023-4-13 14:40
longkulo 发表于 2023-4-13 13:10
以前可以的,现在不行
以前我一天扫了一千单,被警告

确实, 麻烦得很, 烟草弄这些硬性指标是真的恶心




欢迎光临 全球主机交流论坛 (https://hostloc.onozo.cc/) Powered by Discuz! X3.4