因此,GetWindowText在MSDN上声明如下:
int GetWindowText(
HWND hWnd,
LPTSTR lpString,
int nMaxCount
);
但是要使代码生效,我们必须将第二个参数声明为
TCHAR[255] WTitle;
然后调用函数GetWindowText(hWnd,Wtitle,255);
LPTSTR是指向tchar数组的指针,因此声明LPTSTR类似于声明TCHAR []?但它并不是这样的。
当使用TCHAR []时,程序返回有效的GetWindowText结果(它是一个等于标题中符号数的整数)。问题是:如何从TCHAR []中获取确切的标题?代码如
TCHAR[255] WTitle;
cout<< WTitle;
或
cout<< *Wtitle;
返回数字。如何将其与给定字符串进行比较?
TCHAR[4] Test= __T("TEST")
if (WTitle == Test) do smth
也不起作用。
答案 0 :(得分:3)
首先,WTitle的声明需要如下所示:
TCHAR WTitle[255];
接下来,如果cout没有写入工作,那是因为你处于Unicode模式,所以你需要这样做:
wcout << WTitle;
或者为了更好地适应整个tchar框架,你可以添加它(实际上,我很惊讶这不是tchar.h的一部分):
#ifdef _UNICODE
#define tcout wcout
#else
#define tcout cout
#endif
然后使用:
tcout << WTitle;
答案 1 :(得分:2)
简短回答:除非您为Win98编码,否则请使用wchar_t
代替TCHAR
和wcout
代替cout
长版:
存在TCHAR
类型以允许以多种字符串模式编译代码。例如,支持ASCII和Unicode。 TCHAR
类型将根据没有设置有条件地编译为适当的字符类型。
所有新的Win系统都是基于Unicode的。当ASCII字符串传递给OS函数时,它们将转换为unicode并调用实际函数。因此,最好在整个应用程序中使用Unicode。
答案 2 :(得分:2)
好的,首先是一些定义。
'T'类型是定义为CHAR(单字节)或WCHAR(双字节)的定义,具体取决于您是否在构建设置中定义了_UNICODE符号。目的是让您使用一组源代码来定位ANSI和UNICODE。
定义:
TCHAR title[100];
TCHAR * pszTitle;
... 不等于。第一个定义了100个TCHAR的缓冲区。第二个定义指向一个或多个TCHAR的指针,但不指向缓冲区。此外,
sizeof(title) == 100 (or 200, if _UNICODE symbol is defined)
sizeof(pszTitle) == 4 (size of a pointer in Win32)
如果你有这样的功能:
void foo(LPCTSTR str);
...你可以传递上述两个变量中的任何一个:
foo(title); // passes in the address of title[0]
foo(pszTitle); // passes in a copy of the pointer value
好的,所以你获得数字的原因可能是因为你做定义了UNICODE(所以字符很宽),并且你正在使用cout,这是特定于单字节字符的。改为使用 wcout :
wcout << title;
最后,这些不起作用:
TCHAR[4] Test == __T("TEST") ("==" is equality comparison, not assignment)
if (WTitle == Test) do smth (you're comparing pointers, use wcscmp or similar)
答案 3 :(得分:1)
使用_tcscmp或变体(其中包含要比较的字符数)。 http://msdn.microsoft.com/en-us/library/e0z9k731.aspx
像:
if (_tcscmp(WTitle, Test) == 0) {
// They are equal! Do something.
}
答案 4 :(得分:1)
在C中,wchar_t是某种整数类型的typedef(通常是short int)。在C ++中,它需要是一个独立的类型 - 但是Microsoft的编译器默认使用typedef。要使其成为自己的单独类型,您需要使用/Zc:wchar_t
编译器开关。另外,我不知道是否会完全解决这个问题 - 我不确定该库是否有真正的重载wchar_t作为本机类型将它们打印为字符而不是短整数。
但是,一般来说,无论如何,我建议不要搞砸微软的“T”变种 - 让它们正确是一件痛苦的事,而且它们主要是为了提供与16位Windows的兼容性。鉴于它自上一次发布以来已经过去了大约10年,在新代码中忽略它可能是安全的,除非你真的确定至少有一些客户真正使用它。 / p>