Qtで書かれたWindowsにLinuxアプリケーションを移植しています。終了する前に、いくつかの設定を保存する必要があります。 Linuxでは、SIGTERMなどのシグナルハンドラでこれを行うことができます。どのようにしてWindows上で実装できますか?あなたはQtのイベントループを使用している場合QtでWindowsのシャットダウンまたはログオフを検出する方法
答えて
は、次の信号をキャッチすることができます:
無効QCoreApplication :: aboutToQuit()[信号]
アプリケーションがしようとしているときに、この信号が発せられますメインイベントループを終了する。イベントループレベルがゼロに低下したとき。これは、アプリケーション内部からのquit()呼び出し後、またはユーザーがデスクトップセッション全体をシャットダウンするときに発生する可能性があります。 アプリケーションは、最後の2回目のクリーンアップを実行する必要がある場合に特に便利です。この状態ではユーザーとの対話はできません。それ以外
、あなたは上記の信号はあなたのユースケースに適していない場合は、以下の次のメッセージを探していることがあります。
WM_QUIT:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx
WM_CLOSE:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx
WM_QUERYENDSESSION :http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx
WM_ENDSESSION:http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx
Qtがわかりません。あなたがWindowsになることができればWM_QUERYENDSESSION
とWM_ENDSESSION
のメッセージが正しいことかもしれません。
私は他の回答を完全にがポイントを逃すと思う:強制的にアプリケーションを終了すると、それはUnixのSIGKILLのようです。 それを処理する方法はありません - 前もってを除きます。前もって処理することは、設定が変更されるたびに設定を保存することです。もちろん、この動作を最適化することができます。たとえば、ディスクアクセスの回数を最小限に抑える(モバイルデバイスの消費電力を考える)場合は、数秒ごとに設定を保存してください。
これは多くの場合、QSettings
によって処理されます。 QSettings
を使用している限り、妥当な動作をします。ファイルを自分で保存している場合は、ファイルをフラッシュしてアトミックファイルの置き換えに近づけるため、QSaveFile
を使用してください。書き込みの途中でkill(強制終了)が発生した場合、設定を失わないようにします。
QCoreApplication
によって発信された信号は、アプリケーションが終了するように要求されたときに何かをしたい場合に反応します。これは、メッセージ()を扱うこと、またはUnix上でSIGTERM
を扱うことと同等です。 Qtがあなたのために既にそれをしているので、プラットフォーム固有の方法でそれを行うことは無意味です。WM_CLOSE
の扱いには全く同じことが言えません。これは、ウィンドウだけが取得するメッセージなので、Qtはすでにそれを処理しているからです。
QAbstractNativeEventFilter
をインストールし、WM_ENDSESSION
とWM_QUERYENDSESSION
を処理することによって、ログオフ/シャットダウンプロセスに参加することもできます。これは、アプリケーションが終了することを事前に知りたい場合にのみ意味があります。シャットダウン/ログオフを明示的に停止しない限り、それを心配する必要はありません。
aboutToQuitの代わりにQApplication::commitDataRequestシグナル(Qt5ではQGuiApplication::commitDataRequest)を処理するほうが良いかもしれないと思います。設定を保存する機能に信号を接続するだけです。ここで
は、いくつかの関連する議論です:http://qt-project.org/forums/viewthread/33329
- 1. WindowsシャットダウンをC#で検出する
- 2. Javaで構築されたWindowsサービスでWindowsのシャットダウン、ログオフ、再起動をキャプチャしますか?
- 3. Windowsシャットダウンと.NET/C#(またはp/invoke)の再起動を検出する方法
- 4. Windowsがシャットダウンまたは再起動しているかどうかを検出する方法
- 5. Qtのツールチップ内でマウスのクリックを検出する方法は?
- 6. Windows 10でPowerShellでWindowsシャットダウンをブロックする方法
- 7. Qtネットワーククラスでシャットダウンの競合状態を回避する方法
- 8. 未知のスレッドプールを検出してシャットダウンする方法はありますか?
- 9. QtアプリケーションをUWPまたはWindows 10モバイルにデプロイする方法
- 10. バッチスクリプト(ログオフ/シャットダウン)すべてのユーザーのためにクロームのキャッシュフォルダをクリアする
- 11. Windows 10の検出方法は?
- 12. MouseArea Qtの左または右のスワイプを検出するQML
- 13. Pythonを使用したWindowsログオフ
- 14. Azure Appサービス - シャットダウンの検出
- 15. PHP、IOS、Android、Windows上でChromeを検出する方法は?
- 16. プログラムでアプリケーションを検出する方法がWindowsでクラッシュしましたか?
- 17. MacまたはLinuxをJavaでシャットダウンする方法は?
- 18. Qt QApplication :: commitData、Windowsのシャットダウン、混乱している文書
- 19. Valgrindや他のツールで私のQtソフトウェアのメモリリークを検出する方法は?
- 20. コンピュータのログオンとログオフWindows 7
- 21. Windows 10で自動シャットダウンを設定する方法
- 22. ユニバーサルWindowsプラットフォームでのアプリケーションの存在を検出する方法
- 23. Windows C++またはC#では、現在シャットダウン/再起動/ログオフしている場合にOSに問い合わせることができます
- 24. C#NETでアプリケーションのシャットダウンを検出しますか?
- 25. WindowsをQt/C++でGUIに変換する方法は?
- 26. QTでのキャプティブポータル検出4.6
- 27. Windowsシステム情報をC++で検出する方法
- 28. WindowsでUSB速度を検出する方法
- 29. ANTでWindows OSを検出する方法
- 30. Qtライブラリで検出されたGUIスレッド
私はabouttoQuitは、Linux上でSIGTERMを扱う知りませんでしたが、SIGHUP&SIGINTについて、SIGHUPは、通常のLinuxにログアウト時にアプリケーションに送信され、私はシグナルハンドラを使用する理由、それはあります(Qt way platform specific) –
質問については、アプリケーションが強制終了されているとは言えません。これは、 'SIGKILL'ではなく、正常なシャットダウンシグナルである' SIGTERM'に言及しています。 – qris