比如我调用shellexecute(....WIN下的计算器,...)   
但我在关闭程序时,计算器还仍旧存在,这可不好。怎么关掉它,有没有简单点的?
我指定是计算器了。最好别用KILL进程什么的

解决方案 »

  1.   

    const
    PROCESS_TERMINATE = $0001;
    var
      ProcessHandle : THandle;
      ProcessID: Integer;
      TheWindow : HWND;
    begin
      TheWindow := FindWindow(nil, '计算器');
      GetWindowThreadProcessID(TheWindow, @ProcessID);
      ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
      TerminateProcess(ProcessHandle,4);
    end;
      

  2.   

    妈啊,果然用线程啊。呵呵。
    TerminateProcess(ProcessHandle,4);的方法不是很安全吧。:)
    TheWindow := FindWindow(nil, '计算器');是查找窗口标题栏叫计算器的,还是程序名,还是什么?
      

  3.   

    // 这个安全,不过不是对所有程序都有效
    var
      TheWindow : HWND;
    begin
      TheWindow := FindWindow(nil, '计算器');
      PostMessage(TheWindow,WM_CLOSE,0,0);
    end;
      

  4.   

    // 最好这样
    var
      TheWindow : HWND;
    begin
      TheWindow := FindWindow(nil, '计算器');
      if TheWindow <> 0 then
        PostMessage(TheWindow,WM_CLOSE,0,0);
    end;
      

  5.   

    procedure EndProcess(AExeName: string);
    var
      lppe: TProcessEntry32;
      found : boolean;
      Hand : THandle;
    begin
      Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
      found := Process32First(Hand,lppe);
      while found do
      begin
        if UpperCase(StrPas(lppe.szExeFile)) = UpperCase(AExeName) then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE, true,
            lppe.th32ProcessID), 0);
          Exit;
        end
        else
          found := Process32Next(Hand,lppe);
      end;
    end;
      

  6.   

    最好找到窗口的类名,然后KILL。
      

  7.   

    galeboy(狂风) 说的好!谢谢!!!还有消息呢:)
    再麻烦你一下,我想KILL掉不知名的进程怎么办呢?如果是用户任意打开的呢
      

  8.   

    在线程中使用外部程序,比如用CreateProcess(),记录下该程序的进程号,用WaitSingleObject()等待该程序停止后再退出线程,或者由主程序控制来中止外部程序。