C++ Como posso esconder uma janela de consola no arranque?

Quero saber como esconder uma janela de consola quando começar.

Quero ser honesto e dizer-te que é para um programa keylogger, mas não é minha intenção hackear alguém. É para um pequeno projecto escolar que quero fazer, para mostrar os perigos dos hackers. (Eu pensei que poderia ser muito legal para mostrar algo como isso na escola.)

Espero que me ajudes com isto.

Então... Aqui está o código que escrevi ao procurar no google. (Don't mind all the notas sobre as intenções.)

#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. :)

Author: Claudio, 2013-08-15

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);
}
 8
Author: nikau6, 2016-11-05 17:55:02
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.

 5
Author: Turch, 2013-08-15 20:10:59

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

 4
Author: segfault, 2013-08-15 20:26:16
#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;
}
 3
Author: udit043, 2015-02-16 16:28:36

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.

 3
Author: user3932876, 2017-02-15 12:54:40
É simples. O FreeConsole () a api fará essa magia por ti
BOOL WINAPI FreeConsole(VOID);
 2
Author: user1520846, 2015-11-22 18:59:34

Faz isso no arranque

myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);
 2
Author: Ferro Rodrigues, 2016-04-02 10:12:49
#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.

Esta é a resposta correcta à pergunta, mesmo que não esteja marcada como ela.

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.

 2
Author: Charlie, 2018-04-08 03:19:06

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.

 1
Author: qehgt, 2013-08-15 20:48:35