ShellExecuteEx и ожидание, пока файл не будет фактически открыт - PullRequest
0 голосов
/ 21 декабря 2018

Это сценарий:

Я использую 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блокировка звучит очень многообещающе, я протестирую на следующей неделе.

И, наконец, использование диспетчера перезапуска также может быть полезным.

1 Ответ

0 голосов
/ 22 декабря 2018

Как уже говорили другие, нет способа узнать, когда приложение открывает файл, но если это специально для Excel, вы можете использовать автоматизацию COM.

Здесь является примером Python, здесь - общая документация.В C ++ вы должны использовать CoCreateInstance , чтобы получить IDispatch .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...