web-dev-qa-db-ja.com

C ++起動時にコンソールウィンドウを非表示にするにはどうすればよいですか?

起動時にコンソールウィンドウを非表示にする方法を知りたい。

キーロガープログラム用ですbut誰かをハッキングするつもりはありません。ハッカーの危険性を示すために作りたい小さな学校プロジェクトです。

これまでの私のコードは次のとおりです。

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

ウィンドウが表示され、起動時にすぐに消えます。その直後に新しいコンソールを開くようですが、これは空白です。 (空白とは、「続行するには任意のキーを押してください。」という意味です。system("PAUSE")に関係があるのではないかと思います。)

最初のコンソールを作成して非表示にするだけでなく、新しいコンソールが開く理由を知りたいのです。

ありがとう。 :)

17
mads232

文字通りオンデマンドでコンソールウィンドウを非表示/表示するには、次の関数を使用できます。 ShowWindow を使用して、コンソールを非表示/表示することができます。 GetConsoleWindow は、コンソールで使用されるウィンドウハンドルを取得します。 IsWindowVisible を使用して、ウィンドウ(その場合はコンソール)が表示されているかどうかを確認できます。

#include <Windows.h>

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

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

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

実行可能ファイルは特定の設定でオペレーティングシステムによって実行されるため、起動時にコンソールウィンドウを非表示にすることは実際には不可能です。そのため、たとえばFreeConsole();を使用すると、起動時にコンソールウィンドウが非常に短時間表示されます。起動時にウィンドウを本当に非表示にするには、コンパイラに特別なオプションを追加する必要があります。 Windows(MinGW)でgccを使用している場合は、-mwindowsをメイクファイルのコンパイラオプションとして使用すると、ウィンドウや「フラッシュ」がまったくなくなります。 VisualStudioや現在使用しているものについては知りませんが、IDEがコードをコンパイルする方法を変更することは、C++で回避策をコーディングする代わりに行う方法です。

私の見解では、このアプローチはWinMainを使用するよりも優れています。これは、確実に機能し、C++コードプラットフォームに依存しないためです。

11
user3932876

最初のコンソールを作成して非表示にするだけでなく、新しいコンソールが開く理由を知りたいのです。

コンソールアプリケーションは、実際にはコンソール自体を作成するのではなく、コンソールで実行するだけです。エクスプローラから実行可能ファイルを実行すると、Windowsはそれを実行するためのコンソールを作成します。FreeConsoleを呼び出すと、新しいコンソールは閉じられず、プロセスがそこから切り離されます。

WhozCraigがコメントで述べたように、通常のWindowsアプリケーションを作成し、ウィンドウは作成しないでください。

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

エントリポイントがmain()であるため、コンソールプログラムを作成しています。グラフィカルベースのWindowsアプリケーションの場合、エントリポイントはWinMainhttp://msdn.Microsoft.com/en-us/library/windows/desktop/ms633559(v = vs.85).aspxである必要があります。

4
segfault

アプリケーションのタイプを「コンソールアプリケーション」から「Windowsアプリケーション」に変更するだけです(mainWinMainに変更します)。この場合、アプリケーションはコンソールウィンドウなしで起動されます。

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

これにより、ウィンドウハンドル(HWND)がShowWindow()に返され、非表示になります。このソリューションはWindowsシステム専用です。

マークされていなくても、これは質問に対する正しい答えです。

編集:可能な解決策/ハックは、(Visual Studioで)リンカー->システム->サブシステムを「コンソール(/ SUBSYSTEM:CONSOLE)」ではなく「Windows(/ SUBSYSTEM:WINDOWS)」に設定することです。ただし、これはおそらく最適ではありません。

3
Charlie

簡単です。 FreeConsole() apiはあなたのためにその魔法を行います

BOOL WINAPI FreeConsole(VOID);
2
user1520846

起動時にそれを行うだけです

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