2016-04-15 5 views
1

Delphi(この場合はDelphi 7)を使用して、PID(プロセスID)からウィンドウタイトルを取得する方法を教えてください。PID(プロセスID)のみを持っている場合はウィンドウタイトルを取得

"Internet Explorer/Chrome"ウィンドウタイトルを取得しようとしています。これまで

マイコード:

procedure GetAllBrowserTitle; 
var 
    hProcSnap : THandle; 
    pe32   : TProcessEntry32; 
    P   : string; 
    PID   : integer; 
    ContinueLoop : BOOL; 
begin 

    try 
    hProcSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if hProcSnap = INVALID_HANDLE_VALUE then exit; 

    pe32.dwSize := SizeOf(pe32); 
    ContinueLoop := Process32First(hProcSnap, pe32); 

    While (Integer(ContinueLoop) <> 0) do 
    begin 

     P := LowerCase(pe32.szExeFile); 

     if (Pos('iexplore.exe', P) > 0) Or (Pos('chrome.exe', P) > 0) then 
     begin 
     PID := pe32.th32ProcessID; 
     // Get the Window Title 
     // ??? 
     end; 

     ContinueLoop := Process32Next(hProcSnap, pe32); 
    end; 

    CloseHandle(hProcSnap); 

    except 
    end; 
end; 

一部私は知らないウィンドウタイトルを取得することです。私の研究から、すべての例では、Window HandleまたはEnumWindowコールバックを使用する必要があります。

お手数ですが、

ありがとうございました。

+2

クロムには、潜在的に多くのプロセスがあります。プロセスによっては、ウィンドウを所有しているものもあります。プロセスによっては、多くのウィンドウがあります。 Chromeはブラウザタブごとに異なるプロセスを使用します。 EnumWindowを理解できないかもしれませんが、問題を解決するための適切な関数であれば、その使用法を学ぶ必要があります。コーディングを続ける前に、何をやっているのかを理解し、問題を理解する必要があります。正しく述べられていない問題を解決しようとすることは何の意味もありません。 –

+1

"...所有していないウィンドウ..." :-) –

+0

"EnumWindowのコールバックは私が理解できません" - EnumWindowsを使用したDelphiの例についてはgoogle ... - –

答えて

2

PIDを取得すると、作成したウィンドウを検出する2つの方法があります。

  1. EnumWindows()を呼び出して、すべてのトップレベルウィンドウを列挙します。それに渡すコールバック関数は、GetWindowThreadProcessId()を使用して、各ウィンドウがPIDに属しているかどうかを確認できます。

  2. 使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD)Thread32First()、およびThread32Next()一致する各スレッドにEnumThreadWindows()を呼び出し、PIDに属しているものを探して、すべての実行中のスレッドを列挙する。

いずれの場合でも、トップレベルウィンドウのみを列挙します。ターゲットプロセスがトップレベルウィンドウの代わりに子ウィンドウを作成する場合、特に異なるプロセスの他のウィンドウにそれらの子ウィンドウをホストする意図がある場合は、#1を使用する必要がありますが、トップレベルウィンドウのPIDは無視し、 EnumChildWindows()を使用して子ウィンドウを列挙し、代わりに子ウィンドウでGetWindowThreadProcessId()を使用します。

関連する問題