ウィンドウなしでアプリケーションを作成する

WinMain プログラムを作成すると、自動的に /SUBSYSTEM オプションがコンパイラのウィンドウになります。 (Visual Studio を使用していると仮定します)。他のコンパイラには同様のオプションが存在する可能性がありますが、フラグ名は異なる場合があります。

これにより、コンパイラは実行可能ファイル形式 (PE 形式) でエントリを作成し、実行可能ファイルを Windows 実行可能ファイルとしてマークします。

この情報が実行可能ファイルに存在すると、プログラムを起動するシステム ローダーは、バイナリをコンソール プログラムではなく Windows 実行可能ファイルとして扱うため、実行時にコンソール ウィンドウが自動的に開くことはありません。

しかし、Windows プログラムは、必要がなければウィンドウを作成する必要はありません。これは、タスクバーで実行されているすべてのプログラムやサービスと同様に、それらに対応するウィンドウが表示されないためです。これは、ウィンドウを作成しても表示しないことを選択した場合にも発生する可能性があります。

これをすべて達成するために必要なことは、

#include <Windows.h>

int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance, 
            LPTSTR    lpCmdLine, 
            int       cmdShow)
    {
    /* do your stuff here. If you return from this function the program ends */
    }

WinMain 自体が必要な理由は、サブシステムを Windows としてマークすると、リンカーはエントリ ポイント関数 (プログラムが読み込まれ、C 実行時間ライブラリが初期化された後に呼び出される) がメインではなく WinMain であると想定するためです。このようなプログラムで WinMain を提供しないと、リンク プロセス中に未解決のシンボル エラーが発生します。


Windows の場合:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   

Adam Mitz が述べているように、必ず /SUBSYSTEM リンカー スイッチを使用してください。

他のプラットフォーム:

int main(int argc, char**argv)
{
  // <-- Program logic here
  return 0;
}

コンソールやウィンドウを使用せずにプログラムを連続して実行する必要がある場合は、* NIX の便利なデーモンまたは Windows のサービスを見つけることができます。
あなたの質問はwin32とタグ付けされているので、サービスの方があなたにとってより関連性があると思います。