C++ Como posso esconder uma janela de consola no arranque?
#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;
}
Como podem ver, incluí as janelas.h E escreveu FreeConsole (); no principal.
Sim, vejo a janela a aparecer e desapareço imediatamente. Mas parece abrir uma nova consola logo depois disso, que está em branco. (Com branco, quero dizer: "pressione qualquer tecla para continuar.."Estou a pensar se tem alguma coisa a ver com o" sistema ("pausa")")
Por isso quero saber porque abre uma nova consola, em vez de criar e esconder a primeira um.
Obrigado. :)
9 answers
Para esconder/mostrar literalmente a janela da consola a pedido, poderá usar as seguintes funções: É possível esconder / mostrar a consola usando ShowWindow. GetConsoleWindow recupera a pega da janela usada pela consola. IsWindowVisible pode ser usado para verificar se uma janela (nesse caso, a consola) está visível ou não.
#include <Windows.h>
void HideConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}
void ShowConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_SHOW);
}
bool IsConsoleVisible()
{
return (::IsWindowVisible(::GetConsoleWindow()) != FALSE);
}
Por isso, quero saber porque abre uma nova consola, em vez de criar e esconder a primeira.
Uma aplicação de consola não cria uma consola em si, apenas funciona numa. Se você executar o executável do Explorer, O Windows cria uma consola para que ele seja executado. Quando você chama {[[0]}, ele não fecha a nova consola, simplesmente desvia o seu processo dela.
Como o WhozCraig observou nos comentários, crie uma aplicação regular do Windows e não crie um janela.
Está a escrever um programa de consola porque o ponto de entrada é main()
. Para aplicações gráficas baseadas no Windows, o ponto de entrada deve ser WinMain
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633559 (V = vs. 85).aspx
#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;
}
Esconder uma janela da consola no arranque não é realmente possível no seu código porque o executável é executado pelo sistema operativo com configurações específicas. É por isso que a janela da consola é mostrada por um curto período de tempo no arranque, quando você usa por exemplo FreeConsole();
Para realmente esconder a janela no arranque, terá de adicionar uma opção especial ao seu compilador. Se você usar o gcc no Windows (MinGW) você pode apenas adicionar -mwindows
como opção de compilador no seu makefile e não haverá absolutamente nenhuma janela ou "flash".
Eu não sei sobre VisualStudio ou o que você usa no momento, mas mudar a forma como seu IDE compila seu código é o caminho a seguir em vez de codificar workarounds em C++.
Na minha opinião, esta abordagem é melhor do que usar {[[2]} porque funciona de forma fiável e você não torna a sua plataforma de código C++ dependente.
BOOL WINAPI FreeConsole(VOID);
Faz isso no arranque
myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);
#include <windows.h>
ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back
Isto irá devolver uma pega do windows (HWND) a ShowWindow()
que, por sua vez, irá escondê-la. Esta solução é apenas para sistemas windows.
Editar: uma possível solução / hack pode ser definir (em estúdio visual) Linker->sistema - >sub-sistema para "Windows (/sub-sistema:WINDOWS)" em vez de "consola (/sub-sistema:consola)". Isto provavelmente não é o ideal no entanto.
Basta mudar o tipo da sua aplicação de "Console application" Para "Windows Application" (e mudar o seu main
para WinMain
). Neste caso, sua aplicação será iniciada sem janela de console em tudo.