Spy++ не достигает кнопки в приложении Qt

Я пытаюсь получить свойства кнопки, но когда я перетаскиваю инструмент окна поиска spy++, он не достигает кнопки (в этом случае заголовка «iniciar gravação»), а скорее родителя сетки кнопок, например:

введите здесь описание изображения

Почему это так и как я могу получить свойства кнопки? Я пробовал использовать инструмент auto it info, но получаю такое же поведение.

Я попытался получить свойства этой кнопки из кода С#, например:

    public class WindowHandleInfo
    {
        private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);

        [DllImport("user32")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);

        private IntPtr _MainHandle;

        public WindowHandleInfo(IntPtr handle)
        {
            this._MainHandle = handle;
        }

        public List<IntPtr> GetAllChildHandles()
        {
            List<IntPtr> childHandles = new List<IntPtr>();

            GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
            IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);

            try
            {
                EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
                EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
            }
            finally
            {
                gcChildhandlesList.Free();
            }

            return childHandles;
        }

        private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
        {
            GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);

            if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
            {
                return false;
            }

            List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
            childHandles.Add(hWnd);

            return true;
        }
    }


 void printWindows(IntPtr parent, int tabLevel)
        {
            var w = new WindowHandleInfo(parent);
            foreach (IntPtr h in w.GetAllChildHandles())
            {
                string caption = GetTextBoxText(h) ?? "not found";
                Debug.Write(new string('\t', tabLevel));
                Debug.WriteLine(caption);
                printWindows(h, tabLevel + 1);
            }
        }

 int GetTextBoxTextLength(IntPtr hTextBox)
        {
            // helper for GetTextBoxText
            const int WM_GETTEXTLENGTH = 0x000E;
            int result = SendMessage(hTextBox, WM_GETTEXTLENGTH, 0, IntPtr.Zero);
            return result;
        }

        string GetTextBoxText(IntPtr hTextBox)
        {
            const int WM_GETTEXT = 0x000D;
            int len = GetTextBoxTextLength(hTextBox);
            if (len <= 0) return null;  // no text
            StringBuilder sb = new StringBuilder(len + 1);
            SendMessage(hTextBox, WM_GETTEXT, len + 1, sb);
            return sb.ToString();
        }

используя вот так:

 IntPtr parent = FindWindow(IntPtr.Zero, "my app title");
 printWindows(parent, 0);

Но я не вижу ничего, связанного с кнопкой Iniciar gravacão.


person user834697    schedule 08.07.2016    source источник
comment
это точно кнопка? можно было нарисовать?   -  person Daniel A. White    schedule 08.07.2016
comment
@DanielA.White Я не знаю. Как я могу знать наверняка? Я знаю, что приложение было построено с использованием интерфейса Qt, если это имеет значение...   -  person user834697    schedule 08.07.2016
comment
другие инструменты, такие как инспектор Windows, ведут себя так же, как инструмент spy++/auto it info   -  person user834697    schedule 08.07.2016
comment
это имеет большое значение, я уверен. qt должен делать что-то с помощью скинов, независимо от платформы.   -  person Daniel A. White    schedule 08.07.2016
comment
Не все, что выглядит как элемент управления, поддерживается родным элементом управления. Обычно систему используют для рендеринга виджетов, но реализуют настраиваемое поведение. В таком случае вам нужно будет использовать автоматизацию пользовательского интерфейса. для доступа к доступному дочернему элементу. Используйте инструмент Проверить, чтобы убедиться, что элемент управления реализует необходимые интерфейсы. (Вам не повезло, если это не так. Вы ничего не можете сделать.)   -  person IInspectable    schedule 08.07.2016
comment
Я попробую этот инструмент проверки и вернусь, чтобы сказать, сработало ли оно. Приложение с открытым исходным кодом, при условии, что мне удастся успешно открыть его в моем редакторе (вероятно, создателе VS или Qt), если оно пользовательское, использование SendMessage() для отправки BN_CLICKED не будет работать, не так ли? моя цель нажать на эту кнопку   -  person user834697    schedule 08.07.2016
comment
Я знаю только об интерфейсе, который сделан с использованием Qt...   -  person user834697    schedule 08.07.2016
comment
Spy++ также не читает элементы управления WPF по той же причине. Это устаревший инструмент.   -  person Kuba hasn't forgotten Monica    schedule 08.07.2016
comment
Что используется вместо сейчас?   -  person user834697    schedule 08.07.2016
comment
@KubaOber: Это чушь собачья, извини. Spy++ не устарел. Он по-прежнему активно поддерживается MS, и последняя версия Visual Studio (2015) поставляется с новой версией. Он ограничен родными элементами управления, но это не делает его устаревшим.   -  person IInspectable    schedule 08.07.2016
comment
@IInspectable Он активно поддерживается, поскольку собственные элементы управления все еще работают, компилятор ресурсов все еще работает и т. Д. Это не делает его устаревшим.   -  person Kuba hasn't forgotten Monica    schedule 08.07.2016
comment
@KubaOber: нет ничего более широко используемого, чем собственные элементы управления, будь то прямые приложения C, оболочки Borland VCL, Microsoft MFC или Windows Forms. На основании какой информации вы считаете его устаревшим?   -  person IInspectable    schedule 09.07.2016
comment
@IInspectable Насколько я понимаю, все это полезно, если вы поддерживаете существующие проекты, но я сомневаюсь, что какая-либо новая разработка будет использовать MFC или WinForms. Даже VCL сейчас находится на системе жизнеобеспечения. Я думаю, что если технология не подходит для новых, современных разработок, правильный термин для использования устарел. Это не значит, что с этим что-то изначально не так, кроме этого, конечно.   -  person Kuba hasn't forgotten Monica    schedule 09.07.2016
comment
@KubaOber: Как вы считаете, для каких современных дизайнов родные элементы управления Windows не подходят? Если в вашем списке функций, которые вы хотите поддерживать, есть поддержка клавиатуры, то нет ни одной конкурирующей технологии. Очевидно, что вас, как сторонника Qt, в любом случае не волнуют пользовательские интерфейсы клавиатуры, поэтому ваше мнение может отличаться. В любом случае, называть родные элементы управления Windows устаревшими — смехотворное и необоснованное заявление.   -  person IInspectable    schedule 09.07.2016


Ответы (1)


Элементы управления пользовательского интерфейса Qt (виджеты, в лексиконе Qt. Кнопки, строки редактирования, поля со списком и т. д.) не поддерживаются собственными элементами управления. Они просто крадут внешний вид собственного пользовательского интерфейса и имитируют его.

По этой причине вы не найдете эти элементы управления с помощью некоторых из этих «шпионских» инструментов — вы все равно можете найти их с помощью специальных возможностей (*).

Или вы можете проверить свое приложение с помощью других инструментов, специфичных для Qt, таких как GammaRay для отладки или Squish для тестирования пользовательского интерфейса.

(*) элементы управления, поставляемые с Qt, являются доступными, но если кто-то вручную повторно реализует нечто, выглядящее как кнопка, и не обеспечивает доступность, то вы ничего не можете с этим поделать.

person peppe    schedule 08.07.2016
comment
Я не вижу предварительно собранного двоичного файла GammaRay для Windows. Должен ли я действительно компилировать его самостоятельно? Squish обрабатывает мой запрос, я получу результат в течение 24 часов. Есть ли другой альтернативный инструмент? моя цель - отправить сообщение о щелчке в приложение, эквивалентное SendMessage(btn, BN_CLICKED, 0, IntPtr.Zero); в собственных элементах управления. - person user834697; 09.07.2016
comment
Но с какой целью, позвольте спросить? Сценарии? Отладка? (В любом случае, ответ положительный, пока вы должны скомпилировать его самостоятельно.) - person peppe; 09.07.2016
comment
Автоматизация. Это приложение делает то, что я не мог сделать сам, поэтому я использую внешнее приложение и управляю им, устанавливая его файлы конфигурации и нажимая кнопку для запуска процесса. Я не создаю никаких вирусов. - person user834697; 09.07.2016