ShellExecuteEx,然后等待文件实际打开

时间:2018-12-21 17:25:45

标签: winapi

这是场景:

我正在使用ShellExecuteEx来打开给定的.xlsx文件。可以正常运行,启动Excel并在Excel中打开.xlsx文件。

现在ShellExecuteEx几乎立即返回,甚至在Excel完全启动并打开.xlsx文件之前。到目前为止一切顺利。

有没有办法等到Excel实际打开.xlsx文件?像BOOL FileIsOpenExclusively(LPCTSTR filename)函数这样返回TRUE的文件是专门打开的吗?

然后我可以做这样的事情(最小化,天真和无错误检查)伪代码:

ShellExecuteEx(... stuff for opening myfile.xlsx ...);

while (FileIsOpenExclusively("myfile.xlsx"))
{
   Sleep(500);
}

// now "myfile.xlsx" is opened execusively

已编辑

实际更为复杂的情况是这样的:

  • 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版本。

使用机会锁似乎很有前途,我将在下周进行测试。

最后也可以使用重新启动管理器。

1 个答案:

答案 0 :(得分:0)

正如其他人所说,无法知道应用程序何时打开文件,但是如果它专门用于Excel,则可以使用COM自动化。

Here是python示例,here是通用文档。在C ++中,您必须使用CoCreateInstance来获取IDispatch