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. :)
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;
}
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++.
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.
#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;
}
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 WinMain
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms633559 (v = vs.85) .aspx
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.
#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.
C'est simple. FreeConsole () api fera cette magie pour vous
BOOL WINAPI FreeConsole(VOID);
Faites-le juste au démarrage
myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);