Показать сообщение отдельно
Старый 27.11.2022, 20:05   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Попробовал я набросать проект и не получилось.

Взял пример от Товарищ ♂uatr
запихнул его в C# проект (консольное приложение) - все работает (правда запускать надо debug версию, ну не суть)

Запускаем проект, он спрашивает hwnd окна
Даем ему hwnd в десятичном виде (в моем примере 67552) в ответ текст
Цитата:
Waiting for HWND input (in decimal format):
67552
HWND hex:107E0; Name:SalesTable; HWND:67552
HWND hex:107E0; Description:\Data Dictionary\Tables\SalesTable: 7; HWND:67552
т.е. он для окна может прочитать имя объекта АОТ и полный путь к нему в свойствах Name и Description. Только к полному пути еще добавляет через двоеточие число дочерних узлов. Но это нестрашно.

Оговорюсь что нужно скармливать не hwnd окна АОТ (с ClassName AxMDIChildWindow) а hwnd дочернего к нему окна (с ClassName AxPaneWnd)

Текст проекта
X++:
// [url=http://axforum.info/forums/showthread.php?p=434649#post434649]Dax 2012 получить путь к Treenode (Toolbar, tabax)[/url]
// Товарищ ♂uatr
using System;
using System.Runtime.InteropServices;
using System.Security;
using Accessibility;

namespace AotInspectWindows
{

    class Program
    {
        [DllImport("oleacc.dll")]
        private static extern int AccessibleObjectFromWindow(IntPtr hwnd, uint id, ref Guid iid,
        [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject);

        static void Main(string[] args)
        {
            object accessibleObj = null;
            string name;
            string description;
            Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
            Console.WriteLine("Waiting for HWND input (in decimal format):"); 
            string ptr = Console.ReadLine(); // вводить в десятичном формате
            IntPtr handle = new IntPtr(Convert.ToInt32(ptr));
            // int result = AccessibleObjectFromWindow(handle, (uint)OBJID.OBJID_WINDOW, ref guid, ref accessibleObj); // для такого вызова будет пустым get_accDescription() но непустым get_accName()
            int result = AccessibleObjectFromWindow(handle, (uint)OBJID.OBJID_CLIENT, ref guid, ref accessibleObj); // а для такого все ок - и get_accDescription() и get_accName() - непустые

            name = ((IAccessible)accessibleObj).get_accName(0);
            Console.WriteLine($"HWND hex:{handle.ToString("X")}; Name:{name}; HWND:{handle}");

            description = ((IAccessible)accessibleObj).get_accDescription(0);
            Console.WriteLine($"HWND hex:{handle.ToString("X")}; Description:{description}; HWND:{handle}");

            Console.ReadKey();
        }
        public enum OBJID : uint
        {
            OBJID_WINDOW = 0x00000000,
            OBJID_SYSMENU = 0xFFFFFFFF,
            OBJID_TITLEBAR = 0xFFFFFFFE,
            OBJID_MENU = 0xFFFFFFFD,
            OBJID_CLIENT = 0xFFFFFFFC,
            OBJID_VSCROLL = 0xFFFFFFFB,
            OBJID_HSCROLL = 0xFFFFFFFA,
            OBJID_SIZEGRIP = 0xFFFFFFF9,
            OBJID_CARET = 0xFFFFFFF8,
            OBJID_CURSOR = 0xFFFFFFF7,
            OBJID_ALERT = 0xFFFFFFF6,
            OBJID_SOUND = 0xFFFFFFF5,
        }
    }
}
Вложения
Тип файла: rar AotInspectWindows.rar (320.8 Кб, 38 просмотров)

Последний раз редактировалось Logger; 27.11.2022 в 20:07.