C++如何在启动时隐藏控制台窗口?

mad*_*232 14 c++ windows console-application

我想知道如何在启动时隐藏控制台窗口.

我想说实话,并告诉你这是一个键盘记录程序,但我不打算破解某人.这是我想做的一个小学校项目,以显示黑客的危险.(我觉得在学校展示这样的东西可能会很酷.)

我希望你能帮助我.

所以.这是我在谷歌上查找的代码.(不要介意关于意图的所有注释.)

#include <cstdlib>
#include <iostream>
#include <Windows.h>

using namespace std;

int main()
{
   /* Note. This program is only created to show the risk of being unaware of hackers.
    * This program should never be used to actually hack someone. 
    * Therefore this program will never be avaiable to anyone, except me.
    */

    cout << "Note. This program is only created to show the risk of being unaware of hackers." << endl;
    cout << "This program should never be used to actually hack someone." << endl;
    cout << "Therefore this program will never be avaiable to anyone, except me." << endl;

    FreeConsole();

    system("PAUSE");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我包含了Windows.h并编写了FreeConsole(); 在主要.

是的,我看到窗口出现并立即消失.但它似乎在此之后开启了一个新的控制台,这只是空白.(空白,我的意思是:"按任意键继续......"我正在考虑是否与"系统("PAUSE")有关)"

所以我想知道为什么它会打开一个新的控制台,而不仅仅是创建和隐藏第一个控制台.

谢谢.:)

nik*_*au6 21

要按字面隐藏/显示控制台窗口,您可以使用以下功能:可以使用ShowWindow隐藏/显示控制台.GetConsoleWindow检索控制台使用的窗口句柄. IsWindowVisible可用于检查窗口(在这种情况下是控制台)是否可见.

#include <Windows.h>

void HideConsole()
{
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}

void ShowConsole()
{
    ::ShowWindow(::GetConsoleWindow(), SW_SHOW);
}

bool IsConsoleVisible()
{
    return ::IsWindowVisible(::GetConsoleWindow()) != FALSE;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

在代码中实际上不可能在启动时隐藏控制台窗口,因为可执行文件是由具有特定设置的操作系统运行的。这就是为什么例如FreeConsole(); 在使用时在启动时在非常短的时间内显示控制台窗口的原因。要在启动时真正隐藏该窗口,必须在编译器中添加一个特殊选项。如果您在Windows(MinGW)上使用gcc,则只需将其-mwindows作为编译器选项添加到您的makefile中,就绝对不会出现窗口或“ flash”。我目前还不了解VisualStudio或您使用的任何工具,但是改变IDE编译代码的方式是替代C ++编码变通办法的一种方式。

我认为,这种方法比使用方法更好,WinMain因为它可以可靠地工作,并且您不会依赖C ++代码平台。

  • 编译器标志是要走的路。对于visual studio,你有[这个答案](/sf/answers/481775031/) (2认同)

udi*_*043 7

#include <windows.h>
#include <iostream.h>

void Stealth()
{
 HWND Stealth;
 AllocConsole();
 Stealth = FindWindowA("ConsoleWindowClass", NULL);
 ShowWindow(Stealth,0);
}

int main()
{
  cout<<"this sentence is visible\n";
  Stealth(); //to hide console window
  cout<<"this sentence is not visible\n";
  system("PAUSE"); //here you can call any process silently like system("start chrome.exe") , so google chrome will open and will surprise user..
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*lie 7

#include <windows.h>
ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back
Run Code Online (Sandbox Code Playgroud)

这将返回一个窗口句柄(HWND),ShowWindow()然后将其隐藏。此解决方案仅适用于 Windows 系统。

这是问题的正确答案,即使它没有标记为它。

编辑:一个可能的解决方案/hack 可能是(在 Visual Studio 中)将链接器->系统->子系统设置为“Windows(/SUBSYSTEM:WINDOWS)”而不是“控制台(/SUBSYSTEM:CONSOLE)”。然而,这可能不是最佳的。


Tur*_*rch 5

所以我想知道为什么它会打开一个新的控制台,而不仅仅是创建和隐藏第一个控制台.

控制台应用程序实际上并不创建一个控制台,它只是在一个控制器中运行.如果从资源管理器运行可执行文件,Windows将为其运行一个控制台.当您调用时FreeConsole,它不会关闭新控制台,只需将您的进程与其分离即可.

正如WhozCraig在评论中指出的那样,创建一个常规的Windows应用程序,而不是创建一个窗口.


seg*_*ult 5

您正在编写一个控制台程序,入口点是main()。对于基于图形的 Windows 应用程序,入口点应为WinMain http://msdn.microsoft.com/en-us/library/windows/desktop/ms633559(v=vs.85).aspx


小智 5

很简单。 FreeConsole() api 将为您带来神奇的效果

BOOL WINAPI FreeConsole(VOID);
Run Code Online (Sandbox Code Playgroud)