2

現在、OS ライブラリ関数 (Windows.h) を使用してメッセージ ボックスを生成しています。これにより、魔法のようにプログラムが生き続け、コールバック関数の呼び出しに応答します。

プログラムを無言で永久に実行させるには、どのような代替アプローチを使用できますか?

「Ctrl-c」または SIGINT をトラップし、続いて RemoveHook() を呼び出してクリーンな終了を行うと便利ですが、必須ではありません。

HOOK my_hook;

CALLBACK my_callback_fn()
{
  ...
}

int main()
{
  my_hook = SetHook(my_callback_fn);
  MessageBox("Press OK to stop."); // This is bad.
  RemoveHook(my_hook);
  return 0;
}
4

4 に答える 4

3

おそらくメッセージをポンピングしたいでしょう。典型的なメッセージ ループは次のようになります。

BOOl ret;
MSG msg;
while ((ret=::GetMessage(&msg, hWnd, 0, 0))!=0)
{
  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
}

あなたはポンピングする実際のウィンドウを持っていないようで、実際に何をしているのかは言いませんSetHook.

もう 1 つの方法は、MsgWait 関数を使用することです。たぶん、終了できるようにシグナル状態になるのを待っているハンドルがありますか?:

while (::MsgWaitForMultipleObjects(1, &handle, FALSE, INFINITE, QS_ALLEVENTS)==WAIT_OBJECT_0+1+
{
  BOOl ret;
  MSG msg;
  while ((ret=::PeekMessage(&msg, hWnd, 0, 0, TRUE))!=0)
  {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
}
于 2009-06-06T08:44:02.750 に答える
0

簡単な解決策は、ループで Sleep() を呼び出すことです

int main() {
   // your stuff
   while(1) {
      Sleep( 10000 );
   }
   return 0;
}

ただし、フックの削除を行いたい場合は、Ctrl-C トラッピングを行う必要があることに注意してください。

于 2009-06-06T08:39:20.077 に答える
0

コマンド ラインを使用して Windows サービスを作成する方法が考えられる

プログラムで作成することもできます

于 2009-06-06T08:40:01.887 に答える
0

これは奇妙に聞こえるかもしれませんが、グローバル変数があります。クリップボード。_

以下をトラップすることで、クリップボードの変更をリッスンできます。

  • WM_CHANGECBCHAIN
  • WM_DRAWCLIPBOARD

WM_DRAWCLIPBOARD が送信されると、クリップボードのテキストが読み取られ、それが「マジック」ワード、つまり「##EXIT##」で始まる場合は、アプリケーションを終了できます。

于 2009-06-06T08:43:25.577 に答える