python抓取软件界面下拉框

用SPY++抓取下拉框时可以成功抓取下拉框选定的选项数据,但用python的win32gui命令获取后是空值,用什么命令可以实现

该回答引用gpt
您可以尝试使用 win32gui.SendMessage 函数来获取下拉框当前选中的值。

首先,使用 win32gui.FindWindowEx 函数获取到下拉框的 HWND 句柄,然后使用 win32gui.SendMessage 函数发送 CB_GETCURSEL 和 CB_GETLBTEXT 消息,从而可以获取到下拉框当前选中的索引和对应的文本。

示例代码如下:

import win32gui

# 获取下拉框窗口句柄
hwnd_combo = win32gui.FindWindowEx(hwnd_parent, None, "ComboBox", None)

# 获取当前选中项的索引
index = win32gui.SendMessage(hwnd_combo, win32con.CB_GETCURSEL, 0, 0)

# 获取当前选中项的文本
buf_size = win32gui.SendMessage(hwnd_combo, win32con.CB_GETLBTEXTLEN, index, 0)
buf = win32gui.PyMakeBuffer(buf_size + 1)
win32gui.SendMessage(hwnd_combo, win32con.CB_GETLBTEXT, index, buf)
selected_text = buf.tobytes().decode("gbk")

其中,hwnd_parent 是下拉框所在窗口的句柄,win32con.CB_GETCURSEL 和 win32con.CB_GETLBTEXT 分别是获取选中项索引和选中项文本的消息类型。

需要注意的是,获取到的文本可能是使用 ANSI 编码的,需要根据具体情况进行解码成 Unicode。如果您需要获取的是 Unicode 编码的文本,请使用 win32gui.SendMessageW 函数。

代码怎么写的,是使用消息 CB_GETCOUNT + CB_GETLBTEXT 么
下拉框是标准的windows控件么

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:python下spy++句柄使用
  • 除此之外, 这篇博客: pywin32:入门中的 spy++ 的使用 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    根据问题描述,你想要使用Python抓取一个软件界面中下拉框选定的选项数据。你已经尝试使用win32gui命令获取数据,但是得到了空值。下面是一个具体的解决方案:

    1. 首先,你需要安装pywin32库,可以使用以下命令进行安装:

    pip install pywin32

    1. 导入相应的库和模块:

    python import win32gui import win32con import ctypes

    1. 获取主窗口的句柄:

    python def get_main_window_handle(): return win32gui.GetForegroundWindow()

    1. 获取下拉框控件的句柄:

    python def get_combobox_handle(parent_handle, class_name, title): hwnd = win32gui.FindWindowEx(parent_handle, 0, class_name, title) return hwnd

    其中,parent_handle是主窗口的句柄,class_name是下拉框控件的类名,title是下拉框控件的标题或者窗口名。

    1. 获取下拉框选项的数目:

    python def get_combobox_item_count(combobox_handle): return ctypes.windll.user32.SendMessage(combobox_handle, win32con.CB_GETCOUNT, 0, 0)

    1. 获取下拉框选项的文本:

    python def get_combobox_item_text(combobox_handle, index): length = ctypes.windll.user32.SendMessage(combobox_handle, win32con.CB_GETLBTEXTLEN, index, 0) buffer = ctypes.create_string_buffer(length + 1) ctypes.windll.user32.SendMessageA(combobox_handle, win32con.CB_GETLBTEXT, index, ctypes.byref(buffer)) return buffer.value.decode('gbk').strip('\x00')

    1. 组合以上函数,可以得到下拉框选项的具体结果:

    python def get_combobox_items(parent_handle, class_name, title): combobox_handle = get_combobox_handle(parent_handle, class_name, title) if combobox_handle: count = get_combobox_item_count(combobox_handle) items = [get_combobox_item_text(combobox_handle, i) for i in range(count)] return items else: return None

    其中,parent_handle是主窗口句柄,class_name是下拉框控件的类名,title是下拉框控件的标题或者窗口名。

    1. 调用以上函数获取下拉框选项的数据:

    python parent_handle = get_main_window_handle() class_name = 'ComboBox' title = '下拉框标题' items = get_combobox_items(parent_handle, class_name, title) if items: print(items) else: print('无法获取下拉框选项数据')

    其中,class_name是下拉框控件的类名,title是下拉框控件的标题或者窗口名。确保相关信息正确并存在于待抓取的软件界面中。

    此解决方案使用win32gui库来获取窗口和控件句柄,并使用win32con库来使用常量,使用ctypes库来调用底层Windows API函数,实现获取下拉框选项数据的功能。如果以上方法仍然无法获取数据,可能需要更多的调试和定制化的方法。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^