【发布时间】:2016-06-03 22:11:31
【问题描述】:
对于我的一个应用程序,我一直在使用 Windows API,即为窗口功能创建一个非常小的包装器。因为我也喜欢控制台输出,所以我通过AllocConsole() 创建了一个控制台。然后我注意到在此控制台中突出显示文本(例如,如果您想复制某些内容)“冻结”打开的窗口,即。不会处理任何消息,它不可点击或关闭。消息循环和 wndProc 都是标准的。
两个问题:这是预期/记录的行为(我找不到任何关于它的信息),如果是,有没有办法禁用它?这有点烦人。
提前致谢
编辑:根据要求,控制台创建代码:
FILE *conOut = NULL;
FILE *conIn = NULL;
if (::AllocConsole())
{
::freopen_s(&conIn, "CONOUT$", "r", stdin);
::freopen_s(&conOut, "CONOUT$", "w", stdout);
// ...
if (conOut != NULL)
::fclose(conOut);
if (conIn != NULL)
::fclose(conIn);
::FreeConsole();
}
【问题讨论】:
-
在我看来,在控制台窗口中突出显示文本会导致 Windows 消息泵停止。我会尝试分离一个新线程,然后创建控制台,这样您的主线程就不会被控制台中的任何活动阻塞。这是控制台msdn.microsoft.com/en-us/library/windows/desktop/… 上的Windows MSDN 主页,其中包含一系列指向更具体主题的链接。另请参阅stackoverflow.com/questions/192294/…,其中包含指向代码项目示例的链接。
-
我还建议您在问题中添加一个代码示例,展示您如何创建控制台。这篇文章也可能会有所帮助dslweb.nwnexus.com/~ast/dload/guicon.htm
-
您希望用户如何突出显示滚动控制台窗口中的任何内容?这不是暂停输出的唯一方法,一个简单的 Ctrl+S 也可以完成工作。杀手锏。这很像苏联的老笑话,使用 1970 年代的用户界面隐含的是用户界面控制着你。如果你想控制用户界面,那么你可以使用 winapi 创建你自己的窗口。你让剪贴板工作。这是更多的工作。
-
是的,这是标准的预期行为。进入选择模式会导致控制台滚动/刷新暂停。很惊讶你以前没有注意到这一点。