C++控制台应用程序,隐藏标题栏

6

我有一个用C++编写的Windows控制台应用程序,想要隐藏/删除控制台窗口的完整标题栏,包括关闭、最小化/最大化等控件。我搜索了很多但还没有找到有用的东西。

我使用GetConsoleWindow查询控制台HWND,并尝试使用SetWindowLong更改控制台窗口样式,通过删除WS_CAPTION标志,但这似乎没有任何效果:

HWND hwnd = GetConsoleWindow();
LONG style = GetWindowLong(hwnd, GWL_STYLE);
style &= ~(WS_BORDER|WS_CAPTION|WS_THICKFRAME);
SetWindowLong(hwnd, GWL_STYLE, style);

SetWindowPos( hwnd, NULL, 0,0,0,0,
       SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE
       |SWP_FRAMECHANGED ); 

我也尝试了GetSystemMenu/RemoveMenu,但这似乎只能禁用像关闭按钮这样的控件。

有趣的问题,为什么您需要隐藏标题栏? - Arsen Mkrtchyan
3
我真的不在意。只是想通过展示与默认控制台有所不同的东西,使程序看起来更“好看”,因为每个人都已经看过默认控制台上千次了。 - asdrubael
4个回答

5

你不能这样做。通常情况下,控制台窗口的hWnd并不保证适用于所有窗口操作,例如在此处所述。


好的,这个要知道是很好的,所以我会忘掉它,尝试另一个命令提示符或者保持原样。 - asdrubael

2

您可以尝试一种复杂的解决方案,涉及隐藏控制台窗口(这是可能的),然后设置一个窗口(没有控件)来在真实控制台窗口和伪控制台窗口之间转发适当的事件。特别是GDI事件,以在您的伪控制台窗口中绘制控制台窗口内容,并与滚动条交互(进而调整控制台...)。

这个解决方案相当复杂,需要较高的技术水平。


2
你可以使用 SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP); ,这将删除窗口的标题栏和边框。
警告:这会引入一些我不知道如何修复的小问题(我猜它们是缓存的边框?),但至少它能产生你想要的效果。

0
我认为我会编写/使用两个程序。一个控制台程序执行工作,第二个程序是可控制的控制台窗口运行第一个程序。很可能已经存在一些控制台程序,并且有些可以在没有标题栏的情况下启动?或者找到一个开源的并进行修改。

是的,这将是一种选择,可以使用像“Console”这样的工具替换cmd.exe: http://sourceforge.net/projects/console/ - asdrubael

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