Spy++ 无法到达 Qt 应用程序中的按钮

Spy++ doesn't reach button in Qt application

我正在尝试获取按钮的属性,但是当我拖动 spy++ 的查找 window 工具时,它没有到达按钮(在这种情况下是标题 "iniciar gravação")而是按钮网格 parent,像这样:

这是为什么?如何获取按钮属性?我尝试使用 auto it info 工具,但我得到了相同的行为。

我尝试从 C# 代码中获取按钮属性,如下所示:

    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 gravação 按钮相关的任何内容。

Qt UI 控件(小部件,在 Qt 词典中。也称为按钮、行编辑、组合框等。)不受本机控件支持。他们只是从他们那里窃取了原生 UI 的外观和感觉并模仿它。

因此,您将无法使用其中一些 "spy" 工具找到这些控件——不过,您仍然可以通过辅助功能找到它们 (*)。

或者,您可以使用其他特定于 Qt 的工具检查您的应用程序,例如 GammaRay for debugging or Squish 用于 UI 测试。

(*) Qt 附带的控件是可访问的,但是如果有人手动重新实现了一些 看起来像按钮 并且不提供可访问性的东西,那么你不能这样做很多关于那个。