[英]How do I open a new console window for a Visual C++ console application?
[英]C++ How do I hide a console window on startup?
我想知道如何在啟動時隱藏控制台窗口。
這是一個鍵盤記錄程序,但我無意破解某人。 這是我想做的一個小學校項目,以展示黑客的危險。
到目前為止,這是我的代碼:
#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")
有任何關系)
所以我想知道為什么它會打開一個新的控制台,而不是只創建和隱藏第一個控制台。
謝謝。 :)
要根據需要隱藏/顯示控制台窗口,您可以使用以下功能: 可以使用ShowWindow隱藏/顯示控制台。 GetConsoleWindow檢索控制台使用的窗口句柄。 IsWindowVisible可用於檢查窗口(在這種情況下是控制台)是否可見。
#include <Windows.h>
void HideConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}
void ShowConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_SHOW);
}
bool IsConsoleVisible()
{
return ::IsWindowVisible(::GetConsoleWindow()) != FALSE;
}
在您的代碼中隱藏啟動時的控制台窗口是不可能的,因為可執行文件是由具有特定設置的操作系統運行的。 這就是為什么當您使用例如FreeConsole();
時,控制台窗口在啟動時會顯示很短的時間FreeConsole();
要在啟動時真正隱藏窗口,您必須向編譯器添加一個特殊選項。 如果您在 Windows (MinGW) 上使用 gcc,您只需在 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
這將向ShowWindow()
返回一個窗口句柄 (HWND),后者又將隱藏它。 此解決方案僅適用於 Windows 系統。
這是問題的正確答案,即使它沒有標記為它。
編輯:一個可能的解決方案/hack 可能是(在 Visual Studio 中)將鏈接器->系統->子系統設置為“Windows(/SUBSYSTEM:WINDOWS)”而不是“控制台(/SUBSYSTEM:CONSOLE)”。 然而,這可能不是最佳的。
所以我想知道為什么它會打開一個新的控制台,而不僅僅是創建和隱藏第一個控制台。
控制台應用程序實際上並不創建控制台本身,它只是在一個控制台中運行。 如果您從資源管理器運行可執行文件,Windows 會創建一個控制台供其運行。當您調用FreeConsole
,它不會關閉新控制台,只是將您的進程與其分離。
正如 WhozCraig 在評論中指出的那樣,創建一個常規的 Windows 應用程序而不是創建一個窗口。
您正在編寫控制台程序,因為入口點是main()
。 對於基於圖形的 Windows 應用程序,入口點應該是WinMain
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633559(v=vs.85).aspx
很簡單。 FreeConsole() api 會為你做這個魔術
BOOL WINAPI FreeConsole(VOID);
只需將您的應用程序類型從“控制台應用程序”更改為“Windows 應用程序”(並將您的main
更改為WinMain
)。 在這種情況下,您的應用程序將在沒有控制台窗口的情況下啟動。
只需在啟動時執行此操作
myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.