3

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

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

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

4 回答 4

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)
{

}
于 2013-07-30T05:17:32.383 回答
3

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

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

...

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

TCHAR可能是charor wchar_t,取决于是否定义UNICODE(我当然希望它在您的情况下定义,这也可以解释为什么它不能直接工作)。因此,如果您决定使用它(我不会,因为我很确定我永远不会再次为 Windows 9x/ME 编写软件,或者通常是不支持 Unicode 的软件),您还必须遵守它的规则。

于 2013-07-30T05:16:17.927 回答
0

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

于 2013-07-30T05:16:56.787 回答
0

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

你想要的是

typedef std::basic_string<TCHAR> tstring;

然后用 std::string 代替。

另见tchar 与 wstringstd::basic_string

于 2013-07-30T05:29:10.843 回答