richedit怎麼獲取輸入的寬字符

如上,用getdlgitemtext的話不是隻能用CString和char * 嗎,在非nuicode編程的情況下,有沒有辦法獲取寬字符。

有沒有GetDlgItemTextW函數?有的話,就用這個函數,如果沒有的話,可以藉助GetDlgItemText這個函數實現自己的GetDlgItemTextW函數。
 

應該是沒有w這個函數的,但是如果你用普通字符去獲取的話,假如我是日文系統下,它會轉成日文的,就會把一些沒字給轉錯了,你再轉回來就是錯的了。

我的意思呀,假如我當前的環境是日文系統,在非unicode工程下,你得到的數據是已經是錯誤的了,因爲日語中不存在一些漢字,也就顯示亂碼的一部分漢字不存在,你再用轉的話,由於源都是錯的了,你再轉出來的肯定也是錯誤的。

winuser.h裏面定義的:
#ifdef UNICODE
#define GetWindowText GetWindowTextW
#else
#define GetWindowText GetWindowTextA
#endif

非unicode環境下也可以用GetWindowTextW,GetWindowTextW是從user32.dll輸出的,內部都是unicode的,和你的工程環境沒關係

你用GetWindowTextW試試先。

GetWindowTextW 的定義:

int
WINAPI
GetWindowTextW(
  __in HWND hWnd,
  __out_ecount(nMaxCount) LPWSTR lpString,
  __in int nMaxCount);

其中第2個參數就是UNICODE字符串變量。

不是吧, 我用這個也能嗎 GetActiveWindow()->m_hWnd,獲得應該是rich edit的句柄吧,rich edit也算一個窗口吧,可以我看了下,得出來的居然還是亂碼,是系統經過轉碼了嗎,就是你輸入時轉爲unicode,他再獲得時先轉成當前環境再轉成了unicode編碼嗎,要不怎麼會還是亂碼呢
你這個GetActiveWindow()->m_hWnd是由什麼對象調用的啊,獲得的不一定是rich edit的句柄。
你得用rich edit的窗口句柄調用GetWindowTextW。
可以用GetDlgItem得到rich edit的窗口句柄。

windows系統內部都是統一的unicode編碼,也就是處理字符串的時候都是unicode的。當你的工程是unicode的時候,中間不會產生轉換。當你的工程是非unicode的時候,系統和應用程序通信時會先進行轉換。所以GetWindowTextW得到的是unicode字符,wchat_t類型就是用來存放unicode編碼字符的。而GetWindowTextA內部其實也調用了GetWindowTextW,只不過內部做了轉換。相當於:
GetWindowTextA(char* bufA,...)
{
  wchar_t bufW[];
  GetWindowTextW(bufW, ...);
  WideCharToMultiByte(bufA, bufW);//轉換成ANSI的字符串
}

所以你直接
wchar_t bufW[];
GetWindowTextW(bufW, ...);
就行了。

我指的是,你字,在日文中是不存在的,你用日文輸出得到是的是?號,但是在unicode中你是對應的是一個編號20230什麼的,這塊得出的直接是用日文內碼對應的63,也就是它已經被轉爲了日文內碼,不在是unicode編碼了,也有可能是unicode編碼,但是是錯的了.

來源:英超直播

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章