我设计一个程序,思想是调用外部某个程序,比如Word(用ExecuteFile实现)
当调用后隐藏自身,在被调用的程序Word关闭后,再恢复自己试着用repeat语句实现不断查询handle,可是CPU占用率太高请问我该如何实现呢?
第一:如何让程序等待,就是暂停,直到word关闭时给程序一个信息,什么语句可以实现程序的不占用CPU的暂停;
第二:如何获知word关闭的消息,我对于Windows的Onclosequery事件不是很清楚,麻烦说详细一点。(最好是能获知特定窗口的关闭事件,不一定是Word)谢谢了,我是初学者。麻烦大虾们帮帮忙!

解决方案 »

  1.   

    没做过,不过提个想法。用WaitForSingObject()行不行?当窗口关闭时内核事件会发送内核消息。我觉得可以。
      

  2.   

    这个问题我也考虑过,并且已经找到了一个切实可行的办法
    就是利用createObject和WaitForSingObject来实现进程的创建和等待结束
    该进程结束的时候会自动发出一个类似中断的方式来实现但是这种方式有一种缺点,我必须通过注册表来获知Office的安装目录,并且获知Office是否安装。而且最关键的是,好像只能用CreateObject来创建一个可执行程序的进程,我正在试验打开指定文档能不能实现,比如指定的ABC.DOC,好像有点困难。下面贴出CreateObject和Wait的具体指令,绝对可行的,希望大家一起探讨。procedure TFormMain.BitBtnNewClick(Sender: TObject);
    var
      StartUpInfo: TStartUpInfo;        // holds startup information
      ProcessInfo: TProcessInformation; // holds process information
      CurDir: string;                   // holds the current directorybegin
      FormMain.Hide();
      //*initialize the startup info structure*//
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      with StartupInfo do
      begin
        cb := SizeOf(TStartupInfo);
        dwFlags := STARTF_USESHOWWINDOW;
        wShowWindow := SW_SHOWNORMAL;
      end;    //启动程序的命令行,可带参数
      CurDir := 'c:\windows\notepad.exe';
      if CreateProcess(nil,PChar(CurDir), nil, nil, False,
          NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo)=FALSE then
      begin
        MessageDlg('Failed to open !!!',mtError,[mbok],0);
        FormMain.Show();
        exit;
      end;  //等待进程结束
      if WaitForSingleObject(ProcessInfo.hProcess,INFINITE)=WAIT_OBJECT_0 then
      begin
        FormMain.Show();
      end else
      begin
        MessageDlg('Error!',mtError,[mbok],0);
        FormMain.Show();
        exit;
      end;
    end;上述语句在Delphi3+win2000中通过,不过我还是想了解如何在Delphi中捕获其他程序窗口关闭事件,以及知道是何程序关闭(不要运用不断查询Handle的方式,这样CPU占用率太高)各位大虾一起来帮帮忙吧!
      

  3.   

    没试过!楼主:查询Handle的方式你可以用EnumWindows API函数,那样CPU占用率应该可以降下。
      

  4.   

    fancier(OP&&(C/C++)) 呵呵,谢谢你的提议不过我在所有数据类型中最讨厌的就是枚举,所以一看到Enum就不想看下去了。回头还是试一下。不过上面的程序绝对可行,已经通过了,现在的任务是争取做成OLE,嵌入到主窗口中去。这个好像有点难了。有好多问题不知道如何解决,回头慢慢再问吧。不过看过一篇资料,好像用资源文件RES可以封装任何程序,也许这是Delphi窗口集成Word的一个取巧办法。
      

  5.   

    用hook截获其他窗口关闭时的WM_CLOSE消息
      

  6.   

    同意楼上:如果是那样的话,就用Hook了,它能实现你的要求。不过Hook不太懂。