Затваряне на дъщерен прозорец на процес (напр. прозорец на Word) с достъп до конкретен файл

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

  1. Имам файл, който се отваря в някаква програма, да речем M.S. Слово. Може да има и други файлове, отворени в M.S. Слово.
  2. В моята C# програма трябва да знам кой процес има достъп до този конкретен файл и трябва да затворя/освободя само този конкретен файл от 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