起動時にコンソールウィンドウを非表示にする方法を知りたい。
キーロガープログラム用です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")
に関係があるのではないかと思います。)
最初のコンソールを作成して非表示にするだけでなく、新しいコンソールが開く理由を知りたいのです。
ありがとう。 :)
文字通りオンデマンドでコンソールウィンドウを非表示/表示するには、次の関数を使用できます。 ShowWindow を使用して、コンソールを非表示/表示することができます。 GetConsoleWindow は、コンソールで使用されるウィンドウハンドルを取得します。 IsWindowVisible を使用して、ウィンドウ(その場合はコンソール)が表示されているかどうかを確認できます。
#include <Windows.h>
void HideConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_HIDE);
}
void ShowConsole()
{
::ShowWindow(::GetConsoleWindow(), SW_SHOW);
}
bool IsConsoleVisible()
{
return ::IsWindowVisible(::GetConsoleWindow()) != FALSE;
}
実行可能ファイルは特定の設定でオペレーティングシステムによって実行されるため、起動時にコンソールウィンドウを非表示にすることは実際には不可能です。そのため、たとえばFreeConsole();
を使用すると、起動時にコンソールウィンドウが非常に短時間表示されます。起動時にウィンドウを本当に非表示にするには、コンパイラに特別なオプションを追加する必要があります。 Windows(MinGW)でgccを使用している場合は、-mwindows
をメイクファイルのコンパイラオプションとして使用すると、ウィンドウや「フラッシュ」がまったくなくなります。 VisualStudioや現在使用しているものについては知りませんが、IDEがコードをコンパイルする方法を変更することは、C++で回避策をコーディングする代わりに行う方法です。
私の見解では、このアプローチはWinMain
を使用するよりも優れています。これは、確実に機能し、C++コードプラットフォームに依存しないためです。
最初のコンソールを作成して非表示にするだけでなく、新しいコンソールが開く理由を知りたいのです。
コンソールアプリケーションは、実際にはコンソール自体を作成するのではなく、コンソールで実行するだけです。エクスプローラから実行可能ファイルを実行すると、Windowsはそれを実行するためのコンソールを作成します。FreeConsole
を呼び出すと、新しいコンソールは閉じられず、プロセスがそこから切り離されます。
WhozCraigがコメントで述べたように、通常のWindowsアプリケーションを作成し、ウィンドウは作成しないでください。
#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;
}
エントリポイントがmain()
であるため、コンソールプログラムを作成しています。グラフィカルベースのWindowsアプリケーションの場合、エントリポイントはWinMain
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms633559(v = vs.85).aspxである必要があります。
アプリケーションのタイプを「コンソールアプリケーション」から「Windowsアプリケーション」に変更するだけです(main
をWinMain
に変更します)。この場合、アプリケーションはコンソールウィンドウなしで起動されます。
_#include <windows.h>
ShowWindow(GetConsoleWindow(), SW_HIDE); //SW_RESTORE to bring back
_
これにより、ウィンドウハンドル(HWND)がShowWindow()
に返され、非表示になります。このソリューションはWindowsシステム専用です。
マークされていなくても、これは質問に対する正しい答えです。
編集:可能な解決策/ハックは、(Visual Studioで)リンカー->システム->サブシステムを「コンソール(/ SUBSYSTEM:CONSOLE)」ではなく「Windows(/ SUBSYSTEM:WINDOWS)」に設定することです。ただし、これはおそらく最適ではありません。
簡単です。 FreeConsole() apiはあなたのためにその魔法を行います
BOOL WINAPI FreeConsole(VOID);
起動時にそれを行うだけです
myConsole = GetConsoleWindow();
ShowWindow(myConsole,0);