【问题标题】:Window title for a console application控制台应用程序的窗口标题
【发布时间】:2010-04-24 02:06:12
【问题描述】:

在 Visual Studio 的“附加到进程”对话框中,“可用进程”列表中的一列是“标题”,其中列出了每个进程拥有的最顶层窗口的标题。

为了划分工作,我们生成多个服务器进程的多个实例。对于这些控制台进程,Title 字段是空白的,所以目前我们必须在管理工具中查找进程 id 才能找到正确的进程。

为了简化调试过程,我希望能够使用 Title 字段来直接确定我想要哪个过程。

SetConsoleTitle 不能解决问题,SetWindowText 的 hWnd 为 NULL 也不行。据我所知,控制台应用程序本质上并不拥有我们可以传递给 SetWindowText 的任何窗口句柄。我们不想为这些服务器进程创建任何可见的窗口。

对于诱使 Visual Studio 在此处显示一些有用信息的合理方法有什么建议吗?

【问题讨论】:

    标签: visual-studio debugging process console title


    【解决方案1】:

    我想你可能不走运。控制台窗口不属于控制台进程,而是属于系统进程(win7 上的 conhost.exe,可能是 vista,之前的 csrss.exe),所以如果 Visual Studio 只是在寻找一个进程顶级窗口,它将不会t 找到控制台窗口。据我所知,不支持从 proc 中探测控制台,因此 Visual Studio 可能没有明智的方法来查看您拥有的控制台窗口的标题。

    一种可能的解决方案是在您的控制台进程中创建一个顶级窗口作为调试辅助。您可能希望有条件地编译它,因此它仅在您调试时可用。只需创建一个额外的线程来泵送消息,并创建一个顶级窗口。如果您设置正确的样式,窗口将是不可见的。您可能不想在代码中附带窗口,因为在长时间运行的服务器代码中,窗口总是会增加您的攻击面,即使只是一点点。

    这可能不是很有帮助,但值得一提的是,在 Windows 上,分配工作的首选方式是使用线程而不是多个进程。进程是一个昂贵的对象,线程在系统资源和调试方面更便宜。

    【讨论】:

    • 感谢您的建议!我正在考虑一个不可见的窗口,但到目前为止,我在控制台程序中使用窗口的工作主要集中在“在服务器上弹出这个对话框是不好的”。关于分配工作:取决于上下文。进程比线程更好地扩展到多台物理机器。流程将服务器崩溃错误对客户端的影响降至最低;与发布前相比,生产中的问题显然更少。我可以调试一个进程,而它的朋友们继续愉快地前进;我不知道有什么方法可以在不暂停进程中所有其他线程的情况下调试一个线程。
    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2011-04-20
    • 2014-02-17
    • 2011-04-04
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多