虽然WM_GETTEXT 和 WM_SETTEXT没有W版和A版,但是SendMessage有SendMessageA,SendMessageW两个版本,这样系统就能区分你发来的数据是什么类型了

解决方案 »

  1.   

    OS对于WM_SETTEXT这种消息,会把lparam参数写入一个内存映射文件,然后在接收方再去读取这个文件取出内容。至于是多字节还是unicode,OS在写入的时候肯定可以获取当前的编码是多字节还是UNICODE,然后写入文件里。实际上应该不是这么处理的。
      

  2.   


    发消息当然可以用 SendMessage,问题是处理消息的时候呢?
    如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi
    但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0
    但后来想想又觉得不正确了,如果是英文字符,这个方法还可以
    但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的
    所以还是搞不明白
      

  3.   


    所以我的提问就是说 windows 究竟是怎么判断传入的字符是 unicode 还是 ansi
      

  4.   


    发消息当然可以用 SendMessage,问题是处理消息的时候呢?
    如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi
    但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0
    但后来想想又觉得不正确了,如果是英文字符,这个方法还可以
    但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的
    所以还是搞不明白
    你看到的是用 SendMessage方法,其实底层会根据你环境的字节集来调用是A版还是W版的
      

  5.   


    发消息当然可以用 SendMessage,问题是处理消息的时候呢?
    如果是自己写的程序,根据预定义可以判断是 unicode 还是 ansi
    但 windows 封装好的 dll 内部是怎么处理 WM_GETTEXT 和 WM_SETTEXT 的还是不知道啊我昨天想到的是判断字节数,猜测 unicode 会比 ansi 多一倍的字节,那么从 wparam 传进来的字符数来检测 lparam 后面的 \0
    但后来想想又觉得不正确了,如果是英文字符,这个方法还可以
    但如果是中文字符就不好办了,因为中文字符在 ansi 里也同样占了2个字节的
    所以还是搞不明白
    你看到的是用 SendMessage方法,其实底层会根据你环境的字节集来调用是A版还是W版的
      

  6.   

    “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函数决定是否翻译消息。”