シナリオ (ファイルを強制的に削除する場合、再起動時に削除できません):
- MS Word などのプログラムで開いているファイルがあります。MS Word で開いているファイルが他にもある可能性があります。
- 私の C# プログラムでは、どのプロセスがその特定のファイルにアクセスしているかを知る必要があり、その特定のファイルのみを Word から閉じたり解放したりする必要があります。他のファイルに影響を与えてはならないので、Process.Kill() メソッドは使用しません。
上記のシナリオを考慮して、次のことを行いました。
こちらのコードを使用してターゲット ファイルにアクセスするプロセス (Process クラスのインスタンス) を見つけました
そのプロセスが保持するハンドルのリストを見つけました (NtQuerySystemInformation() メソッドを使用)。
- ハンドルのリストから、ファイルを保持している特定のハンドルを見つけることができました (NtQueryObject() メソッドを使用)。このハンドルで CloseHandle() を呼び出そうとしましたが、うまくいきません。
- これで、ターゲット プロセスのすべての子ウィンドウ ハンドルを一覧表示することもできます。
上記の手順 3 で見つけたファイル ハンドルに関連する特定のウィンドウ ハンドルを見つけるにはどうすればよいですか? 私の計画は、その特定のウィンドウへの WM_CLOSE メッセージで SendMessage() メソッドを使用して、ウィンドウを閉じてファイルを解放することです。
1 つの方法は、その子ウィンドウのタイトルでファイル名の文字列を確認してから、そのウィンドウを閉じることです。しかし問題は、同じ名前のファイルが別の場所から開かれている可能性があることです。