>я уже пытался открыть файл с правом SYNCHRONIZE, но Wait... возвращает WAIT_OBJECT_0 всегда ???:
Хм, ожидание на файловом дескрипторе применяется для того, чтобы узнать о завершении операции ввода-вывода. Это, кажется, в синем Рихтере написано. По идее, если приложение закрыло HANDLE файла, то он утрачивает актуальность. Отсюда можно предположить, что WaitForSingleObject в этот момент должен вернуть ошибку, а событие WAIT_OBJECT_0 приходит по завершении операции ввода-вывода. Кстати, приложение может и не закрывать файл до какого-то определённого момента, например до закрытия окна. Неплохо также будет поисследовать этот момент с помощью разного рода API spy, например APIS32, чтобы быть совершенно уверенным в том, что файловый дескриптор закрывается и о моменте этого самого закрытия.