【问题标题】:How do I convert a wParam to a CString?如何将 wParam 转换为 CString?
【发布时间】:2012-03-07 14:02:20
【问题描述】:

我有来自 WM_KEYDOWN 消息的pMsg->wParam,我想将其转换为CString。我该怎么做?

我已经尝试了以下代码:

TCHAR ch[2];
ch[0] = pMsg->wParam;
ch[1] = _T('\0');
CString ss(ch);

但它不适用于高位 ASCII 字符。

【问题讨论】:

  • wParam 和 lParam 的使用方式不同,具体取决于传递的消息。你在这里收到什么信息?如果它是常规 Windows 消息(例如 WM_GETTEXT)或自定义消息(任何大于 WM_USER)。您能否提供更多代码来显示正在发送和接收的消息? (请注意,如果字符串在堆栈中,PostMessage 和字符串通常不能很好地一起播放,因为在接收窗口获取它时,调用者的堆栈可能已经展开并重用,导致指针无效。)
  • @BrendanMcK 我基本上在按键 WM_CHAR 上使用它,它在 englisg 语言上工作正常,但对于涉及高 ascii 字符的语言失败,可能是我终止 TCHAR 数组的方式对于其他人是错误的语言
  • 您是否为您的项目定义了 UNICODE 和 _UNICODE?如果你不这样做,那么当 TCHAR 只是一个普通的单个 ANSI 字符时,可能会发生奇怪的事情(尽管我认为它仍然应该适用于高 ASCII,除非你使用不同的代码页或其他东西......)。定义 UNICODE 和 _UNICODE 后,它应该(AFAIK)适用于任何东西(呃,UTF16 支持的任何东西)。此外,当您尝试使用高位 ASCII 键时,您是否在调试器中看到 wParam 的预期值?
  • 我的项目中定义了unicode
  • 您是否使用调试器检查了您在消息中收到的 wParam 值?如果它首先不正确,则无法将其转换为正确的字符串:) 另外,您在此处提到“postmessage”-这是由于按键而发送到您的窗口的普通 WM_CHAR ,还是来自其他代码?

标签: c++ winapi mfc cstring postmessage


【解决方案1】:

根据documentationWM_CHARwParam中发送一个字符码。备注部分的第一段说代码确实是 Unicode UTF-16 代码点。无论您是为 8 位还是 16 位 TCHAR 编译代码都是如此。

CodyGray 的评论在CString 提供各种构造函数的部分是正确的。您正在寻找的是将wchar_t 作为其第一个参数的那个(第二个参数,重复计数,默认设置为 1)。因此,要从WPARAM 构造CString,请将值转换为wchar_t。以下示例打印“0”,确认构造的字符串确实是预期的。

#include <stdio.h>
#include <Windows.h>
#include <cstringt.h>
#include <atlstr.h>
int main ()
{
  WPARAM w = 0x222D;
  CString cs ((wchar_t)w);
  printf ("%d", cs.Compare (L"\x222D"));
}

它在 _UNICODE 和 ANSI 编译模式下的工作方式相同,并且可以跨 32 位和 64 位移植。

【讨论】:

    【解决方案2】:

    问题在于wParam 包含一个指向字符数组的指针。它不是单个字符,因此您无法像在此处尝试将其分配给 ch[0] 那样自己创建字符串。

    解决方案比您预期的要容易得多。 CString 类有一个构造函数,它接受一个指向字符数组的指针,这正是您在 wParam 中所拥有的。
    (实际上,它有a bunch of constructors,几乎可以满足您的所有需求......)

    所以你要做的就是:

    CString ss(pMsg->wParam);
    

    构造函数会处理剩下的事情,将wParam指向的字符串复制到ss类型中。

    【讨论】:

    • @Peter,试试CString ss((LPCTSTR) pMsg-&gt;wParam);
    • @Frédéric Hamidi 在这种情况下 CString 始终为空
    • @Peter:API 函数可能会返回一个空字符串。在开始涉及类型转换之前,请使用调试器查看 pMsg-&gt;wParam 的实际值。
    • 抱歉,这完全不真实。 WM_CHARwParam 中发送一个字符,而不是一个指针。见msdn.microsoft.com/en-us/library/windows/desktop/…。这段代码之所以有效,可能是因为在这种情况下使用了采用 wchar_t 的构造函数。
    • @kkm:请注意,我的答案早在 cmets 中发现有问题的消息是 WM_CHAR 之前就已经写好了。我所做的假设是一个非常好的假设。几乎所有其他窗口消息都发送一串字符,而不是单个。
    猜你喜欢
    • 2023-04-01
    • 2011-11-23
    • 2011-07-29
    • 2014-11-27
    • 2011-04-30
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多