web-dev-qa-db-fra.com

C ++ Comment masquer une fenêtre de console au démarrage?

Je veux savoir comment masquer une fenêtre de console lorsqu'elle démarre.

C'est pour un programme keylogger, mais ce n'est pas mon intention de pirater quelqu'un. C'est pour un petit projet d'école que je veux faire pour montrer les dangers des hackers.

Voici mon code jusqu'à présent:

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

Je vois la fenêtre apparaître et disparaître immédiatement au démarrage. Il semble ouvrir une nouvelle console juste après cela, qui est juste vide. (Par blanc, je veux dire "Appuyez sur n'importe quelle touche pour continuer .." Je me demande si cela a quelque chose à voir avec system("PAUSE"))

Je veux donc savoir pourquoi il ouvre une nouvelle console, au lieu de seulement créer et masquer la première.

Merci. :)

17
mads232

Pour masquer/afficher la fenêtre de la console à la demande, vous pouvez utiliser les fonctions suivantes: Il est possible de masquer/afficher la console en utilisant ShowWindow . GetConsoleWindow récupère le handle de fenêtre utilisé par la console. IsWindowVisible peut être utilisé pour vérifier si une fenêtre (dans ce cas la console) est visible ou non.

#include <Windows.h>

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

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

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

Masquer une fenêtre de console au démarrage n'est pas vraiment possible dans votre code car l'exécutable est exécuté par le système d'exploitation avec des paramètres spécifiques. C'est pourquoi la fenêtre de la console s'affiche très brièvement au démarrage lorsque vous utilisez par exemple FreeConsole(); Pour vraiment masquer la fenêtre au démarrage, vous devez ajouter une option spéciale à votre compilateur. Si vous utilisez gcc sous Windows (MinGW), vous pouvez simplement ajouter -mwindows comme option de compilation dans votre makefile et il n'y aura absolument aucune fenêtre ou "flash". Je ne sais pas pour VisualStudio ou quoi que vous utilisiez pour le moment, mais changer la façon dont votre IDE compile votre code est la voie à suivre au lieu de coder les solutions de contournement en C++.

À mon avis, cette approche est meilleure que d'utiliser WinMain car elle fonctionne de manière fiable et vous ne dépendez pas de votre plate-forme de code C++.

11
user3932876

Je veux donc savoir pourquoi il ouvre une nouvelle console, au lieu de simplement créer et masquer la première.

Une application console ne crée pas réellement une console elle-même, elle s'exécute simplement en une seule. Si vous exécutez l'exécutable à partir de l'Explorateur, Windows crée une console pour qu'il s'exécute. Lorsque vous appelez FreeConsole, il ne ferme pas la nouvelle console, en détache simplement votre processus.

Comme WhozCraig l'a noté dans les commentaires, créez une application Windows standard et ne créez pas de fenêtre.

5
Turch
#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;
}
4
udit043

Vous écrivez un programme de console car le point d'entrée est main(). Pour les applications Windows à base graphique, le point d'entrée doit être WinMainhttp://msdn.Microsoft.com/en-us/library/windows/desktop/ms633559 (v = vs.85) .aspx

4
segfault

Changez simplement le type de votre application de "Application console" en "Application Windows" (et changez votre main en WinMain). Dans ce cas, votre application sera lancée sans fenêtre de console.

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

Cela retournera un handle de fenêtre (HWND) à ShowWindow() qui à son tour le masquera. Cette solution concerne uniquement les systèmes Windows.

C'est la bonne réponse à la question, même si elle n'est pas marquée comme telle.

edit: Une solution possible/hack pourrait être de définir (dans Visual Studio) Linker-> System-> SubSystem sur "Windows (/ SUBSYSTEM: WINDOWS)" au lieu de "Console (/ SUBSYSTEM: CONSOLE)". Ce n'est probablement pas optimal cependant.

3
Charlie

C'est simple. FreeConsole () api fera cette magie pour vous

BOOL WINAPI FreeConsole(VOID);
2
user1520846

Faites-le juste au démarrage

myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);
2
Alex Sha