关于 WM_GETTEXT 与 WM_SETTEXT 的一些小问题

Sandrer 2014-07-09 09:38:08
一直搞c++,也没怎么注意 unicode 这个问题,因为工程默认新建的时候都是 unicode 编码的
但现在在搞一个库,要考虑到开发者的环境有可能不是 unicode 的
那么为了达到通用肯定要用两个以上的版本了

但我发现 windows 的消息里,wm_gettext 和 wm_settext 是没有区分 unicode 和 ansi 的
那么这个消息是怎么区分 lparam 里的参数究竟是 char 还是 wchar_t???

网上(包括msdn)都说只要传递 TCHAR 类型,系统会自动识别
这个我明白,因为 TCHAR 宏会根据定义自己切换成 char 或 wchar_t
但我认为那是在自己的程序里才有用的啊
WM_GETTEXT 和 WM_SETTEXT 这俩消息已经封装在一个 dll 里了啊
既然已经封装好了就不可能再给你重新编译的啊?

其实主要的问题还是问系统 dll 里是怎么知道这个 lparam 参数是宽字符还是多字节字符?
...全文
966 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2014-07-10
  • 打赏
  • 举报
回复
引用 5 楼 Sandrer 的回复:
[quote=引用 1 楼 fishion 的回复:] 虽然WM_GETTEXT 和 WM_SETTEXT没有W版和A版,但是SendMessage有SendMessageA,SendMessageW两个版本,这样系统就能区分你发来的数据是什么类型了
发消息当然可以用 SendMessage,问题是处理消息的时候呢? 如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi 但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊 我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0 但后来想想又觉得不正确了,如果是英文字符,这个方法还可以 但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的 所以还是搞不明白[/quote] 你看到的是用 SendMessage方法,其实底层会根据你环境的字节集来调用是A版还是W版的
Sandrer 2014-07-10
  • 打赏
  • 举报
回复
引用 3 楼 zhousitiaoda 的回复:
OS对于WM_SETTEXT这种消息,会把lparam参数写入一个内存映射文件,然后在接收方再去读取这个文件取出内容。至于是多字节还是unicode,OS在写入的时候肯定可以获取当前的编码是多字节还是UNICODE,然后写入文件里。实际上应该不是这么处理的。
所以我的提问就是说 windows 究竟是怎么判断传入的字符是 unicode 还是 ansi
Sandrer 2014-07-10
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
虽然WM_GETTEXT 和 WM_SETTEXT没有W版和A版,但是SendMessage有SendMessageA,SendMessageW两个版本,这样系统就能区分你发来的数据是什么类型了
发消息当然可以用 SendMessage,问题是处理消息的时候呢? 如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi 但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊 我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0 但后来想想又觉得不正确了,如果是英文字符,这个方法还可以 但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的 所以还是搞不明白
zhousitiaoda 2014-07-10
  • 打赏
  • 举报
回复
当然这也是我自己的猜测而已
zhousitiaoda 2014-07-10
  • 打赏
  • 举报
回复
OS对于WM_SETTEXT这种消息,会把lparam参数写入一个内存映射文件,然后在接收方再去读取这个文件取出内容。至于是多字节还是unicode,OS在写入的时候肯定可以获取当前的编码是多字节还是UNICODE,然后写入文件里。实际上应该不是这么处理的。
fishion 2014-07-10
  • 打赏
  • 举报
回复
当然这也是我自己的猜测而已
fishion 2014-07-10
  • 打赏
  • 举报
回复
虽然WM_GETTEXT 和 WM_SETTEXT没有W版和A版,但是SendMessage有SendMessageA,SendMessageW两个版本,这样系统就能区分你发来的数据是什么类型了
Sandrer 2014-07-10
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
“IswindowUnicode 函数功能:该函数确定指定的窗口是否是一个本地Unicode窗口。 函数原型: BOOL IswindowUnicode(HWND hwnd); 参数: hWnd:被测试窗口的句柄。 返回值:如果窗口是一个本地Unicode窗口,返回值为非零;如果窗口不是一个本地Unicode窗口,返回值为零,同时说明窗口是一个ANSI窗口。 备注;一个窗口的字符集是由函数RegosterClass决定的。如果窗口类是以ANSI版的RegisterClass ( RegjsterClassA)注册的,则窗口字符集是ANSI的;如果窗口类是以Unicode版的Registerclass( RegisterClassW)注册的,则窗口字符集是Unicode。 系统为窗口消息自动作Unicode和ANSI的双向翻译。例如,如果一个使用Unicode字符集的窗口测到一个ANSI窗口消息,则系统在调用窗口过程之前先将该消息转换为Unicode消息。系统调用lsWindowUnicode函数决定是否翻译消息。”
明天回公司试试
schlafenhamster 2014-07-10
  • 打赏
  • 举报
回复
“IswindowUnicode 函数功能:该函数确定指定的窗口是否是一个本地Unicode窗口。 函数原型: BOOL IswindowUnicode(HWND hwnd); 参数: hWnd:被测试窗口的句柄。 返回值:如果窗口是一个本地Unicode窗口,返回值为非零;如果窗口不是一个本地Unicode窗口,返回值为零,同时说明窗口是一个ANSI窗口。 备注;一个窗口的字符集是由函数RegosterClass决定的。如果窗口类是以ANSI版的RegisterClass ( RegjsterClassA)注册的,则窗口字符集是ANSI的;如果窗口类是以Unicode版的Registerclass( RegisterClassW)注册的,则窗口字符集是Unicode。 系统为窗口消息自动作Unicode和ANSI的双向翻译。例如,如果一个使用Unicode字符集的窗口测到一个ANSI窗口消息,则系统在调用窗口过程之前先将该消息转换为Unicode消息。系统调用lsWindowUnicode函数决定是否翻译消息。”
Sandrer 2014-07-10
  • 打赏
  • 举报
回复
引用 7 楼 fishion 的回复:
[quote=引用 5 楼 Sandrer 的回复:] [quote=引用 1 楼 fishion 的回复:] 虽然WM_GETTEXT 和 WM_SETTEXT没有W版和A版,但是SendMessage有SendMessageA,SendMessageW两个版本,这样系统就能区分你发来的数据是什么类型了
发消息当然可以用 SendMessage,问题是处理消息的时候呢? 如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi 但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊 我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0 但后来想想又觉得不正确了,如果是英文字符,这个方法还可以 但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的 所以还是搞不明白[/quote] 你看到的是用 SendMessage方法,其实底层会根据你环境的字节集来调用是A版还是W版的[/quote]

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧