在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;
}
答案 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
可能是char
或wchar_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的原位。