如何在 C# 中使用 SendMessageTimeout 获取窗口标题

2024-03-29

我需要枚举所有打开的窗口并获取它们的标题,但问题是某些窗口属于同一进程但属于不同的线程,该线程被阻塞(等待互斥体)。因此,我不能对属于我自己的进程的窗口使用 GetWindowText,因为这将导致 SendMessage 调用,这将阻止我的代码执行(因为它将等待被阻止线程的 relpy)。

顺便说一句,这里有一篇关于 GetWindowText 内部如何工作的有趣文章:http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx http://blogs.msdn.com/b/oldnewthing/archive/2003/08/21/54675.aspx

作为解决方案,决定对窗口使用 SendMessageTimeout 来检索其标题,但我无法使其工作。我正在做的是:

[DllImport("User32.dll")]
public static extern int SendMessageTimeout(
  IntPtr hWnd, 
  int uMsg, 
  int wParam, 
  int lParam, 
  int fuFlags, 
  int uTimeout, 
  out StringBuilder lpdwResult);

...

StringBuilder sb = new StringBuilder(256);
int result = Win32API.SendMessageTimeout(
  hWnd, 
  0x0D /*WM_GETTEXT*/, 
  256, 
  0, 
  10 /*SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG*/, 
  500, 
  out sb);

但我总是得到 0 意味着函数失败,并且 sb 始终为空。 有任何想法吗? 多谢。


@Alex 已经给了你正确的答案。但由于我已经输入了代码,因此您可以使用以下 P/Invoke 声明。

[DllImport("User32.dll", SetLastError=true)] 
public static extern int SendMessageTimeout( 
  IntPtr hWnd,  
  uint uMsg,  
  uint wParam,
  StringBuilder lParam,  
  uint fuFlags,  
  uint uTimeout,  
  IntPtr lpdwResult);

将 StringBuilder 传递给 lParam,因为WM_GETTEXT http://msdn.microsoft.com/en-us/library/ms632627(VS.85).aspx填充由 lParam 指定的缓冲区,您只需为 lpdwResult 传递 IntPtr.Zero 即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中使用 SendMessageTimeout 获取窗口标题 的相关文章

随机推荐

  • 是否可以获取所有实现接口的类? [复制]

    这个问题在这里已经有答案了 我可以通过反思或类似的方式来做到这一点吗 没有 100 可靠的方法可以做你想做的事 原因是 Java 中类加载的工作方式 Java 中的类是 按需 加载的 第一次在代码中引用类 无论是静态还是动态 时 JVM 将
  • int64_t的宽度,总是64位吗?

    对于以下代码 static inline float fix2float int64 t f return float f 1 lt lt 60 lt error here 编译器向我发出这些警告 warning left shift co
  • Flex 项目均匀分布,但第一个项目左对齐

    弹性盒的justify content space around使我的列表项水平均匀分布 有没有办法拥有完全相同的东西 唯一的区别是左边的第一个项目左边没有空间 也就是说 列表从容器的左边缘 开始 而不是使用justify content
  • kafka Consumer 0.10 向后兼容吗?

    kafka消费者0 10与0 9代理兼容吗 如果我没记错的话 0 9 消费者仍然被认为是测试版 而 0 10 是稳定的 对吗 这就是为什么我有兴趣使用 0 10 版本 但我的代理版本是 0 9 我还不想升级 如果您想使用 0 10 客户端
  • 如何在响应中返回特定字符后关闭 netcat 连接?

    我们有一个非常简单的 TCP 消息传递脚本 它将一些文本发送到服务器端口 该端口返回并显示响应 我们关心的脚本部分看起来像这样 cat someFile netcat somehost 1234 一旦我们获得特定的字符代码 具体来说 001
  • “HttpRequest”不包含“Params”的定义

    我在用着 NET核心2 0 2创建一个ASP NET网络应用程序在C 每次我使用Request Url在我的控制器中 dotnet run输出错误 错误CS1061 HttpRequest 不包含 Url 的定义 并且找不到接受 HttpR
  • 从超类 static main 创建子类

    我有一个通用的抽象类 SuperClass 我想要有一个main方法 这将是每个子类的默认 main 方法 并且会执行相同的操作 但具有派生并调用它的正确子类对象 像这样 public abstract class SuperClass s
  • 错误:行太大:大小 8168,最大大小 8164

    我正在使用 PostgreSql 9 2 我有很多角色 并且所有角色都被授予了模式的 USAGE 权限 当我尝试创建新用户并授予权限时 我收到错误 CREATE ROLE my user GRANT USAGE on schema my s
  • 如何检查 PHP 是否打开了端口 465 和 587?

    我正在尝试使用 PHPMailer 通过 SMTP 和 gmail 发送电子邮件 我使用的确切脚本适用于其他服务器 但不适用于该特定托管公司的服务器 我已经检查过phpinfo 它告诉我allow url fopen is on并且没有di
  • 寻求有关以最小的开销在 Netflix Eureka 可发现的 Spring Boot 服务上进行开发的正确方法的建议

    我们正在运行一个基于 Spring Boot 的环境 其中包含大约 15 个微服务和一个注册到 Eureka 的 Zuul 边缘网关 目前 我已经设置了所有微服务通过 Zuul 网关调用其他微服务 例如 如果 serviceA 需要调用 s
  • 带接收器的 Kotlin 函数参数,从 Groovy 调用

    Kotlin 和 Groovy 都提供了一种编写高阶函数的方法 其中函数参数具有隐式接收器 科特林版本 class KotlinReceiver fun hello println Hello from Kotlin class Kotli
  • 如果值为 null,则在提交之前使用 js 或 jQuery 更改输入文本值

    如果输入值为 null 如何在提交之前使用 js 或 jQuery 更改输入文本值 感谢帮助 With jQuery http jquery com 您可以使用以下命令将回调绑定到提交事件 submit http api jquery co
  • 为什么我应该始终启用编译器警告?

    我经常听说在编译 C 和 C 程序时我应该 始终启用编译器警告 为什么这是必要的 我怎么做 有时我也听说我应该 将警告视为错误 我是不是该 我怎么做 为什么我应该启用警告 众所周知 C 和 C 编译器不善于报告一些常见的程序员错误默认情况下
  • Capybara 无法识别动态添加的 DOM 元素?

    在使用 Capybara 和 Selenium 时 我似乎在测试使用 jQuery 执行的 javascript 操作时遇到了麻烦 预期的行为是当用户单击链接 添加资源 时动态生成表单 Capybara 将能够单击该链接 但无法识别新的表单
  • Greasemonkey:新更新中“未定义 GM_xmlhttpRequest”

    为什么这个简单的 Greasemonkey 脚本对我不起作用https jsfiddle net pghnsw8z 1 https jsfiddle net pghnsw8z 1 我的意思是 在进行 ajax 调用时 我没有得到成功的响应
  • 无需表单即可在屏幕上绘图

    是否可以在不使用表单应用程序的情况下在屏幕上创建一个大的白色矩形 如果可能的话 它应该覆盖整个屏幕 我知道我必须使用System Drawing并尝试了几个步骤 但没有一个真正在我的屏幕上打印任何内容 方法一 调用Windows API 你
  • ANDROID从url获取内容

    我在使用 Android 时遇到问题 我必须能够从生成内容的 URL 中读取内容 然后将它们放入数组中 分割读取的字符串 我使用了不同的方法 但无法读取该字符串 我能怎么做 这是我现在使用的函数 继续出现字符串 nn va private
  • 具有可比较列表与 TreeSet

    选项 1 创建一个实现 Comparable 的列表 并在每次添加值时使用 collections sort List l 对它进行排序 选项 2 创建一个 TreeSet 它始终保持排序 哪一个会更快 我问这个是因为 List 为我提供了
  • git am 错误:“补丁不适用”

    我正在尝试使用 git 将多个提交从一个项目移动到第二个类似的项目 所以我创建了一个补丁 包含 5 个提交 git format patch 4af51 stdout gt changes patch 然后将补丁移动到第二个项目的文件夹并想
  • 如何在 C# 中使用 SendMessageTimeout 获取窗口标题

    我需要枚举所有打开的窗口并获取它们的标题 但问题是某些窗口属于同一进程但属于不同的线程 该线程被阻塞 等待互斥体 因此 我不能对属于我自己的进程的窗口使用 GetWindowText 因为这将导致 SendMessage 调用 这将阻止我的