2012-10-13 42 views
0

以下程序用於打印具有焦點的窗口的名稱或至少是程序運行的命令提示符的名稱。但它只打印一個字符,它是W。爲什麼這樣?我在哪裏犯錯誤?窗口的名稱沒有打印

#include <Windows.h> 
#include <stdio.h> 

int main() { 
TCHAR title[500]; 
int i=0; 
while(i<10) { 
    GetWindowText(GetForegroundWindow(), title, 500); 
    printf("%s\n",title); 
    i++; 
    system("pause"); 
} 
} 
+2

停止'TCHAR'ing已經和使用'wchar_t'。它是2012. – elmigranto

回答

2

我敢於猜測TCHAR擴展到wchar_tshort爲支持Unicode(UTF-16,更精確地),這就是問題的根源。

在UTF16,字符「W」由2個字節表示:87(爲ASCII碼「W」)和0.1

如果嘗試打印用「W」開頭的字符串UTF16常規printf(),printf()將重新解釋該UTF-16字符串爲「W \ 0」並在「W」後立即停止打印。

要打印TCHAR的字符串,您應該改爲使用_tprintf()

+0

通過'GetWindowText'後的'title'是一個UTF-16編碼的字符串? –

+0

爲什麼不呢?參見['GetWindowText()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx)描述:'LPTSTR lpString'。你能看到一個'T'嗎? –

0

因爲它是一個TCHAR它可以是ansi或unicode。

1)版本(A)的工作:如果你想繼續使用ANSI版本printf,使用GetWindowTextAchar取代TCHAR因爲Windows有2組API與字符串的工作使用_tprintf代替了printf

0

使用ANSI字符串並以char*const char*作爲輸入。

2)使用寬字符串並使用wchar_t*const wchar_t*作爲輸入的版本(W)。由於這是該函數的本地版本,因此速度稍快,並且可以使用Unicode字符串。

由於_UNICODE在你的項目中定義,TCHAR將被映射到wchar_tGetWindowText將被映射到GetWindowTextW,讓您在使用printf窄字符串的工作不能與'%s,您應該使用_tprintf打印wchar_t*或停止使用TCHAR並直接調用API最符合您需求的版本(這裏稱之爲GetWindowTextA),例如,你可以使用這個:

wchar_t title[500]; 
GetWindowTextW(GetForegroundWindow(), title, 500); 
printf("%ls\n", title);