2012-10-13 2 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는 유니 코드 (UTF-16, 더 정확하게하기 위해) 지원 wchar_t 또는 short로 확장 추측 감히 그 문제의 원인입니다.

은 UTF16에서, 문자 'W'는 2 바이트로 표현된다 : 87 (에 대한 ASCII 코드를 'W')와 0

당신이 '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 : 당신이 printf와 ANSI 버전을 계속 사용 GetWindowTextA를 사용하여 Windows가 문자열로 작업 API의 2 세트를 가지고 있기 때문에 charTCHAR을 바꾸려면 대신

0

의 printf _tprintf 사용 ANSI 문자열을 사용하고 char* 또는 const char*을 입력하십시오.

2) 와이드 문자열로 작업하는 버전 (W)은 wchar_t* 또는 const wchar_t*을 입력으로 사용합니다. 이것은 함수의 기본 버전이기 때문에 약간 더 빠르며 유니 코드 문자열에서도 작동 할 수 있습니다. _UNICODE 이후

이 프로젝트에 정의되어, TCHARwchar_t에 매핑되며 GetWindowTextGetWindowTextW에 매핑 될 것이다, 그래서 당신은 좁은 문자열에서 작동하는 것을 사용 printf%s, 당신도 _tprintf를 사용한다 '로 wchar_t*을 인쇄 할 수 없습니다 또는 TCHAR 사용을 중지하고 직접 가장 필요에 맞게 API의 버전을 호출이 사용할 수 있습니다 (예를 들어, 여기 GetWindowTextA 전화) :

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