场景(强制删除文件,重启时无法删除):
- 我有一个在某个程序中打开的文件,比如 MS Word。可能还有一些其他文件也在 MS Word 中打开。
- 在我的 C# 程序中,我需要知道哪个进程正在访问该特定文件,并且只需要从 Word 中关闭/释放该特定文件。其他文件不应该被打扰,所以我不会使用 Process.Kill() 方法。
鉴于上述情况,我做了以下事情:
使用此处的代码找到了访问我的目标文件的进程(Process 类的实例)
找到该进程持有的句柄列表(使用 NtQuerySystemInformation() 方法)。
- 从句柄列表中,我能够找到保存我的文件的特定句柄(使用 NtQueryObject() 方法)。尝试在此句柄上调用 CloseHandle() 但这不起作用。
- 现在我还可以列出目标进程中的所有子窗口句柄。
如何找到与我在上面的步骤 3 中找到的文件句柄相关的特定窗口句柄?我的计划是使用带有 WM_CLOSE 消息的 SendMessage() 方法到该特定窗口,以便将其关闭并释放我的文件。
一种方法是检查该子窗口标题中的文件名字符串,然后关闭该窗口。但问题是,同名文件可能已从其他位置打开。