某个软件我开了很多个,偶尔会自动关闭一两个已知进程ID,如果判断该窗口是不是还存在?应该用哪个API?
解决方案 »
- TOleContainer嵌入word文档后,另外在windows"开始菜单"中打开一个word文档后,TOleContainer嵌入的word文档中的右键菜单和工具栏都不能
- 关于tidtelnet的问题 附源码 请帮我看一下
- 像foxmail的窗口是怎样实现的?????
- 网络传输图像的问题
- 唉,郁闷呀,平时不注重算法的后果
- XML加密规范!
- 为什么我这个SQL语句在查询分析器上没有数据得出select personnerid,makeid,workid,pricefrom dbo.countmakeid where gzdate BETWEEN 200
- 深圳用Delphi的少的不得了
- 请问:如何将query查询结果导出到EXECLLI里面?
- 声明一个对象而没有实例化(Creat),这个对象在内存中存在吗?以什么形式存在(只是一个指针地址吗)
- Oracle insert into select的问题
- 多线程应用问题
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;
并不是每个进程都有窗口。
可以用EnumThreadWindows枚举
那么OpenProcess即可知道
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;