2015-07-12 28 views
0

我試着。使用GetForegroundWindow和GetWindowText函數功能獲取活動窗口的標題,這是我的代碼錯誤:無法轉換的char wchat_t *

HWND hwnd = GetForegroundWindow(); 
char wname[255]; 
GetWindowText(hwnd,wname,255); 

每次我試圖建立的項目中,我得到這個錯誤信息「錯誤:錯誤:無法轉換的char * wchat_t」

進出口使用C++ Builder的XE7

那麼,什麼是錯的?

+0

我想你會發現它是'wchar_t',而不是wchat_t –

回答

0

您正在使用支持Unicode的模式構建應用程序; char不足以容納UTF-16字符。這種類型系統可以幫助您避免潛在頭痛的批次。要麼改爲ASCII模式(簡單但不好的解決方案),切換到在任何地方使用寬字符串(令人討厭的解決方案),或者使用提供的宏在編譯時根據構建參數進行選擇(更令人討厭但最正確的解決方案)。

這是此代碼段將會是什麼樣無論是實施上述解決方案:

HWND hwnd = GetForegroundWindow(); 
wchar_t wname[255]; 
GetWindowText(hwnd, wname, 255); 

HWND hwnd = GetForegroundWindow(); 
TCHAR wname[255]; 
GetWindowTextW(hwnd, wname, 255); 

如果您選擇建立一個支持Unicode的應用程序(你應該),你也必須記得用wmain_tmain(如適用),而不是簡單的舊的無聊main。因爲Windows。

+4

「最正確的」解決方案是在任何地方都使用unicode。這不再是1995年。 –

+0

絕對不是。如果他在任何地方盲目地使用Unicode,然後稍後他或其他人切換文本模式(想象移植到傳統的Windows,或潛在地移植到新的Unicode標準,或發明一個合理的理由),那麼一切都會崩潰。宏是一個不便之處,但它們將選擇硬編碼到每個變量中是無限可取的。 – acwaters

+0

@JonathanPotter最正確的是使用UTF-8,因爲UTF-16是一種過時的折衷方案,它支持對Unicode 1.0(1996年以前)的16位代碼點進行硬編碼的系統。 'char'不暗示ASCII;它是唯一有效的表示形式,世界其他地區已經推出UTF-8。 – Potatoswatter

3

您正在致電TCHAR版本的GetWindowText()。在項目選項中,您將「TCHAR映射到」選項設置爲wchar_t,因此GetWindowText()映射到GetWindowTextW(),這需要wchar_t*參數。這就是爲什麼你不能通過char[]緩衝區。

所以,你需要:

  1. 變化char使GetWindowText()地圖「TCHAR來映射」來代替GetWindowTextA()(也同樣會影響您的代碼每隔TCHAR基於API函數調用。只有在將傳統的pre-Unicode代碼遷移到C++ Builder 2009+時才使用此方法)。

  2. 更改代碼中使用TCHAR代替:

    TCHAR wname[255]; 
    GetWindowText(hwnd,wname,255); 
    
  3. 更改代碼中使用的GetWindowText()的ANSI或Unicode版本直接:

    char wname[255]; 
    GetWindowTextA(hwnd,wname,255); 
    

    wchar_t wname[255]; 
    GetWindowTextW(hwnd,wname,255); 
    
相關問題