gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:25:27 25 4
gpt4 key购买 nike

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

enter image description here

为什么会这样,我怎样才能获得按钮属性?我尝试使用 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 词典中。又名按钮、行编辑、组合框等)不受 native 控件支持。他们只是从他们那里窃取 native UI 的外观和感觉并模仿它。

因此,您不会使用某些“ spy ”工具找到这些控件——尽管 (*),您仍然可以通过辅助功能找到它们。

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

(*) Qt 附带的控件是可访问的,但是如果有人手动重新实现了一些看起来像按钮 并且不为其提供可访问性的东西,那么您将无能为力。

关于c# - Spy++ 无法到达 Qt 应用程序中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38274182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com