0

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

也不起作用。

4

5 回答 5

3

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

首先,WTitle 的声明需要如下所示:

TCHAR WTitle[255];

接下来,如果 cout 不工作 write,那是因为你处于 Unicode 模式,所以你需要这样做:

wcout << WTitle;

或者为了更好地适应整个 tchar 框架,您可以添加这个(实际上,我很惊讶这还不是 tchar.h 的一部分):

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

然后使用:

tcout << WTitle;
于 2010-02-09T19:16:35.027 回答
2

简短回答:除非您正在为 Win98 编写代码,否则请使用wchar_t代替TCHARwcout代替cout

长版:

TCHAR类型的存在是为了允许以多种字符串模式编译代码。例如支持 ASCII 和 Unicode。该TCHAR类型将在没有设置的情况下有条件地编译为适当的字符类型。

所有新的 Win 系统都是基于 Unicode 的。当 ASCII 字符串被传递给 OS 函数时,它们被转换为 unicode 并调用真正的函数。所以最好在整个应用程序中只使用 Unicode。

于 2010-02-09T19:13:26.090 回答
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)
于 2010-02-09T19:21:42.470 回答
1

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

像:

if (_tcscmp(WTitle, Test) == 0) {
    // They are equal! Do something.
}
于 2010-02-09T19:14:11.673 回答
1

在 C 中,wchar_t 是一些整数类型(通常是短整型)的 typedef。在 C++ 中,它必须是一个独立的类型——但微软的编译器默认使用 typedef。要使其成为自己的单独类型,您需要使用/Zc:wchar_t编译器开关。顺便说一句,我不知道这是否会完全解决问题——我不确定库是否具有 wchar_t 作为本机类型的真正重载,以便将它们打印为字符而不是短整数。

然而,一般来说,我建议不要乱用微软的“T”变体——让它们正确是一种痛苦,而且它们的主要目的是提供与 16 位 Windows 的兼容性。鉴于距离该行的最后一个版本已经过去了大约 10 年,在新代码中忽略它可能是安全的,除非你真的确定至少有几个客户真正使用它。

于 2010-02-09T19:16:07.897 回答