如何在Visual Studio中过滤调试输出窗口?

5

我该如何删除或过滤这种消息?

这非常令人烦恼,一直显示,我不知道为什么。 我正在使用Visual Studio 2019 C++。

更安全的方法是退出和终止还是将代码卡在"假"while循环中?
当x条件不符合时,我会

阅读此行代码后: MessageBox(g_hWnd, string.data(), L"", MB_OK | MB_ICONSTOP | MB_SETFOREGROUND | MB_APPLMODAL | MB_TOPMOST);

该消息总是被显示:

windows\dwm\dwmapi\attribute.cpp(105)\dwmapi.dll!00007FFBE41B1940: (caller: 000000018000E820) LogHr(1) tid(83b8) 80070006 Identificador inválido.

但如果我移除MB_ICONSTOP,只使用以下代码: MessageBox(g_hWnd, string.data(), L"", MB_OK | MB_SETFOREGROUND | MB_APPLMODAL | MB_TOPMOST);它将不会显示。

其他我不知道的东西也能触发它的显示。

一些谷歌结果: https://social.msdn.microsoft.com/Forums/en-US/3a5a145a-c13d-4898-bb61-a5baadc9332f/why-am-i-getting-hundreds-of-weird-messages-in-debug-output-window?forum=vcgeneral

https://developercommunity.visualstudio.com/content/problem/258494/windowsdwmdwmapiattributecpp92dwmapidll72ed3cf4-ca.html


2
https://social.msdn.microsoft.com/Forums/en-US/3a5a145a-c13d-4898-bb61-a5baadc9332f/why-am-i-getting-hundreds-of-weird-messages-in-debug-output-window?forum=vcgeneral 但是这个消息对任何事情都没有帮助。 - user14766639
我已经添加了更多信息。 - user14766639
@Guto 我只能建议你点赞 缺少筛选调试输出的方法为 OutputDebugString 添加过滤器,同时考虑使用 DebugView - dxiv
@DmytroOvdiienko - 这不取决于任何源代码/项目设置。 - RbMm
@RbMm 我创建了一个简单的 C++ Windows 桌面应用程序。在 MainMenu->About 中,我添加了 MessageBox 调用,就像上面提到的主题一样。我点击菜单->关于,但是在输出窗口中没有看到那个文本。我的笔记本电脑上安装的是 Windows 10.0.19042 Build 19042 (20H2)。 - Dmytro Ovdiienko
显示剩余7条评论
2个回答

1
这是一个关于XY问题的例子,也可以在这里讨论。与其试图防止消息被显示,不如从一开始就防止它们被生成。
根据您发布的链接,这个问题已经存在了几年,并且困扰着许多人。幸运的是,您第一个链接似乎有一个解决方法:用户“codeviewer”发布的帖子列出了一个名为suppress_dwmapi_output()的函数,当将其添加到您的代码中并从InitInstance()中调用时,似乎可以防止创建这些消息。
免责声明:我自己没有尝试过这个方法。

我已经尝试了 suppress_dwmapi_output() 的例子,但消息仍然出现在输出中。 - user14766639
@Guto,在你的问题中可能值得一提。 :-) - bythescruff
1
@Guto - 为什么你不去查找错误?为什么不在 caller: 000000018000E820 上设置断点并查看传递给 DwmGetWindowAttribute 的窗口句柄是哪个? - RbMm
@Guto 如果说是真的 - 对我来说不清楚只有 #include <Dwmapi.h> 怎么能改变结果。二进制文件中发生了什么变化?你没有找到 - 为什么会出现这个错误,为什么它消失了。 - RbMm
我认为错误是因为它没有加载lib dwamip.dll - user14766639
显示剩余2条评论

1

不,dwamip.dll 中的 DwmGetWindowAttribute 并调用 OutputDebugString 来查看消息。因此,这个 dll 在所有情况下都被加载。然后只需包含头文件 - 不强制加载任何 dll,并且通常根本没有任何影响(如果之前没有编译器错误)。 - RbMm

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