簡體   English   中英

C++ 如何在啟動時隱藏控制台窗口?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM