Spy ++在Qt应用程序中没有到达按钮

use*_*697 3 c# winapi qt spy++ findwindow

我正在尝试获取按钮的属性,但是当我拖动间谍++的查找窗口工具时,它没有到达按钮(在这种情况下为标题"iniciarnravação"),而是按钮网格父级,如下所示:

在此输入图像描述

为什么这样,我如何获得按钮属性?我尝试使用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();
        }
Run Code Online (Sandbox Code Playgroud)

像这样使用:

 IntPtr parent = FindWindow(IntPtr.Zero, "my app title");
 printWindows(parent, 0);
Run Code Online (Sandbox Code Playgroud)

但是我看不到与Iniciargravação按钮有关的任何东西.

pep*_*ppe 6

Qt UI控件(小部件,Qt词典.Aka按钮,行编辑,组合框等)不受本机控件的支持.他们只是从他们那里窃取本机用户界面的外观和感觉并模仿它.

出于这个原因,你不会使用一些"间谍"工具找到那些控件 - 你仍然可以通过可访问性找到它们(*).

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

(*)Qt附带的控件是accessibile,但是如果有人手动重新实现看起来像按钮的东西并且没有提供可访问性,那么你就无法做很多事情.