function TForm1.GetProcessId(processname : string): integer;
var
Ret :BOOL;
s: string;
sss : integer;
FProcessEntry32 : TProcessEntry32;
begin
    sss := 0;
   FN := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
   FProcessEntry32.dwSize := sizeof(FProcessEntry32);
   Ret := Process32First(FN,FProcessEntry32);
   while Ret do begin
     s := ExtractFileName(FProcessEntry32.szExeFile);
     if (s = processname) then begin
        sss :=  FProcessEntry32.th32ProcessID;
        break;
     end
     else begin
         Ret := Process32Next(FN,FProcessEntry32);
     end;
    end;
    result := sss;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
 pid : THandle;
begin
     pid := GetProcessId(SNmae);
     SendMessage(pid,WM_CLOSE,0,0);
end;上面的程序 是我在自己的程序中关闭一个 被自己启动的进程 问题是  SendMessage(pid,WM_CLOSE,0,0); 根本没起作用 .其他的关闭 比如 CloseHnad TerminaeProcee  ExitProcess 都不起作用 请高手指教

解决方案 »

  1.   

    是不是应该s 和 processname 转一下大小写。都转为大写或都转为小写再比较是不是相等。
      

  2.   

    if (uppercase(s)=uppercase(processname)) then
      

  3.   

    注意是 thread  TerminateProcess
      

  4.   

    SendMessage(pid,WM_CLOSE,0,0); ??
    向进程发送消息能得到什么
    PostThreadMessage试试
      

  5.   

    CloseHandle 肯定是没用的
    TerminateProcess 第一个参数是进程句柄(OpenProcess得到),同时还要有操作权限
    ExitProcess 是退出本进程
      

  6.   

    谢谢大家参与 我发现 pid := GetProcessId(SNmae); 后 还得调用  OpenProcess函数执行一次 才可以正常关闭 就是这样  
           pid := GetProcessId(SNmae);
           m_hOpenProcess := OpenProcess(PROCESS_TERMINATE,true,pid);  
           TerminateProcess(m_hOpenProcess,   0);