Закрытие дочернего окна процесса (например, окна Word) с доступом к определенному файлу

Сценарий (для принудительного удаления файла невозможно удалить при перезапуске):

  1. У меня есть файл, который открывается в какой-то программе, скажем, M.S. Слово. Могут быть и другие файлы, открытые в MS. Слово.
  2. В моей программе на С# мне нужно знать, какой процесс обращается к этому конкретному файлу, и мне нужно закрыть/освободить только этот конкретный файл из Word. Другие файлы трогать не следует, поэтому я не буду использовать метод Process.Kill().

Учитывая описанный выше сценарий, я сделал следующее:

  1. Найден процесс (экземпляр класса Process), обращающийся к моему целевому файлу с помощью кода здесь< /а>

  2. Найден список дескрипторов этого процесса (используя метод NtQuerySystemInformation()).

  3. Из списка дескрипторов я смог найти конкретный дескриптор, содержащий мой файл (используя метод NtQueryObject()). Пытался вызвать CloseHandle() для этого дескриптора, но это не сработало.
  4. Теперь я также могу перечислить все дескрипторы дочерних окон из моего целевого процесса.

Как мне найти этот конкретный дескриптор окна, связанный с дескриптором файла, который я нашел на шаге 3 выше? Мой план состоит в том, чтобы использовать метод SendMessage() с сообщением WM_CLOSE для этого конкретного окна, чтобы оно было закрыто, а мой файл был выпущен.

Один из способов — проверить строку имени файла в заголовке этого дочернего окна, а затем закрыть это окно. Но проблема в том, что файл с таким же именем мог быть открыт из другого места.


person Nadeem Ullah    schedule 05.08.2013    source источник


Ответы (1)


Я нашел этот очень подробный пост о предмете, может быть, он может вам помочь

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

В этом посте есть некоторые обсуждения и связанные вопросы здесь

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

person Mauricio Gracia Gutierrez    schedule 05.08.2013