2017-03-29 88 views
4

オートメーションインターフェイス(C++/C#でコーディング)を使用してコントロールの値/テキストを取得する必要があります。私はUI Automation APIにしようと、これはInspectで撮影し、いくつかの結果である: Inspect ListviewVisual Basic 6のオートメーションサポートListView

Inspect slider UIオートメーションがpaneとしてこれらのコントロールを認識し、私は、リストビューのテキストアイテムを取得したり、通常のように/セットスライダー値を取得することはできません。
MSAA,Automation Spyのような他のツールを試しても同じ結果が得られます。

研究の結果、ListView20WndClass,Slider20WndClassなどのクラス名を持つコントロールがVisual Basic 6コントロールに属していることがわかりました。
したがって、これらのタイプのコントロールもサポートするAPIはありますか?

備考1: これらのコントロールをサポートすることができRanorexという名前のツールがあります(悲しいことに、それは€3490商用ライセンスである)、と私は基礎となるAPIを使用したか分からない:
enter image description here

enter image description here


備考2 UIオートメーションはまだ得ることができることをテスト対象のアプリケーションで使用されるいくつかの他の制御タイプがあります。値:

  • ThunderRT6FormDC:ボタン
  • ThunderRT6CheckBoxとして認識します:悲しいことに...
  • などのチェックボックスとして
  • を認識し、彼らは埋め込みウィンドウ
  • ThunderRT6CommandButtonとして認めますListView20WndClassおよびスライド

    #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; 
    } 
    


    :r20WndClass
    が、両方は、私は単純なテキストを取得するためのプログラムが、まだ動作していないが(Unicode文字セットとしてコンパイル)作成、更新1 ペインよう


を認識します5..4..3..2..1を数えるときは、画面上のいくつかの要素の上にマウスを置いて確認してください。
しかし、私のリストビュー上にマウス:

  • VB6リストビュー(ListView20WndClass):それは空の文字列
  • MFC/Winフォームのリストビュー(予想は、私の例として101である)(SysListView32)を返します:マウスの下のアプリケーションが動作しなくなった(コンソールアプリケーションがまだ実行中)
+1

ListView20WndClassはVB6のリストビューですが、これはMicrosoftによって作成されたカスタムジョブです。以前のバージョンとは異なり、共通コントロールのlistviewに基づいていないため、UI Automationに先立っています。これは同じメッセージングAPIを実装しているため、クロスプロセスフープを飛び越してLVM_GETITEMTEXTらを使用して読むことができます。 –

+0

更新された質問を確認できますか? – phibao37

答えて

1

ListView.ListItemオブジェクトはhwndしていません。

あなたがメッセージLVM_GETITEMやアイテムについての情報を取得するためにLVITEM構造を使用して送信するために)、クラス名でListViewコントロールを検索する次の使用のSendMessage(必要があります。

LVM_GETITEMメッセージ(Windowsの場合)

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

LVITEM構造(Windowsの場合)

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

このリファレンス・ページには、あなたを助けることがあります。

リストビューコントロールリファレンス(Windowsの場合)https://msdn.microsoft.com/en-us/library/windows/desktop/ff485973(v=vs.85).aspx

EDIT はしかし、あなたの問題はVB6言語プログラミングとは関係ありません。 これは間違ったフォーラムだと思います。使用する言語に関連するフォーラムで質問してください。

+0

更新された質問をチェックできますか? – phibao37

1

pywinautoは、Win32 APIを使用してVB6アプリケーションを自動化することができます(すべての詳細はLVM_GETITEMメッセージなどを隠しています)。ほとんどのコントロールは、ボタン、チェックボックス、リストビューとして認識されます。リストビューについては、supported class namesを参照してください。あなたのケースはここにあります。

flexible waitsを使用する場合、Win32 APIはUIオートメーションよりも速く動作するはずです。 UI Automationもサポートされています。

Getting Started Guideは、第一歩を踏み出し、高いレベルの概念を学ぶのに役立ちます。また、pywinautoタグで質問をすることもできます。私は図書館の管理者です。

関連する問題