var ShExecInfo:SHELLEXECUTEINFO;
    ExitCodeLong:Dword;
begin
    ShExecInfo.cbSize:= sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask:= SEE_MASK_NOCLOSEPROCESS;
    //ShExecInfo.Wnd:= HWND;
    ShExecInfo.lpVerb:= nil;
    ShExecInfo.lpFile:=PwideChar(exename);
    ShExecInfo.lpParameters:=Pwidechar(FileName);
    ShExecInfo.lpDirectory:= nil;
    ShExecInfo.nShow:=SW_SHOW;
    ShExecInfo.hInstApp :=0;
    ShellExecuteEx(@ShExecInfo);
    GetExitCodeProcess(ShExecInfo.hProcess, ExitCodeLong);
    while ExitCodeLong = STATUS_PENDING do
    begin
        GetExitCodeProcess(ShExecInfo.hProcess, ExitCodeLong);
        Application.ProcessMessages;
        sleep(100);
    end;
    CloseHandle(ShExecInfo.hProcess);
   showmessage('close');由于word打开多个文档只有一个winword.exe进程,如果当前没有word打开,第一个打开的文档是可以判断的,但第二个就判断不了了

解决方案 »

  1.   

    用Findwindow也有问题,如果有相同文件名的word打开关闭会影响判断
      

  2.   

    楼上办法不错,但靠这个来循环的话是不是太耗资源了,现在没办法,还是先用查找窗体的办法先用着,不过这样又有问题了,PowerPoint这个如果打开多个窗体,只能查找到当前活动的那个窗体,要晕死了
      

  3.   

    WORD打开文件时,会在当前文件夹中产生一个临时文件,用这个应该也可以判断是否打开与关闭该文档。
      

  4.   

    判断是否打开可设置一个全局变量,保存打开的文件名,每次打开文件前都看看是否有这个文件名;或者直接操作“WordApplication”以独占方式打开文件。
    判断关闭好像没什么好的办法,毕竟关闭是word自己的事情了,跟你的程序无关,看看能不能截到什么消息之类的。