2011-06-17 9 views
7

バックアップの前にユーザー定義の実行中のプログラムを閉じて、バックアップ前に開いているデータファイルを閉じてフラッシュできるバックアップアプリケーションがあります。バックアップが完了すると、リスト内のプログラムが再起動されます。TerminateProcessよりも親切な方法はありますか?

キャプションとPostMessage(AppHandle、WM_CLOSE、0,0)を使用してウィンドウハンドルを取得するのに問題はありません。ほとんどのアプリケーションでうまく動作しますが、通知領域(システムトレイ)で動作するアプリケーションではうまく動作しません。

現在、私はTerminateProcessを使用しています(通知領域アプリケーションでも機能しますが、そしてちょうどそれらのアプリをダウン叩きつけ。

私は長いとハード検索しましたと私は通知領域のアプリケーションをシャットダウンするよりよい方法を見つけることができません。誰でも助けてくださいことはできますか?

おかげ

+3

'TerminateProcess'はファイルを開いたままにしません。すべての開いているハンドルは、所有プロセスが終了すると閉じられます。また、開いているファイルをバックアップしたい場合は、OSはすでにそのためのAPIを提供しています:シャドウコピー。 –

+0

@Rob:開いているファイルをバックアップしようとすると、ファイルが矛盾した状態でスナップショットを撮る可能性があります。 – Gabe

+1

@Gabe、予期せずプログラムをシャットダウンするより悪くない... – bdonlan

答えて

8

を閉じるためにプログラムはうまくいけば、あなたはそのプログラムがどのようにcとなるかを知る必要があります失われた。メインウィンドウを閉じるとそれを実現する場合、 "メイン"ウィンドウを認識する方法を知る必要があります。

プログラムは通知領域内で実行されません。そこにアイコンが表示されます。通知アイコンを持つプログラムにはウィンドウが必要です(ウィンドウにメッセージを送信してアイコンがクリックされたことをシェルがプログラムに通知するため)。ウィンドウが表示されていなくても、ウィンドウはまだ存在していなければなりません。特定の通知アイコンに関連付けられているウィンドウを識別するプロパティーのセットを判別できる場合は、それを閉じることができます。しかし、探している属性の標準セットはありません。各プログラムはそれを別々に行うことができます。

あなたが探しているウィンドウが見つかったとしても、それを閉じるとプログラムが終了するとは思われません。代わりに、通知アイコンのメニューから特定のコマンドを、またはプログラムが表示するダイアログボックスから送信される何らかのメッセージが必要になることがあります。

+1

+1。プログラムがクリーンアップ操作を実行する原因となるものは何もわかりません。もちろん、WM_QUITなどの隠しウィンドウを送信することもできますが、TerminateProcessのようにすべてのクリーンアップをスキップする可能性があります。 – bdonlan

+0

これは実現していますが、少なくともwm_Closeを使用することはTerminateProcessで終了するよりも優れています。優しいCloseは、必要なクリーンアップのすべてをカバーする可能性が高くなります。そうでなければ、少なくとも私のアプリは穏やかに物事を閉じようとしました。下の私の他のコメントを参照してください。 – user568160

2

アプリケーションがWindows VistaまたはWindows 7で実行されている場合は、プログラムをシャットダウンしないでください。代わりにVolume Shadow Copy serviceを使用して、ファイルがまだ使用されている間にスナップショットにアクセスしてください。これは、Windows 7に組み込まれたバックアッププログラムの機能です。

以前のバージョンのWindowsを使用している場合は、絶対に解決策はありません。プログラムにシストレイアイコンがある場合は、隠しウィンドウも表示されますので、WM_QUERYENDSESSIONWM_ENDSESSIONを送信してみてください。ただし、プログラムがシャットダウンする必要はありません。シャットダウンした場合、通常のシャットダウンプロセスの一部をバイパスしている可能性があるため、通常のクリーンアップが完了しない可能性があります。また、関連付けられたウィンドウがない状態で実行されているプログラムがあるかもしれません。最良の方法は、単にユーザーからログオフし、サービスプロセスからバックアップを実行することです。もちろん、あなたはまだ他のサービスによって開かれているファイルと共有の問題があります...

+0

ありがとうございましたが、問題に最初に気付いたのはシャドウコピーでした。シャドウコピーを使用すると、実行中にファイルを復号化してからクローズ時に暗号化するプログラムは、「クリア」状態でコピーされます。私のパスワードはすべてコピーされ、Clear !!でバックアップされました!だから私は親切に閉じて、TerminateがしないCloseプロセスを通ってアプリケーションを実行させたいのです。 – user568160

+2

これらのプログラムは壊れています。それはすべてそこにある。一時ディレクトリをスキップすることもできますが、パスワードプログラムがパスワードデータベースを解読してディスクに残しておけば、すでに暗号化が役に立たなくなっています(攻撃者はディスクをスキャンして削除ファイルを見つけることができます)。 – bdonlan

関連する問題