2013-08-15 18 views
6

Chcę wiedzieć, jak ukryć okno konsoli po uruchomieniu.C++ Jak ukryć okno konsoli podczas uruchamiania?

Chciałbym być szczery i powiedzieć, że to program keyloggera, ALE nie jest moją intencją zhakowanie kogoś. To dla małego projektu szkolnego, który chcę zrobić, aby pokazać zagrożenia związane z hakerami. (Myślałem, że fajnie byłoby pokazać coś takiego w szkole.)

Mam nadzieję, że mi w tym pomożecie.

So. Oto kod, który napisałem, sprawdzając go w Google. (. Nie przeszkadza wszystkie notatki o intencjach)

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

Jak widać, i obejmowały windows.h i napisał FreeConsole(); głównie.

Tak, widzę pojawiające się okno i natychmiast znika. Ale wydaje się, że zaraz po tym otworzy się nowa konsola, która jest po prostu pusta. (Z pustym, mam na myśli: "Naciśnij dowolny klawisz, aby kontynuować." Zastanawiam się, czy ma to coś wspólnego z "systemem" ("PAUSE") ")

Więc chcę wiedzieć, dlaczego to otwiera nowa konsola, zamiast tylko tworzyć i ukrywać pierwszą.

Dzięki. :)

+1

'system' spawnuje nową powłokę .. – Rapptz

+6

Nie pisz tego jako programu konsoli. Po prostu wpisz "WinMain()" bez okna. Użyj okna wiadomości lub modalnego okna dialogowego dla spamu ekranowego. – WhozCraig

+0

Musisz podać podsystem w opcjach linkera. – chris

Odpowiedz

3

Więc chcę wiedzieć, dlaczego otwiera nową konsolę, zamiast tylko tworzyć i ukrywać pierwszą.

Aplikacja konsolowa w rzeczywistości nie tworzy samej konsoli, działa tylko w jednym. Jeśli uruchomisz plik wykonywalny z Eksploratora, system Windows utworzy konsolę do uruchomienia. Po wywołaniu FreeConsole, nie zamyka ona nowej konsoli, po prostu odłącza od niej swój proces.

Jak zauważył WhozCraig w komentarzach, utwórz zwykłą aplikację Windows i nie twórz okna.

1

Wystarczy zmienić typ aplikacji z „Console Application” do „appplication Windows” (i zmienić main do WinMain). W takim przypadku aplikacja zostanie uruchomiona bez okna konsoli.

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

Wystarczy zrobić na starcie

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

auto myConsole = GetConsoleWindow(); \t ShowWindow (myConsole, 0); załatwił sprawę: D – Charlie

+0

Dynamiczne pisanie jest silne dzięki temu. – Ch3shire

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

To zwróci uchwyt okna (HWND) do myConsole i ShowWindow skutecznie ukryć. To rozwiązanie będzie działać tylko w systemach Windows.

To jest poprawna odpowiedź na pytanie, nawet jeśli nie jest oznaczona jako.

edytuj: Możliwe rozwiązanie to (w visual studio) Linker-> System-> SubSystem do "Windows (/ SUBSYSTEM: WINDOWS)" zamiast "Console (/ SUBSYSTEM: CONSOLE)". To sprawia, że ​​konsola nie jest wyświetlana, co pozwala uniknąć migotania.

4

Aby dosłownie ukryć/wyświetlić okno konsoli na żądanie, można użyć następujących funkcji: Istnieje możliwość ukrycia/wyświetlenia konsoli przy użyciu ShowWindow. GetConsoleWindow pobiera uchwyt okna używany przez konsolę. IsWindowVisible można użyć do sprawdzenia, czy okno (w tym przypadku konsola) jest widoczne, czy nie.

#include <Windows.h> 

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

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

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

Ukrywanie okno konsoli podczas uruchamiania nie jest w ogóle możliwe w kodzie wykonywalnym, ponieważ prowadzony jest przez system operacyjny z określonymi ustawieniami. Dlatego okno konsoli wyświetlane jest przez bardzo krótki czas przy uruchamianiu, gdy używasz na przykład FreeConsole(); Aby naprawdę ukryć okno przy starcie, musisz dodać specjalną opcję do kompilatora. Jeśli używasz gcc w Windows (MinGW), możesz po prostu dodać -mwindows jako opcję kompilatora do pliku makefile i nie będzie absolutnie żadnego okna ani "flashowania". Nie wiem o VisualStudio ani o czymkolwiek, co używasz w tej chwili, ale zmiana sposobu, w jaki IDE kompiluje twój kod, jest sposobem na obejście zamiast kodowania obejść w C++.

Moim zdaniem to podejście jest lepsze niż użycie WinMain, ponieważ działa niezawodnie i nie powoduje uzależnienia od platformy kodu C++.

Powiązane problemy