如何从WinApi c++的HWND句柄中获取可读的类名和标题?

3
我正在使用以下的enumchild proc来获取每个窗口的hwnd,问题是我无法从每个hwnd中检测到任何信息,以便我可以对被检测为所需的窗口进行操作。
例如,如何在下面的枚举中获取每个窗口的窗口类名和标题?
我尝试了一些方法...
EDITED: 复制粘贴(如果有帮助)
TCHAR cName[MAX_PATH];

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {


 TCHAR cName[MAX_PATH];
 GetClassName(hwnd, cName, _countof(cName));
  cout << cName << endl;

     return TRUE; 
}

int _tmain(int argc, _TCHAR* argv[])
{


    HWND hwnd = FindWindow(0, TEXT("reference"));
    EnumChildWindows(hwnd, EnumChildProc, 0);

    system("PAUSE");
 return 0;
}

它只返回十六进制句柄信息,每次都相同,难道GetClassName函数不应该将cName更改为新的句柄吗?

另外,GetClassName函数返回写入到cName的字符数,我真的看不出这对我有什么用?我需要以某种可读格式获取我的cName,以便我可以执行以下操作:

if(className == TEXT("classnameiamlookingfor" && hwndtitle = TEXT("thetitlethatinterestsme") DOSOMETHINGWITHIT();

但是在这里我得到的只是十六进制混乱。


你尝试在链接器选项中启用调试符号了吗? - too
你的代码片段中有一个非常明显的错误。很难相信它是真实存在的。请从编辑器中复制粘贴,不要在帖子中输入。同时不要使用“==”来比较字符串。 - Hans Passant
1个回答

7

这是不是Unicode版本的构建?

请使用以下方法再次检查:

TCHAR className[MAX_PATH];
GetClassName(hwnd, className, _countof(cName));
_tprintf(cName);

1
对于TCHAR字符串比较,请使用“_tcscmp(a, b) == 0”。 - 9dan
关于hwnd的标题,我是说换行符的愚蠢问题 :eyeroll: - Marko29
@Marko29:对于使用UNICODE编译的TCHAR,请将输出定向到std::wcout而不是std::cout。 - engf-010
1
小心,永远不要将变量格式字符串传递给 printf。请使用 _tprintf("%s\n", className); - Alex Budovski
Alex Budovski:我收到了错误C2664:“wprintf”:无法将参数1从“const char [4]”转换为“const wchar_t *”。 - john k
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接