这是场景:
我正在使用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文件。此伪代码说明了我现在正在做什么:
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版本。
使用机会锁似乎很有前途,我将在下周进行测试。
最后也可以使用重新启动管理器。
答案 0 :(得分:0)
正如其他人所说,无法知道应用程序何时打开文件,但是如果它专门用于Excel,则可以使用COM自动化。
Here是python示例,here是通用文档。在C ++中,您必须使用CoCreateInstance来获取IDispatch。