Это сценарий:
Я использую ShellExecuteEx
, чтобы открыть данный файл .xlsx.Это работает нормально, Excel запускается и файл .xlsx открывается в Excel.
Теперь ShellExecuteEx
возвращается более или менее мгновенно, прежде чем даже Excel полностью запустился и открыл файл .xlsx.Пока все хорошо.
Есть ли способ подождать, пока файл .xlsx действительно будет открыт в Excel?Что-то вроде BOOL FileIsOpenExclusively(LPCTSTR filename)
функции, которая возвращает TRUE, если файл открыт исключительно?
Тогда я мог бы сделать что-то вроде этого (минималистичный, наивный и без проверки ошибок) псевдокод:
ShellExecuteEx(... stuff for opening myfile.xlsx ...);
while (FileIsOpenExclusively("myfile.xlsx"))
{
Sleep(500);
}
// now "myfile.xlsx" is opened execusively
EDITED
Фактически, немного более сложный сценарий таков:
ShellExecuteEx
запускает Excel, открывает указанный файл .xlsx. - затемМне нужно как-то узнать, когда файл .xlsx закрыт, либо потому, что файл закрыт пользователем Excel, либо потому, что пользователь полностью закрывает Excel.
То, что я сейчас делаю, иллюстрируется этимпсевдокод:
ShellExecuteEx(... stuff for opening myfile.xlsx ...);
Sleep(5000); // wait that Excel has hopefully has opened the file
do
{
Sleep(500);
Open("myfile.xlsx");
} while (opening file is unsuccessful)
// file could be opened which means that Excel has closed it
Close("myfile.xlsx");
Проблема заключается в Sleep(5000);
: если Excel не смог открыть файл в течение 5,5 секунд, приведенный ниже тест не пройден, поскольку он будет считать, что Excel закрыл файл еще до его открытия.,Поэтому мне нужно знать, когда Excel открывает файл, а не ждать определенное количество времени.
Может быть, есть другой подход.В некоторых комментариях предлагалось использовать WaitForInputIdle
, что звучит многообещающе, но это может не сработать, если уже есть заранее открытый экземпляр Excel (для тестирования).
Другой комментарий предложил перечислить окна верхнего уровня ипроверить изменения заголовка окна, но я не уверен, что это работает с современными версиями Excel (чтобы проверить), и если это работает, он может перестать работать со следующей основной версией Excel.
Использование oportunisticблокировка звучит очень многообещающе, я протестирую на следующей неделе.
И, наконец, использование диспетчера перезапуска также может быть полезным.