0

场景(强制删除文件,重启时无法删除):

  1. 我有一个在某个程序中打开的文件,比如 MS Word。可能还有一些其他文件也在 MS Word 中打开。
  2. 在我的 C# 程序中,我需要知道哪个进程正在访问该特定文件,并且只需要从 Word 中关闭/释放该特定文件。其他文件不应该被打扰,所以我不会使用 Process.Kill() 方法。

鉴于上述情况,我做了以下事情:

  1. 使用此处的代码找到了访问我的目标文件的进程(Process 类的实例)

  2. 找到该进程持有的句柄列表(使用 NtQuerySystemInformation() 方法)。

  3. 从句柄列表中,我能够找到保存我的文件的特定句柄(使用 NtQueryObject() 方法)。尝试在此句柄上调用 CloseHandle() 但这不起作用。
  4. 现在我还可以列出目标进程中的所有子窗口句柄。

如何找到与我在上面的步骤 3 中找到的文件句柄相关的特定窗口句柄?我的计划是使用带有 WM_CLOSE 消息的 SendMessage() 方法到该特定窗口,以便将其关闭并释放我的文件。

一种方法是检查该子窗口标题中的文件名字符串,然后关闭该窗口。但问题是,同名文件可能已从其他位置打开。

4

1 回答 1

0

我发现这个关于这个主题的非常详细的帖子,也许它可以帮助你

http://forum.sysinternals.com/howto-enumerate-handles_topic18892.html

那篇文章在这里有一些讨论和相关问题

http://forum.sysinternals.com/topic19403.html

于 2013-08-05T19:40:19.280 回答