程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用WM_PASTE 和 WM_CHAR 消息時中文亂碼總結,

使用WM_PASTE 和 WM_CHAR 消息時中文亂碼總結,

編輯:C++入門知識

使用WM_PASTE 和 WM_CHAR 消息時中文亂碼總結,


  當我們需要設置編輯框顯示文本的時候,如果其它方式無法實現,可以試試WM_PASTE 和 WM_CHAR。

  但使用這兩種消息很容易出現中文亂碼的情況,這一般是編碼問題,可參考如下幾點:

 

  1,中文應采用UNICODE編碼。

  2,WM_PASTE關鍵點在於粘貼板數據的設置:

       1,SetClipboardData  的數據格式應該設置為 CF_UNICODETEXT

       2,GlobalAlloc 最好設置為  GMEM_MOVEABLE, 並且cpy字符串時要使用unicode編碼字符串。

 

  3,WM_CHAR關鍵點:

       1,原始字符串unicode類型

       2,取出要發送的中文的時候直接取出完整漢字,不要按位。一個漢字只需要SendMessage一次!不要被抄來抄去的文章給忽悠了。

 

  4,當然,其實首先要確定英文是正常的。也就是程序本身沒有寫錯哦

 

示例代碼:

WM_PASTE 前的粘貼板設置函數

 

void  SetClipBoardText(TCHAR *szText)
{
    if (::OpenClipboard(GetSafeHwnd()) && ::EmptyClipboard())
    {
        int iBufLen = lstrlen(szText);
        HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE,  iBufLen + 2);;
        char *pMem;
        if(hMem)
        {
            pMem = (char*)GlobalLock(hMem);
            memcpy_s(pMem,iBufLen, szText, iBufLen);
            GlobalUnlock(hMem);
            EmptyClipboard();
            SetClipboardData(CF_UNICODETEXT,hMem);
        }
        CloseClipboard();
    }
}

WM_CHAR的使用demo:

CString strFull = L"今天天氣不錯333333";
HWND hwWeb = (HWND)0x0013044E;

for(int i=0 ; i< strFull.GetLength() ; i++) {   PostMessage(hwWeb,WM_CHAR,strFull[i] ,0); }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved