起動しているアプリケーションを調べるには


ほとちゃん  2004-10-02 03:37:48  No: 11243

Windows上で、起動しているアプリケーションの
ハンドルかプロセスIDを調べるには
どうすればよろしいのでしょうか??


Mr.XRAY  URL  2004-10-02 07:07:27  No: 11244

例えば,メモ帳のハンドルと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;


jok  2004-10-02 09:27:47  No: 11245

> ハンドルかプロセスIDを調べるには

ウィンドウハンドルからプロセスIDを取得するには

var
  dwProcessId:DWORD;

GetWindowThreadProcessId(hWindow,@dwProcessId);

とします。


Mr.XRAY  URL  2004-10-02 11:41:13  No: 11246

失礼しました.プロセスIDでしたね.


ほとちゃん  2004-10-02 22:31:45  No: 11247

FindWindowの場合、起動しているのがなんなのか
が分からないと、使えませんよね。
例えば、Windows上で起動しているもののうち、
NOTE*.EXEかどうかとかを知る方法ってありますか??


Fusa  2004-10-03 06:42:41  No: 11248

起動プロセス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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加