如何关闭一个正在运行的程序呢?
还有如何判断?

解决方案 »

  1.   

    首先通过findwindow找到窗体句柄,然后发送WM_Close消息var
      h:HWND;
    begin
      h := FindWindow(nil,'这里写窗体标题');
      if h <> 0 then
        SendMessage(h,WM_CLOSE,0,0);
    end;
      

  2.   

    循环所有进程,取得相同名的进程,得到进程句柄,关闭
    killtask('cmd.exe');//结束进程
    function TForm1.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;
    //提权
    function TForm1.EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable:
     Boolean): Boolean;
    var
     TP: TOKEN_PRIVILEGES;
     Dummy: Cardinal;
    begin
     TP.PrivilegeCount := 1;
     LookupPrivilegevalue(nil, pchar(PrivName), TP.Privileges[0].Luid);
     if bEnable then
       TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
     else
       TP.Privileges[0].Attributes := 0;
     AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
     Result := GetLastError = ERROR_SUCCESS;
    end;转自 http://blog.csdn.net/mailreboot/archive/2007/12/18/1946866.aspx
      

  3.   

    unit U_KillPrg;interfaceuses
      Windows,SysUtils,Tlhelp32;function KillTask(ExeFileName: string): Integer; //关闭进程
    function EnableDebugPrivilege: Boolean; //提升权限  
    function FindProcessId(ExeFileName: string):THandle; //查找进程(找到了不就是正在运行了?)implementationfunction FindProcessId(ExeFileName: string):THandle;
    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(FProcessEntry32.szExeFile)=UpperCase(ExeFileName) then
      begin
      result:=FProcessEntry32.th32ProcessID;
      break;
      end;
      ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
      end;
      CloseHandle (FSnapshotHandle);
    end;function KillTask(ExeFileName: string): Integer;
    const
      PROCESS_TERMINATE = $0001;
    var
      ContinueLoop: boolean;
      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;//对于服务程序会提示“拒绝访问”,其实只要程序拥有DEBUG权限即可
    function EnableDebugPrivilege: Boolean;
      function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
      var
      TP: TOKEN_PRIVILEGES;
      Dummy: Cardinal;
      begin
      TP.PrivilegeCount := 1;
      LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
      if bEnable then
      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else TP.Privileges[0].Attributes := 0;
      AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
      Result := GetLastError = ERROR_SUCCESS;
      end;
    var
      hToken: Cardinal;
    begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
      result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);
      CloseHandle(hToken);
    end;end.