2011-01-05 10 views
2

アプリケーションにはウィンドウやコンソールは必要ありません。コンソールウィンドウを削除するか、バックグラウンドに入れることができる場合は、コンソールアプリケーションにすることができます。アプリケーションはいくつかの簡単なタスク(ゴミ箱のクリーニングなど)を行い、終了します。Cでバックグラウンドでウィンドウなしでwin32アプリケーションを作成するには?

  1. 可能であれば、アプリケーションをWindowsサービスにしないでください。

  2. エクスプローラウィンドウでダブルクリックしてアプリケーションを起動し、サイレントモードで実行することをお勧めします。

  3. アプリケーションが実行されているとき、マウスカーソルを砂時計の形に変更しないことを願っています。つまり、アプリケーションの実行中にユーザーを妨害しないでください。黙って走り抜けてください。

  4. Windowsの起動時やユーザーログイン時に実行する必要はありません。

可能であれば、これを行うことを希望します。私は何をすべきか?

ありがとうございます!

更新: 現在OKです。ありがとうございました!


    task_finished = 0; 
    CreateThread(NULL, 65535, task_thread, para, 0, NULL); 

    MSG msg; 
    while(!task_finished){ 
     while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 
      if(task_finished) 
       break; 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 

答えて

1

必要なのは、メッセージループである - ちょうど(hereから変更された)このコードを使用します。

MSG msg; 
BOOL bRet; 
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

編集:

I/Oまたは他のタスクのために、 (1)別のスレッドを作成してそこからすべてを実行するか、または(2)ループ内で(GetMessage()コールの前に)MsgWaitForMultipleObjectsを使用して、同時にI/Oとメッセージが表示されるので、メッセージがあるとき、またはI/Oが終了したときに通知を受けることができます。

警告

私は起動時にアプリケーションが砂時計の形を持ち出すないようにする方法を考え出したていません。その機能が必要な場合は、代わりにWindowsサービスを作成することを検討してください。コンソールアプリケーションとしてコンパイルしてから、FreeConsoleを使用してウィンドウを非表示にすることもできます。

+0

IOコードはどこに置くべきですか? GetMessageはここでブロックされるようです。 – user563413

+0

良い質問です。私の編集を参照してください。 :) 質問:すべてのアプリケーションがI/Oであれば、それだけではどうですか?メッセージループを必要としないかもしれません.1回限りのもので、メッセージを処理しない場合です。 – Mehrdad

+0

私もスレッドを検討するようになりました。しかし、メソッドがある場合は少し重い:可能であれば、このプログラムがユーザーとやりとりすることなくバックグラウンドで実行されることをシステムに通知するためのメッセージを送信する(可能な場合など)?ありがとう。GetMessageブロックには、システムの砂時計が消えます。 FreeConsole、興味深い。今しよう。 – user563413

2

IIRCこれは、ウィンドウまたはコンソールを作成または表示しないWinMain関数を作成するだけで実行できます。メッセージループを使うことについてのLambertの答えは、あなたのプログラムが他のプログラムからのメッセージを送受信できるようにするのに役立ちますが、単純なバックグラウンド処理をするだけであれば、WinMainが必要です。窓。

+0

私は "int main(int argc、int argc、int argc、int argc、int argc、int argc、int argc)"を置き換えることを試みました。 char ** argv) "" int WINAPI WinMain(HINSTANCE hInstance、HINSTANCE hPrevInstance、 PSTR szCmdLine、int iCmdShow) "を使用してください。 gcc -mwindowsでコードをコンパイルします。しかし、ダブルクリックしてエクスプローラでアプリケーションを実行すると、砂時計のマウスカーソルが表示されます。 – user563413

+0

一方、メインまたはWinMainが使用されてから数秒後に砂時計が消えることがわかりました。終了するまで、プログラムは自動的に実行されます。 GetMessageを使ったアプリケーションと同じように、砂時計が一度に消えることを願っています。 – user563413

+0

PeekMessage()を一度呼び出します。 –

関連する問題