【问题标题】:GetWindowTextA or GetWindowTextWGetWindowTextA 或 GetWindowTextW
【发布时间】:2019-08-07 19:47:44
【问题描述】:

在一个 c# 应用程序中,我正在对桌面上的所有窗口执行 EnumWindows,并在回调中获取每个窗口的窗口标题。特别是一个第 3 方应用程序可以在 ansi 或 unicode 模式下运行,即使应用程序在 ansi 模式下运行,始终使用 GetWindowTextW 是否安全,或者我是否需要能够检测是否为所有外部启用了 unicode 模式应用程序以确定我需要调用哪个 GetWindowText?我遇到的问题是我们甚至在 unicode 应用程序上也一直在使用 GetWindowTextA 并且一直工作到现在。当标题栏有中文字符时,由于明显的原因无法返回正确的窗口标题。

【问题讨论】:

  • 它总是安全和最佳的选择致电GetWindowTextW
  • AFAIK所有窗口都是一样的,系统在幕后使用unicode。 “A”和“W”变体只是客户端调用 Windows NT 系统的两种可能方式,它们与其他应用程序的运行方式无关。长话短说:只需使用“W”,不要想太多。 :-)

标签: c# winapi pinvoke


【解决方案1】:

宽函数始终是最佳选择(假设您不关心 Windows 95/98/ME)。

窗口文本可以来自两个地方:

  • Unicode 文本“内部存储在 HWND 中”。大多数顶级窗口都在此处存储它们的文本。 GetWindowTextW 总是能够检索到此文本。

  • 某些应用程序会动态处理 WM_*TEXT* 消息。窗口管理器为您处理字符转换(SendMessageASendMessageW),因此您无需考虑。

GetWindowTextW will not send the WM_*TEXT* messages if you call it on a window in a different process。如果您想始终在其他进程中获得“正确”的窗口文本,您必须先手动调用SendMessageTimeoutW(..., WM_GETTEXT, ...),如果超时失败,请回退到GetWindowTextW

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多