24

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

这是一个键盘记录程序,我无意破解某人。这是我想做的一个小学校项目,以展示黑客的危险。

到目前为止,这是我的代码:

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

using namespace std;

int main()
{

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

我看到窗口出现并在启动时立即消失。之后似乎立即打开了一个新控制台,它只是空白。(空白是指“按任意键继续..”我想知道它是否与此有关system("PAUSE")

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

谢谢。:)

4

10 回答 10

34

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

#include <Windows.h>

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

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

bool IsConsoleVisible()
{
    return ::IsWindowVisible(::GetConsoleWindow()) != FALSE;
}
于 2016-11-04T19:54:52.057 回答
19

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

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

于 2017-02-15T12:54:40.687 回答
10
#include <windows.h>
ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back

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

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

编辑:一个可能的解决方案/黑客可能是设置(在visual studio中)链接器->系统->子系统到“Windows(/SUBSYSTEM:WINDOWS)”而不是“控制台(/SUBSYSTEM:CONSOLE)”。然而,这可能不是最优的。

于 2016-11-01T13:27:08.073 回答
6
#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;
}
于 2015-02-16T16:28:36.270 回答
5

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

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

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

于 2013-08-15T20:10:59.867 回答
4

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

于 2013-08-15T20:26:16.547 回答
4

很简单。 FreeConsole() api 会为你做到这一点

BOOL WINAPI FreeConsole(VOID);
于 2015-11-22T17:59:53.073 回答
3

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

于 2013-08-15T20:48:35.230 回答
3

只需在启动时执行此操作

myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);
于 2016-04-02T10:12:49.457 回答
0

8年后哈哈

您的项目的一个简单解决方案是简单地使用 .vbs

Dim WShell
Set WShell = CreateObject("WScript.Shell")
WShell.Run "xr.exe", 0
Set WShell = Nothing

这将在运行时隐藏启动 xr.exe 但是 Windows Defender 认为它是病毒

于 2021-08-24T03:12:46.587 回答