Windows上で、起動しているアプリケーションの
ハンドルかプロセスIDを調べるには
どうすればよろしいのでしょうか??
例えば,メモ帳のハンドルとIDは以下の様に取得できます.
procedure TForm1.Button1Click(Sender: TObject);
var
H : HWND;
ID : LongInt;
begin
H:=FindWindow('Notepad',0);
if H<>0 then begin
ID:=GetWindowLong(H,GWL_ID);
Memo1.Lines.Add('HANDLE '+IntToStr(H));
Memo1.Lines.Add('ID '+IntToStr(ID));
end;
end;
> ハンドルかプロセスIDを調べるには
ウィンドウハンドルからプロセスIDを取得するには
var
dwProcessId:DWORD;
GetWindowThreadProcessId(hWindow,@dwProcessId);
とします。
失礼しました.プロセスIDでしたね.
FindWindowの場合、起動しているのがなんなのか
が分からないと、使えませんよね。
例えば、Windows上で起動しているもののうち、
NOTE*.EXEかどうかとかを知る方法ってありますか??
起動プロセスIDやパスを得る方法です。
プロセスIDからハンドルを求めるのはわかりません。
Windowを列挙してプロセスIDとの一致を求めたらいいのかな?
type
TProcessItem = class(TObject)
ID: Cardinal;
Name: String;
Path: String;
end;
function GetWindowsDirectory: string;
var Buffer:array [0..MAX_PATH-1] of Char;
begin
Windows.GetWindowsDirectory(Buffer,MAX_PATH);
Result:=StrPas(Buffer);
end;
function TranslateFilename(SourceFileName: String): String;
begin
Result := SourceFileName;
Result := StringReplace(Result, '\SystemRoot', GetWindowsDirectory, []);
Result := StringReplace(Result, '\??\', '', []);
end;
procedure GetProcExeNameList(Dest: TObjectList);
var
hProcessSnapshot: THandle;
ProcessEntry: TProcessEntry32;
PID: Cardinal;
ProcessStatus: Boolean;
hProcess: THandle;
ModuleFileName: array[0..MAX_PATH] of Char;
Item: TProcessItem;
begin
Dest.Clear;
hProcessSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnapshot <> $FFFFFFFF then
begin
try
ProcessStatus := Process32First(hProcessSnapshot, ProcessEntry);
while ProcessStatus do
begin
PID := ProcessEntry.th32ProcessID;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if hProcess <> 0 then
begin
Item := TProcessItem.Create;
Item.ID := PID;
Item.Name := ProcessEntry.szExeFile;
try
if GetModuleFileNameEx(hProcess, 0, ModuleFileName, Sizeof(ModuleFileName)) = 0 then
begin
Item.Path := '[System]';
end else
begin
Item.Path := TranslateFilename(ModuleFileName);
end;
Dest.Add(Item);
finally
CloseHandle(hProcess);
end;
end;
ProcessStatus := Process32Next(hProcessSnapshot, ProcessEntry)
end
finally
CloseHandle(hProcessSnapshot);
end;
end else
raise Exception.Create(SysErrorMessage(GetLastError));
end;
ツイート | ![]() |