我使用一个程序关闭一个执行中的程序,用的命令是SendMessage(HMy, WM_CLOSE, 0, 0); 如果被关闭的程序不是处于模式状态就可以成功关闭,但是如果是处于模式状态,就会失败

解决方案 »

  1.   

    For Windows 9x/ME/2000/XP } 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; 
      

  2.   

    or
    { 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;
      

  3.   

    原理:
    1 取得handle 
    2 用SendMessage()来关闭
      

  4.   

    找到进程handle用terminateprocess API关闭进程
      

  5.   

    postmessage(handle,WM_Quit,0,0);
    or
    sendmessage(handle,WM_Close,0,0)
      

  6.   

    谢谢aiirii(ari-爱的眼睛)  的代码。我先收藏先.