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

2019-10-29 08:19发布

所以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

不也行。

Answer 1:

OK,几个定义第一。

在“T”类型是将评估要么CHAR(单字节)或WCHAR(双字节)的定义,这取决于你是否已经有了在构建设置中定义的_UNICODE符号。 这样做的目的是让你的目标ANSI和UNICODE用一套单一的源代码。

定义:

TCHAR title[100];
TCHAR * pszTitle;

......是等价的。 第一个定义100个TCHARS的缓冲区。 第二定义了一个指针到一个或多个TCHARS,但在缓冲液中没有指向它。 进一步,

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)


Answer 2:

哇,让我们来看看从哪里开始。

首先,WTitle的声明只需要看起来像这样:

TCHAR WTitle[255];

接下来,如果COUT工作不写,这是因为你在Unicode模式,所以你需要这样做:

wcout << WTitle;

或者,以适应整个TCHAR框架更好,你可以添加这个(实际上,我很惊讶,这是不是已经TCHAR.H的一部分):

#ifdef _UNICODE
    #define tcout wcout
#else
    #define tcout cout
#endif

然后使用:

tcout << WTitle;


Answer 3:

答案很简单:除非你的编码适用于Win98,使用wchar_t而不是TCHARwcout ,而不是cout

龙版本:

所述TCHAR型存在,以允许在多个串模式来编译的代码。 例如支持ASCII和Unicode。 该TCHAR类型将有条件地编译基于没有设置相应的字符类型。

所有新运系统都基于Unicode。 当ASCII字符串传递给OS的功能,它们将转换为Unicode和通话的真正功能。 因此,最好只使用Unicode整个应用程序。



Answer 4:

使用_tcscmp或变体(其在需要的字符数来比较)。 http://msdn.microsoft.com/en-us/library/e0z9k731.aspx

喜欢:

if (_tcscmp(WTitle, Test) == 0) {
    // They are equal! Do something.
}


Answer 5:

在C中,wchar_t的是对于某些整数类型(通常为短整型)一个typedef。 在C ++中,它必须是一个独立的类型了自己的 - 但是,微软的编译器默认使用反正一个typedef它。 要使它成为一个独立的类型了自己,你需要使用/Zc:wchar_t编译器开关。 随口说说,我不知道这是否会完全虽然解决这个问题 - 我不知道,如果库中有wchar_t的作为原生型重载实际打印出来的那些作为字符,而不是短整型。

但一般来说,我会建议对无论如何与微软的“T”变种搞乱 - 让他们的权利,是一种痛苦,而他们的目的主要是为用户提供16位Windows的兼容性反正。 既然它现在已经因为在此行的最后释放约10年,它可能安全地忽略它在新的代码,除非你真的确定至少有几个你的客户真正使用它。



文章来源: TCHAR[], LPWSTR, LPTSTR and GetWindow Text function