请问 如何通过遍历所有进程,找到某一个进程(比如QQ.exe)
如果找到QQ.exe,再 获取 这个进程 所对应的前台窗口的句柄 请问各位,上面这2步怎么实现啊?

解决方案 »

  1.   

    看看这个delphi查找系统进程并终止进程
    function TFrmImportExcel.FindProcess(AFileName: string): boolean;
    var
       hSnapshot: THandle;//用于获得进程列表
       lppe: TProcessEntry32;//用于查找进程
       Found: Boolean;//用于判断进程遍历是否完成
       KillHandle: THandle;//用于杀死进程
    begin
       Result :=False;
       hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表
       lppe.dwSize := SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小
       Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中
       while Found do
       begin
         if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then
         begin
           {if MsShow('发现打开Excel,是否将其关闭?',2)=6 then
           begin
           //由于我的操作系统是xp,所以在调用TerminateProcess API之前
           //我必须先获得关闭进程的权限,如果操作系统是NT以下可以直接中止进程
           KillHandle := OpenProcess(PROCESS_TERMINATE, False, lppe.th32ProcessID);
           TerminateProcess(KillHandle, 0);//强制关闭进程
           CloseHandle(KillHandle);
           end;}
           Result :=True;
         end;
         Found := Process32Next(hSnapshot, lppe);//将进程列表的下一个进程信息读入lppe记录中
       end;
    end;procedure TFrmImportExcel.EndProcess(AFileName: string);
    const
       PROCESS_TERMINATE = $0001;
    var
       ContinueLoop: BOOL;
       FSnapShotHandle: THandle;
       FProcessEntry32: TProcessEntry32;
    begin
       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(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then
         TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
         ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
       end;
    end;
    //调用
       if FindProcess('EXCEL.EXE') then
       begin
         if MsShow('检测到打开了Excel,是否让其关闭?',2)<>6 then Exit;
         EndProcess('EXCEL.EXE');
       end;
    //
    /* 
      

  2.   

    好复杂.给你个简单的看下:
    function TDataBaseCheckF.FindProcess(aFileName: String): boolean;      // zxf add 2007-4-3 判断本机是否在运行后台程序
    var hSnapshot:THandle;         //获取进程列表
        lppe:TProcessEntry32;      //用于查找进程
        Found:boolean;             //用于判断进程是否历遍完成
    begin
       Result:=false;
       hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //获取系统进程列表
       lppe.dwSize:=SizeOf(TProcessEntry32); //在调用Process32First API之前,需要初始化lppe记录的大小
       Found:=Process32First(hSnapshot,lppe); //将进程列表的第一个进程信息读入lppe记录中
       while Found do
       begin
         if (UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(aFileName)) or (UpperCase(lppe.szExeFile)=UpperCase(aFileName)) then
         begin
           Result:=true;
           break;
         end;
         Found := Process32Next(hSnapshot, lppe); //将进程列表的下一个进程信息读入lppe记录中
       end;
    end;调用:if FindProcess('EmealJXC.exe') then //表示已经找到该进程
      

  3.   

    uses Tlhelp32 ;即可
    ---
    ---
      

  4.   

    属于system 的关不掉,只有属于用户的才可以,请问你什么办法解决呢