c++ - دعم الأتمتة ل فيسوال باسيك 6 ليستفيو




listview automation (2)

أنا بحاجة للحصول على قيمة / نص التحكم عن طريق واجهة الأتمتة (الترميز مع C ++ / C #). حاولت مع واجهة برمجة التطبيقات أتمتة واجهة المستخدم وهذا هو بعض النتائج التي تم التقاطها من قبل التفتيش :

تعترف أتمتة واجهة المستخدم هذه التحكم كجزء ولا أستطيع الحصول على عنصر نص عرض القائمة أو الحصول على / تعيين قيمة شريط التمرير كالمعتاد.
حاول مع أداة أخرى مثل مسا ، أتمتة تجسس تعطي نفس النتيجة.

بعد البحث، وجدت أن السيطرة مع اسم الفئة مثل ListView20WndClass ، Slider20WndClass ، ... تنتمي إلى فيسوال باسيك 6 السيطرة.
لذلك، هل هناك أي أبي يمكن أن تدعم هذا النوع من السيطرة كذلك؟

ملاحظة 1 : هناك أداة اسمها رانوريكس يمكن أن تدعم هذه السيطرة (للأسف، هو 3490 € الترخيص التجاري)، وأنا لا أعرف أي أبي الأساسي كان يستخدم:


ملاحظة 2 هناك بعض أنواع التحكم الأخرى المستخدمة في التطبيق تحت الاختبار أن واجهة المستخدم أتمتة لا يزال يمكن الحصول على القيمة:

  • ThunderRT6FormDC : الاعتراف كنافذة
  • ThunderRT6CommandButton : الاعتراف كزر
  • ThunderRT6CheckBox : الاعتراف كخانة
  • إلخ...
  • للأسف، أنها تتضمن ListView20WndClass و Slider20WndClass ولكن كلا الاعتراف كجزء


تحديث 1 أنا إنشاء برنامج بسيط للحصول على النص ولكن لا تزال لا تعمل (ترجمة كما ونيكود مجموعة الأحرف):

#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 فقط الماوس فوق بعض العناصر على الشاشة للتحقق.
ولكن عندما كنت الماوس فوق عرض القائمة:

  • VB6 عرض القائمة (ListView20WndClass): فإنه يعود سلسلة فارغة (المتوقع هو 101 كمثال بلدي)
  • مفك / وينفورم عرض القائمة (SisListView32): التطبيق تحت الماوس توقفت عن العمل (تطبيق وحدة التحكم لا يزال قيد التشغيل)

يمكنك استخدام بيوينوتو التي يمكن أتمتة تطبيقات VB6 باستخدام أبي Win32 تحت غطاء محرك السيارة (يتم إخفاء كافة التفاصيل بما في ذلك رسالة LVM_GETITEM الخ). يمكن التعرف على معظم الضوابط كأزرار، وخانات الاختيار وحتى وجهات النظر قائمة! راجع أسماء الفئات المدعومة لعرض الملفات. حالاتك هنا.

و Win32 أبي يجب أن تعمل بشكل أسرع من مع أتمتة واجهة المستخدم في حالة استخدام الانتظار المرن . على الرغم من أن يتم دعم أتمتة واجهة المستخدم أيضا تحت غطاء محرك السيارة إن وجدت.

يساعدك دليل الخطوات الأولى على اتخاذ الخطوات الأولى ومعرفة المفهوم الرفيع المستوى. كما لا تتردد في طرح الأسئلة مع علامة pywinauto . أنا صاحب مكتبة.


ملف ListView.ListItem لا هوند.

يجب البحث ليستفيو حسب اسم الفئة ، استخدام المقبل سيندمسيج () لإرسال LVM_GETITEM رسالة واستخدام بنية لفيتم للحصول على معلومات حول العناصر:

رسالة LVM_GETITEM (نظام التشغيل ويندوز)

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774953(v=vs.85).aspx

بنية لفيتم (ويندوز)

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774760(v=vs.85).aspx

قد تساعدك هذه الصفحة المرجعية:

مرجع التحكم في قائمة عرض (نظام التشغيل ويندوز) https://msdn.microsoft.com/en-us/library/windows/desktop/ff485973(v=vs.85).aspx

إديت ومع ذلك، مشكلتك لا تتعلق البرمجة لغة VB6. لذلك، أعتقد أن هذا هو منتدى خاطئ، يجب أن تسأل في المنتدى ذات الصلة إلى لغتك لاستخدام ل.





ui-automation