1

私は同僚からこのアプリケーション(Visual C ++で記述されたWindowsフォームアプリケーション)を持っていますが、いくつかの深刻な問題に直面しています。アプリケーションはサービスでも通常のアプリケーションでもありません。つまり、GUIがありますが、ほとんどの場合、バックグラウンドで実行されます(サービスとして反応するはずですが、そうではありません)。このアプリケーションはユーザーがログオフするのを妨げています、そして私はそれをすることができる必要があります。

WM_QUERYENDSESSIONユーザーがログオフしようとすると、Windowsが実行中のすべてのアプリケーションにメッセージを送信することを知っています。関数でこのメッセージをキャッチしWndProc()、アプリケーションを強制的に強制終了しようとしましたが、機能するのは1回だけです。再度ログインしてログオフしようとしても、アプリケーションが閉じないため、操作が終了しません。

イベントを使用しようとするSessionEndingと、アプリケーションはシステムトレイに置かれ、ログオフせずにそこに残りますが、これは、Form_Closingメソッドがプログラムを閉じる代わりにこの操作を実行するためだと思います(これは要件であり、変更できません) )。

もう1つの有用な情報は、HKLMレジストリにエントリがあり、このアプリケーションのインスタンスが常に2つ実行されているため、アプリケーションが自動的に起動することです(一方は他方を監視し、クラッシュした場合は再起動する必要がありますが、「手動」の場合は再起動しないでください)。シャットダウン)。

どんな提案でも好評です。

ありがとう。

4

3 に答える 3

1

SetConsoleCtrlHandlerは、ユーザーがログオフしたとき、およびシステムがシャットダウンしたときにイベントが生成されるため、ソリューションを提供する場合があります。

于 2011-11-08T12:52:37.593 に答える
1

はい、この問題はフォームのFormClosingイベントハンドラーが原因で発生します。クローズ理由に注意を払い、ユーザーがウィンドウを閉じているときにのみキャンセルする必要があります。このような:

    System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
        // Do this *only* when the user closes the window
        if (e->CloseReason == CloseReason::UserClosing) {
            e->Cancel = true;
            this->Hide();
            // etc...
        }
    }
于 2011-11-08T13:30:01.397 に答える
0

ソースコードを制御できる場合は、2番目の(コントローラー)インスタンスを真のWindowsサービスとして再実装します。GUIインスタンスを監視し、失敗した場合やシャットダウンが必要な場合は、必要な制御アクションを実行します。

これにより、現在手動​​で実行する必要のある自動再起動ロジックの一部が無料で提供され、 SERVICE_CONTROL_SHUTDOWNを介して適切なシャットダウン処理が可能になります。

于 2011-11-08T12:52:34.533 に答える