某个软件我开了很多个,偶尔会自动关闭一两个已知进程ID,如果判断该窗口是不是还存在?应该用哪个API? 

解决方案 »

  1.   

    SendMessage(hCurrentWindow,WM_CLOSE,0,0);
      

  2.   

    通过进程ID查询进程是否还在运行.
    function IsProcessAlive(ProcessID: DWORD): Boolean;
    const
      { Vista 及以后版本的系统需要该参数 }
      PROCESS_QUERY_LIMITED_INFORMATION = $1000;
    var
      hProcess: THandle;
      dwExitCode: DWORD;
    begin
      Result := False;
      { 获取进程句柄 }
      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION, False, ProcessID);
      if hProcess = 0 then Exit;
      try
        { 查询退出代码 }
        if not GetExitCodeProcess(hProcess, dwExitCode) then Exit;
        Result := (dwExitCode = STILL_ACTIVE);
      finally
        CloseHandle(hProcess);
      end;
    end;
      

  3.   

    到底是要判断进程是否存在还是判断窗口是否存在?
    并不是每个进程都有窗口。
    可以用EnumThreadWindows枚举
      

  4.   

    说了是进程ID
    那么OpenProcess即可知道
      

  5.   

    恩,用OpenProcess即可,看函数返回成功与否,成功即存在,失败即不存在
      

  6.   

    function CheckIfRunning():boolean;
    var
     ProcessID:array[0 .. 255] of Cardinal;
     BytesRead:DWORD;
     N,i:integer;
     hProcess,hModule:THandle;
     ProcessName:array[0 .. 255] of char;
     S:string;
    begin
     Result:=false;
     if EnumProcesses(PDWORD(@ProcessID[0]),SizeOf(ProcessID),BytesRead) then 
     begin
       N:=BytesRead div SizeOf(Cardinal);
       for i:=0 to N-1 do begin
         hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or PROCESS_TERMINATE,false,ProcessID[i]);
         if EnumProcessModules(hProcess,PDWORD(@hModule),SizeOf(hModule),BytesRead) then begin
           GetModuleBaseName(hProcess,hModule,@ProcessName[0],SizeOf(ProcessName));
           S:=PChar(@ProcessName[0]);
           if UpperCase(S)='lala.exe' then begin
             if MessageDlg('close lala.exe?',mtInformation,[mbYes,mbNo],0)=idYes then TerminateProcess(hProcess,0);
           end;
         end;
         CloseHandle(hProcess);
       end;
       Result:=true;
     end;
    end;