将TCHAR与String进行比较

时间:2013-07-30 05:11:02

标签: c++ winapi

在C ++方面,我仍然是一个极端的菜鸟。我目前讨厌的事情之一(截至目前)是winAPI中的1,000,000,000种不同类型的变量。我用来检查窗口是否存在的这个小程序非常快。但最难的部分是什么?简单地将“字符串”比较在一起,看它是否匹配。最简单的部分是最难的!

无论如何,对于我的问题:如何将 a toFind 进行比较,看看它们是否匹配?

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam){
    TCHAR a[260];
    string toFind = "Google Chrome";

    hwnd = GetParent(hwnd);
    GetWindowText(hwnd, a, sizeof(a));

    if(strcmp(a,toFind) == 0){          //doesn't work
        cout << "found the window";
    }

    return TRUE;
}

4 个答案:

答案 0 :(得分:5)

最简单的方法可能是不要使用c风格的数组,因为你正在使用UNICODE进行编译以使用std::wstring

std::wstring a;
a.resize(260);
std::wstring toFind = L"Google Chrome";

hwnd = GetParent(hwnd);
int size = GetWindowText(hwnd, &a[0], a.size());
a.resize(size);

然后很简单:

if(a == toFind)
{

}

答案 1 :(得分:3)

在这种情况下你不应该使用string而是TCHAR[],然后与适当的包装函数进行比较:

TCHAR toFind[] = _T("Google Chrome");

...

if (_tcscmp(a, toFind) == 0)

TCHAR可能是charwchar_t,具体取决于UNICODE是否已定义(我当然希望 在您的案例中定义 ,这也可以解释为什么它不直接工作)。因此,如果您决定使用它(我不会,因为我相信我永远不会,将再次为Windows 9x / ME编写软件或者通常没有Unicode支持的软件),您还必须遵守其规则。

答案 2 :(得分:0)

将字符串类型从“string”更改为“wstring”。您还必须将“strcmp”更改为“wstrcmp”之类的内容。基本上,wstring是UNICODE中使用的宽字符串。

答案 3 :(得分:0)

std :: string是std :: basic_string的typedef。 std :: wstring是typedef std :: basic_string。

你想要的是

typedef std::basic_string<TCHAR> tstring;

然后使用std :: string的原位。

另请参阅tchar vs wstringstd::basic_string