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

时间:2013-08-15 19:43:43

标签: 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;
}

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

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

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

感谢。 :)

9 个答案:

答案 0 :(得分:14)

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

#include <Windows.h>

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

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

bool IsConsoleVisible()
{
    return ::IsWindowVisible(::GetConsoleWindow()) != FALSE;
}

答案 1 :(得分:7)

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

在我看来,这种方法比使用WinMain更好,因为它可靠地运行,并且不会使您的C ++代码平台依赖。

答案 2 :(得分:5)

  

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

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:4)

#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;
}

答案 5 :(得分:3)

只需将应用类型从“控制台应用”更改为“Windows应用”(并将main更改为WinMain)。在这种情况下,您的应用程序将在没有控制台窗口的情况下启动。

答案 6 :(得分:3)

#include <windows.h>
ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back

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

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

编辑:可能的解决方案/黑客可能是(在visual studio中)将Linker-&gt; System-&gt; SubSystem设置为“Windows(/ SUBSYSTEM:WINDOWS)”而不是“Console(/ SUBSYSTEM:CONSOLE)”。然而,这可能不是最佳的。

答案 7 :(得分:2)

很简单。 FreeConsole() api会为你做那个魔术

BOOL WINAPI FreeConsole(VOID);

答案 8 :(得分:2)

只需在启动时执行此操作

myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);