我想知道如何隐藏控制台窗口,当它启动。
我想说实话,告诉你这是一个键盘logging程序,但是这不是我打算砍人的意图。 这是我想做的一个小小的学校项目,以显示黑客的危险。 (我认为在学校炫耀这样的东西可能是相当酷的)。
我希望你能帮助我。
所以。 这是我通过在谷歌上查找的代码。 (不要介意所有关于意图的笔记。)
#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(); 在主要。
是的,我看到窗户出现,立即消失。 但似乎在这之后开启了一个新的控制台,这只是空白。 (空白,我的意思是:“按任意键继续..”我在想如果它与“系统(”暂停“)”)有任何关系
所以我想知道为什么它打开一个新的控制台,而不是只创build和隐藏第一个。
谢谢。 🙂
为了按需从字面上隐藏/显示控制台窗口,可以使用以下功能:可以使用ShowWindow来隐藏/显示控制台。 GetConsoleWindow检索控制台使用的窗口句柄。 IsWindowVisible可以用来检查一个窗口(在这种情况下控制台)是否可见。
#include <Windows.h> void HideConsole() { ::ShowWindow(::GetConsoleWindow(), SW_HIDE); } void ShowConsole() { ::ShowWindow(::GetConsoleWindow(), SW_SHOW); } bool IsConsoleVisible() { return (::IsWindowVisible(::GetConsoleWindow()) != FALSE); }
所以我想知道为什么它打开一个新的控制台,而不是只创建和隐藏第一个。
一个控制台应用程序实际上并不创建一个控制台本身,它只是运行在一个。 如果您从资源管理器运行可执行文件,则Windows会创建一个控制台供其运行。当您调用FreeConsole
,它不会关闭新控制台,只是简单地将其从您的进程中分离出来。
正如WhozCraig在评论中指出的,创建一个常规的Windows应用程序,不要创建一个窗口。
你正在编写一个控制台程序,入口点是main()
。 对于基于图形的Windows应用程序,入口点应该是WinMain
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633559(v=vs.85).aspx
只需将您的应用程序的类型从“控制台应用程序”更改为“Windows应用程序”(并将您的main
更改为WinMain
)。 在这种情况下,您的应用程序将在没有控制台窗口的情况下启动。
很简单。 FreeConsole() api会为你做这个魔术
BOOL WINAPI FreeConsole(VOID);
只要在启动时做到这一点
myConsole = GetConsoleWindow(); ShowWindow(myConsole,0);
启动时隐藏控制台窗口在您的代码中是不可能的,因为可执行文件是由具有特定设置的操作系统运行的。 这就是为什么控制台窗口在启动时显示很短的时间,例如FreeConsole();
要在启动时真正隐藏窗口,必须为编译器添加一个特殊的选项。 如果你在Windows上使用gcc(MinGW),你可以在makefile中添加-mwindows
作为编译选项,并且绝对不会有窗口或“flash”。 我不知道VisualStudio或目前使用的任何东西,但是改变IDE编译代码的方式是要用C ++代替编码解决方法。
在我看来,这种方法比使用WinMain
更好,因为它的工作可靠,而且不会让你的C ++代码平台依赖。
#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; }
#include <windows.h> ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back
这将返回一个窗口句柄(HWND) myConsole
和ShowWindow将有效地隐藏它。 这个解决方案当然只能在windows系统上运行。
这是问题的正确答案,即使它没有标记为它。
编辑:一个可能的解决方案可能是设置(在Visual Studio中)连接器 – >系统 – >子系统到“Windows(/ SUBSYSTEM:WINDOWS)”而不是“控制台(/ SUBSYSTEM:CONSOLE)”。 这使得控制台不出现,避免了闪烁。