TCHAR [],LPWSTR,LPTSTR和GetWindow文本功能

时间:2010-02-09 19:07:39

标签: c++ string winapi tchar

因此,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

也不起作用。

5 个答案:

答案 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代替TCHARwcout代替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>

相关问题