使用pinvoke从点获取表单句柄

新石器时代

我正在尝试使用p / invoke从点获取窗口句柄,其中window是一种形式,而不是任何子控件。我有一个简单的界面,用户可以在其中输入X和Y,然后使用“查找”按钮来调用win32并获取必要的信息。我的问题是,窗口不一定是一种形式,它也可以是控件。参见下面的屏幕截图-在(100,100)恰好是记事本的文本区域,其中写入了“ StackOverflow”。结果,“找到”窗口显示“ StackOverflow”。

在此处输入图片说明

有什么办法可以限制窗口类型为窗体?对于以下测试用例,预期结果为“无标题-记事本”。或者,是否有办法要求另一个应用程序的控件提供其窗体的句柄?简而言之,我需要从(x,y)点获取表单标题。按钮点击处理程序代码:

private void btn_Find_Click(object sender, EventArgs e)
{
  int xPoint = Convert.ToInt32(txt_WindowX.Text);
  int yPoint = Convert.ToInt32(txt_WindowY.Text);

  IntPtr hWnd = Win32.GetWindowHandleFromPoint(xPoint, yPoint);
  txt_FormTitle.Text = Win32.GetWindowTitle(hWnd);
}

Win32类的主要部分来自以下答案:

下面提供了完整的Win32类代码:

public class Win32
{
  /// <summary>
  /// 
  /// </summary>
  /// <param name="hwnd"></param>
  /// <remarks>https://stackoverflow.com/questions/4604023/unable-to-read-another-applications-caption</remarks>
  public static string GetWindowTitle(IntPtr hwnd)
  {
    if (hwnd == IntPtr.Zero)
      throw new ArgumentNullException("hwnd");
    int length = Win32.SendMessageGetTextLength(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
    if (length > 0 && length < int.MaxValue)
    {
      length++; // room for EOS terminator
      StringBuilder sb = new StringBuilder(length);
      Win32.SendMessageGetText(hwnd, WM_GETTEXT, (IntPtr)sb.Capacity, sb);
      return sb.ToString();
    }
    return String.Empty;
  }

  public static IntPtr GetWindowHandleFromPoint(int x, int y)
  {
    var point = new Point(x, y);
    return Win32.WindowFromPoint(point);
  }

  const int WM_GETTEXT = 0x000D;
  const int WM_GETTEXTLENGTH = 0x000E;

  [DllImport("user32.dll")]
  private static extern IntPtr WindowFromPoint(Point p);

  [DllImport("User32.dll", EntryPoint = "SendMessage")]
  private static extern int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
  [DllImport("User32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
  private static extern IntPtr SendMessageGetText(IntPtr hWnd, int msg, IntPtr wParam, [Out] StringBuilder lParam);
}
戴维·赫弗南

您需要找到顶层窗口。GetWindowHandleFromPoint产生的窗口开始然后GetParent重复调用,直到找到没有父窗口。没有父窗口的窗口就是您要寻找的顶层窗口。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取菜单句柄

来自分类Dev

使用PInvoke将句柄传递给托管对象时出现问题

来自分类Dev

如何使用JAVA获取sessionStorage的句柄

来自分类Dev

如何在angularjs中三个选择菜单句柄

来自分类Dev

在表单加载之间使用相同的句柄进行控制

来自分类Dev

在表单加载之间使用相同的句柄进行控制

来自分类Dev

反应句柄表单提交

来自分类Dev

如何通过Java代码在Neo4j中使用数据库索引创建唯一节点(或获取现有节点句柄)?

来自分类Dev

dynamicViewPanel-使用xp:dominoView中的var获取视图句柄

来自分类Dev

如何使用JNA在Java中获取Chrome进程的句柄

来自分类Dev

如何使用React函数组件获取当前对象的句柄

来自分类Dev

使用AWS Java SDK获取负载均衡器的句柄

来自分类Dev

使用js获取嵌套数组对象的句柄

来自分类Dev

获取IAccessible元素的句柄

来自分类Dev

使用Javascript获取表单值

来自分类Dev

Microsoft Outlook使用表单获取

来自分类Dev

在WPF中获取MainWindow的句柄

来自分类Dev

Matlab图形窗口-获取句柄

来自分类Dev

在PyGI中获取窗口句柄

来自分类Dev

如何获取进程的文件句柄?

来自分类Dev

从句柄函数获取值

来自分类Dev

libusb无法获取设备句柄

来自分类Dev

硒中的获取窗口句柄

来自分类Dev

从 SurfaceTexture 获取 OpenGL 纹理句柄

来自分类Dev

使用共享点Web服务获取共享点列表的行

来自分类Dev

使用R计算字符串中的单句号和双句号

来自分类Dev

使用点差获取多个价值

来自分类Dev

使用点表示法获取innerHTML或textContent

来自分类Dev

wxPython-使用wx python模块获取现有的windowDC /句柄?