gpt4 book ai didi

c++ - 对 Visual Basic 6 ListView 的自动化支持

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:45 25 4
gpt4 key购买 nike

我需要通过自动化接口(interface)(使用 C++/C# 编码)获取控件的值/文本。我试过 UI Automation API这是 Inspect 捕获的一些结果: Inspect Listview

Inspect sliderUI Automation 将这些控件识别为 pane,我无法正常获取 ListView 文本项或获取/设置 slider 值。
尝试使用其他工具,如 MSAA , Automation Spy给出相同的结果。

经过研究,发现类名如ListView20WndClass, Slider20WndClass, ...的控件属于Visual Basic 6控件。
那么,有没有API也可以支持这些类型的控制呢?

备注1:有一个名为 Ranorex 的工具可以支持这些控件(遗憾的是,它是 3490 欧元的商业许可证),我不知道使用了哪个底层 API:
enter image description here

enter image description here


备注2在被测应用程序中使用了一些其他控件类型,UI Automation 仍然可以获得值:

  • ThunderRT6FormDC:识别为窗口
  • ThunderRT6CommandButton:识别为按钮
  • ThunderRT6CheckBox:识别为复选框
  • 等...
  • 遗憾的是,它们嵌入了 ListView20WndClassSlider20WndClass 但都被识别为 Pane


更新 1我创建了一个简单的程序来获取文本但仍然无法正常工作(编译为 Unicode 字符集):

#include <iostream>
using namespace std;

#include <UIAutomation.h>
#include <atlstr.h>
#include <Commctrl.h>

CString getListViewItemText(HWND hwnd, int nItem, int nSubItem) {
LVITEM item;
memset(&item, 0, sizeof(LVITEM));
item.iSubItem = nSubItem;
CString string;
int Length = 64; //initial reasonable string length
int ReturnCode;

do {
Length *= 2; //resize the string buffer
item.cchTextMax = Length;
item.pszText = string.GetBufferSetLength(Length);

ReturnCode = (int)::SendMessage(hwnd, LVM_GETITEMTEXT,
(WPARAM)nItem, (LPARAM)&item);
printf("len = %d \n", ReturnCode);

} while (ReturnCode == Length - 1); //if could not get all chars, try again

string.ReleaseBuffer();
return string;
}

void UI_Spy() {

// Init COM
CoInitialize(NULL);

// Init UIAutomation instance
IUIAutomation *pAuto;
CoCreateInstance(CLSID_CUIAutomation, NULL,
CLSCTX_INPROC_SERVER, IID_IUIAutomation, reinterpret_cast<void**>(&pAuto));

if (pAuto) {

IUIAutomationElement *pElm;
POINT p;

for (int i = 0; i < 10; i++) {
for (int j = 5; j > 0; j--) {
Sleep(1000);
printf("%d ", j);
}
GetCursorPos(&p);
if (pAuto->ElementFromPoint(p, &pElm) == S_OK) {
wprintf(L"\nPOSITION x = %d, y = %d\n", p.x, p.y);

BSTR str;
pElm->get_CurrentName(&str);
wprintf(L"-Name = %s\n", str);
SysFreeString(str);

pElm->get_CurrentLocalizedControlType(&str);
wprintf(L"-Type = %s\n", str);
SysFreeString(str);

CONTROLTYPEID typeId;
pElm->get_CurrentControlType(&typeId);

switch (typeId) {

// Process checkbox
case UIA_CheckBoxControlTypeId:
IUIAutomationTogglePattern *toggle;
pElm->GetCurrentPattern(UIA_TogglePatternId, (IUnknown**)&toggle);
ToggleState state;
toggle->get_CurrentToggleState(&state);
printf("-Checkbox = %s\n", state == ToggleState::ToggleState_On ? "TRUE"
: (state == ToggleState::ToggleState_Off ? "FALSE" : "INTER"));
break;

// Process VB6 listview
case UIA_PaneControlTypeId:
pElm->get_CurrentClassName(&str);
if (str != nullptr && wcscmp(str, L"ListView20WndClass") == 0) {
HWND hwnd;
pElm->get_CurrentNativeWindowHandle((UIA_HWND*)&hwnd);
printf("-VB6 Listview: %p\n", hwnd);

CString txt = getListViewItemText(hwnd, 0, 0);
//txt = "Test";
printf("-[0,0] = %S\n", (const wchar_t*)txt);
}
SysFreeString(str);
break;

// Process normal listview
case UIA_ListControlTypeId:
HWND hwnd;
pElm->get_CurrentNativeWindowHandle((UIA_HWND*)&hwnd);
printf("-Normal Listview: %p\n", hwnd);

CString txt = getListViewItemText(hwnd, 0, 0);
//txt = "Test";
printf("-[0,0] = %S\n", (const wchar_t*)txt);
break;
}

wprintf(L"\n");
pElm->Release();
}
printf("\n");
}

// Release UIAutomation instance
pAuto->Release();
}

// Release COM
CoUninitialize();
}

int main()
{
UI_Spy();

cin.get();
return 0;
}


当它计数为 5..4..3..2..1 时,只需将鼠标悬停在屏幕上的某个元素上即可进行检查。
但是当我将鼠标悬停在 ListView 上时:

  • VB6 ListView (ListView20WndClass):它返回一个空字符串(预期为 101,如我的示例)
  • MFC/Winform ListView (SysListView32):鼠标下的应用程序停止工作(控制台应用程序仍在运行)

最佳答案

您可以使用 pywinauto它可以在引擎盖下使用 Win32 API 自动化 VB6 应用程序(所有细节都被隐藏,包括 LVM_GETITEM 消息等)。大多数控件可以被识别为按钮、复选框甚至 ListView !参见 supported class names用于 ListView 。您的案例在这里。

如果使用 flexible waits,Win32 API 应该比 UI Automation 工作得更快.尽管如果有的话,UI 自动化也得到支持。

Getting Started Guide将帮助您迈出第一步并学习高级概念。也可以随意使用标签 pywinauto 提问。我是库维护者。

关于c++ - 对 Visual Basic 6 ListView 的自动化支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com