补充一下,我用createprocess来打开应用程序的,processinfo.hProcess返回的是不是就是应用程序的hwnd?

解决方案 »

  1.   

    用FindWindow()查询该程序是否仪运行,WinExec()或CreateProcess()打开就可
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    st:TStartUpInfo;
    pp:TProcessInformation;
    ppp:Thandle;
    begin
    FillChar(st,sizeof(st),#0);
    with st do
    begin
      cb:=sizeof(st);
      dwFlags:=StartF_UsesTDHandles or STARTF_USESHOWWINDOW;
      lptitle:=nil;
      wShowWindow:=SW_Show;
    end;
    CreateProcess(PChar('c:\notepad.exe'),
          nil,nil,nil,true,DETACHED_PROCESS,nil,nil,st,pp);
    //关闭进程
    {  ppp:=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pp.dwProcessId );
      TerminateProcess(ppp,0);}
    end;
      

  3.   

    to: ilang(中雨)我调用的方法和你类似,可是问题在于如果多次点击的话就会打开多个,而我想只打开一个,如果已打开的话激活就可以了
      

  4.   

    还有一个问题,我在使用ShellExecute时编译出错,说是没有声明,为什么?
      

  5.   

    使用ShellExecute,必须加上ShellAPI单元。
      

  6.   

    最好还是用CreateProcess,
    因为CreateProcess提供了更多的对进程控制unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
    st:TStartUpInfo;
    pp:TProcessInformation;
    ppp:Thandle;
    begin
    FillChar(st,sizeof(st),#0);
    with st do
    begin
      cb:=sizeof(st);
      dwFlags:=StartF_UsesTDHandles or STARTF_USESHOWWINDOW;
      lptitle:=nil;
      wShowWindow:=SW_Show;
    end;
    CreateProcess(PChar('c:\program files\microsoft office\office\winword.exe'),
          nil,nil,nil,true,DETACHED_PROCESS,nil,nil,st,pp);
    //关闭进程
    {  ppp:=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pp.dwProcessId );
      TerminateProcess(ppp,0);}
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    //setwindowlong(handle , GWL_STYLE, getwindowlong(handle, GWL_STYLE) and (not WS_CAPTION or WS_BORDER) or WS_Popup);
    end;end. 
     
    Liu JZX (2000-1-14 17:58:00)  
    创建进程
    CreateProcess(PChar('c:\program files\microsoft office\office\winword.exe'),
          nil,nil,nil,true,DETACHED_PROCESS,nil,nil,st,pp);关闭进程
      ppp:=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pp.dwProcessId );
      TerminateProcess(ppp,0);}
     
      

  7.   

    用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由
    Windows系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,
    并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom函数
    向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已
    经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局
    原子。示例如下: Uses Windows 
    const iAtom=‘SingleApp’; 
    begin 
    if GlobalFindAtom(iAtom)=0 then 
    begin 
      GlobalAddAtom(iAtom); 
                      ......      //需要单一实例的部分
    GlobalDeleteAtom(GlobalFindAtom(iAtom)); 
    end 
    else 
    MessageBox(0,‘You can not run a second copy of this App’,’,mb_OK); 
    //写你可以写的代码,比如激活窗口
    end.
      

  8.   

    我先使用GlobalFindAtom(iAtom)第一次可以打开应用程序,然而把所调用的程序关闭以后,怎么GlobalFindAtom(iAtom)不会清0啊,用了GlobalDeleteAtom(GlobalFindAtom(iAtom)); 也一样
      

  9.   

    uses shellapi;procedure TForm1.Button1Click(Sender: TObject);
    var hnd:thandle;
    begin
      hnd:=findwindow(nil,'未定标题 - 记事本');
      if hnd<>0 then
       begin
         showwindow(hnd,sw_normal);
         bringwindowtotop(hnd);
       end
      else
      shellexecute(handle,'open','notepad',nil,nil,sw_normal);
    end;
      

  10.   

    winexec可以,看
    win32api帮助
      

  11.   

    再请教一下,
    hnd:=findwindow(nil,'未定标题 - 记事本');当中的'未定标题 - 记事本'可能用函数来得到吗?
      

  12.   

    那个是你程序的标题,要得到的话可以用 getwindowtext 函数
      

  13.   

    接着再问,如果用createprocess打开了一个外部程序,那么怎么得到这个外部程序的主窗体句柄呢?
      

  14.   

    用这个吧
    hwd:=findwindow('Notepad',nil);通过类名查找
      

  15.   

    谢谢shuixin13(犬犬(心帆)),我马上试看
    再继续请教下(不好意思,我有点上瘾了),如果得到刚执行完createprocess的当前焦点窗体的句柄是不是也一样的,要想得到当前焦点窗体的句柄又该怎么做呢?
      

  16.   

    或者哪位高人愿意解释一下用createprocess打开一个外部程序会产生哪些比较常用的信息呢
      

  17.   

    hwd:=findwindow('Notepad',nil);
    这种方法很不科学。
    要么使用原子,要么使用互斥量。