當我們需要設置編輯框顯示文本的時候,如果其它方式無法實現,可以試試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); }