Winapi ShellExecuteEx并等待文件实际打开

Winapi ShellExecuteEx并等待文件实际打开,winapi,Winapi,这是一个场景: 我正在使用ShellExecuteEx打开给定的.xlsx文件。这工作正常,Excel启动,并且.xlsx文件在Excel中打开 现在,甚至在Excel完全启动并打开.xlsx文件之前,ShellExecuteEx都会或多或少地立即返回。到目前为止还不错 有没有办法等到.xlsx文件已被Excel实际打开?类似于BOOL FileIsOpenExclusively(LPCTSTR filename)函数的返回值为TRUE的函数是否以独占方式打开文件 然后我可以做一些类似的事情(简

这是一个场景:

我正在使用
ShellExecuteEx
打开给定的.xlsx文件。这工作正常,Excel启动,并且.xlsx文件在Excel中打开

现在,甚至在Excel完全启动并打开.xlsx文件之前,
ShellExecuteEx
都会或多或少地立即返回。到目前为止还不错

有没有办法等到.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
已编辑

实际稍微复杂一点的情况是:

  • 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");
问题是
睡眠(5000):如果Excel无法在5.5秒内打开文件,下面的测试将失败,因为它会认为Excel在打开文件之前就已经关闭了文件。因此,我需要知道Excel何时打开文件,而不是等待确定的时间

也许还有另一种方法。一些评论建议使用
WaitForInputIdle
,这听起来很有希望,但如果事先已经有一个打开的Excel实例(待测试),这可能不起作用

另一条评论建议枚举顶级窗口并检查窗口标题的更改,但我不确定这是否适用于现代Excel版本(待检查),如果有效,可能会停止使用下一个主要Excel版本

使用机会锁听起来很有希望,下周我将对此进行测试


最后,使用重新启动管理器也可能是一个潜在客户。

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


是一个python示例,是通用文档。在C++中,你必须使用一个.< /p>可能的CuraPATH和WaitForInputIdle?为什么要等待Excel打开文件?无意冒犯,但这闻起来像是XY问题。无论如何,您可以通过Excel进程使用。另一个允许您在进程想要打开文件时接收通知的API是在文件上放置一个。当另一个进程想要打开同一个文件时,锁将被打破,您可以收到一个关于该文件的通知。然而,缺点是,例如,一个打开的对话框可能会在文件实际打开之前打破锁定。但至少这是一个值得研究的问题。如果Excel根本就不打开文件呢?没有与启动的应用程序通信的标准;你得做些特别的事情。对于Excel,您可以尝试使用。遗憾的是,COM不是一个选项,可能会使用其他程序和文件格式。在这种情况下,您可以创建一个过滤器驱动程序,记录何时读取文档并预测可读性。当文件打开时以及通过
FSCTL\u REQUEST\u OPLOCK