我在程序中使用了acrobat的pdf控件,这样每次运行的时候都会在“任务管理器”的进程列表里面发现一个叫AcroRd32.exe的进程,程序退出的时候这个进程应该也终止,但是我发现有时候这个进程退出的特别慢,或者不能正常退出,如果在正常退出之前我又运行我编的程序就不能正常的打开pdf文件了,所以我想在程序退出前手动杀死这个AcroRd21.exe线程。
问题如下:
1、如何找到这个线程的句柄,因为是嵌在我的程序里面的,所以在应用程序列表里面是没有acrobat.exe项的,只有线程列表里面有AcroRd32.exe项,如果用findwindow(nil,参数),这个参数应该是窗口的名称,我没法知道阿,我能不能就根据这个AcroRd32.exe线程名称或取句柄呢。
2、获取到这个句柄后如何安全的杀死我对线程什么的不是很清楚,请老大们给出源程序。另外,我看到很多人说可以用什么线程快照阿之类的东东,不明白是干什么的,能不能解释一下那个api的具体用法,最好能从理论开始了,呵呵,多谢,

解决方案 »

  1.   

    uses 
      Tlhelp32; function KillTask(ExeFileName: string): Integer; 
    const 
      PROCESS_TERMINATE = $0001; 
    var 
      ContinueLoop: BOOL; 
      FSnapshotHandle: THandle; 
      FProcessEntry32: TProcessEntry32; 
    begin 
      Result := 0; 
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);   while Integer(ContinueLoop) <> 0 do 
      begin 
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
          UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = 
          UpperCase(ExeFileName))) then 
          Result := Integer(TerminateProcess( 
                            OpenProcess(PROCESS_TERMINATE, 
                                        BOOL(0), 
                                        FProcessEntry32.th32ProcessID), 
                                        0)); 
         ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
      end; 
      CloseHandle(FSnapshotHandle); 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      KillTask('notepad.exe'); 
    end; { For Windows NT/2000/XP } procedure KillProcess(hWindowHandle: HWND); 
    var 
      hprocessID: INTEGER; 
      processHandle: THandle; 
      DWResult: DWORD; 
    begin 
      SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0, 
        SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);   if isWindow(hWindowHandle) then 
      begin 
        // PostMessage(hWindowHandle, WM_QUIT, 0, 0);     { Get the process identifier for the window} 
        GetWindowThreadProcessID(hWindowHandle, @hprocessID); 
        if hprocessID <> 0 then 
        begin 
          { Get the process handle } 
          processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, 
            False, hprocessID); 
          if processHandle <> 0 then 
          begin 
            { Terminate the process } 
            TerminateProcess(processHandle, 0); 
            CloseHandle(ProcessHandle); 
          end; 
        end; 
      end; 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    begin 
      KillProcess(FindWindow('notepad',nil)); 
    end;
      

  2.   

    自己查 一下 api 对你也有好处,不要处外想靠人
      

  3.   

    >>老大给的程序能不能给点注释,我是菜鸟阿,这么看又没有什么帮助好累
      

  4.   

    我給你兩種實現方式,
     一種是根據程序名
       KillTask('notepad.exe');  一種是根據窗口名
       KillProcess(FindWindow('notepad',nil)); 用的都是windows 的Api