オートメーションインターフェイス(C++/C#でコーディング)を使用してコントロールの値/テキストを取得する必要があります。私はUI Automation APIにしようと、これはInspectで撮影し、いくつかの結果である: Visual Basic 6のオートメーションサポートListView
UIオートメーションが
pane
としてこれらのコントロールを認識し、私は、リストビューのテキストアイテムを取得したり、通常のように/セットスライダー値を取得することはできません。
MSAA,Automation Spyのような他のツールを試しても同じ結果が得られます。
研究の結果、ListView20WndClass
,Slider20WndClass
などのクラス名を持つコントロールがVisual Basic 6コントロールに属していることがわかりました。
したがって、これらのタイプのコントロールもサポートするAPIはありますか?
備考1: これらのコントロールをサポートすることができRanorexという名前のツールがあります(悲しいことに、それは€3490商用ライセンスである)、と私は基礎となるAPIを使用したか分からない:
備考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)を返します:マウスの下のアプリケーションが動作しなくなった(コンソールアプリケーションがまだ実行中)
ListView20WndClassはVB6のリストビューですが、これはMicrosoftによって作成されたカスタムジョブです。以前のバージョンとは異なり、共通コントロールのlistviewに基づいていないため、UI Automationに先立っています。これは同じメッセージングAPIを実装しているため、クロスプロセスフープを飛び越してLVM_GETITEMTEXTらを使用して読むことができます。 –
更新された質問を確認できますか? – phibao37