1

Web ブラウザが実行されているかどうかを確認する最良の方法は何ですか?

Delphi XE2 と Windows を使用して、次の Web ブラウザが現在実行されているかどうかを確認する必要があります。

A) Mozilla Firefox B) Apple Safari C) Google Chrome

見つかった場合、プロセスは終了します。これは、Web ブラウザー構成ファイルを変更することにより、Web ブラウザーのホームページをプログラムで変更する必要があるためです (これは不可能であるか、または Web ブラウザーが無効なときに実行すると、予期しない結果になる可能性があります)。ランニング)。

EnumWindows API 関数からの出力には、上記のタスクを処理するために必要な十分な情報が含まれていますか? はいの場合、上記の各 Web ブラウザーのウィンドウ クラス名はどこかに文書化されていますか? いいえの場合、どの方法が最も信頼できますか?

ティア。

4

1 に答える 1

7

ユーザーの許可なしにプロセスを終了することはお勧めできません。代わりに、ユーザーにアプリ(この場合はWebブラウザー)を終了するかどうかを尋ねる必要があります。

ここで質問に戻ります。このCreateToolhelp32Snapshotメソッドを使用して、アプリ(webbroser)がプロセス名(firefox.exe、chrome.exe、safari.exe)のチェックを実行しているかどうかを検出できます。

uses
  Windows,
  tlhelp32,
  SysUtils;

function IsProcessRunning(const ListProcess: Array of string): boolean;
var
  hSnapshot : THandle;
  lppe : TProcessEntry32;
  I : Integer;
begin
  result:=false;
  hSnapshot     := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hSnapshot <> INVALID_HANDLE_VALUE then
  try
    lppe.dwSize := SizeOf(lppe);
    if Process32First(hSnapshot, lppe) then
      repeat
        for I := Low(ListProcess) to High(ListProcess) do
        if  SameText(lppe.szExeFile, ListProcess[i])  then
          Exit(True);
      until not Process32Next(hSnapshot, lppe);
  finally
    CloseHandle(hSnapshot);
  end;
end;

そしてそのように使用します

  IsProcessRunning(['firefox.exe','chrome.exe','safari.exe'])

より信頼性の高い方法が必要な場合は、ウィンドウのクラス名(メソッドを使用)を検索してFindWindowExから、ハンドルのプロセス所有者のPID(を使用GetWindowThreadProcessId)を検索できます。ここから、プロセスのPIDを使用して解決できます。 exeの名前。

{$APPTYPE CONSOLE}

uses
  Windows,
  tlhelp32,
  SysUtils;

function GetProcessName(const th32ProcessID: DWORD): string;
var
  hSnapshot : THandle;
  lppe : TProcessEntry32;
begin
  result:='';
  hSnapshot     := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hSnapshot <> INVALID_HANDLE_VALUE then
  try
    lppe.dwSize := SizeOf(lppe);
    if Process32First(hSnapshot, lppe) then
      repeat
        if  lppe.th32ProcessID=th32ProcessID  then
          Exit(lppe.szExeFile);
      until not Process32Next(hSnapshot, lppe);
  finally
    CloseHandle(hSnapshot);
  end;
end;

function IsWebBrowserRunning(const ClassName, ExeName :string) : Boolean;
var
  hWindow : THandle;
  dwProcessId: DWORD;
begin
  result:=False;
  hWindow:= FindWindowEx(0, 0, PChar(ClassName), nil);
  if hWindow<>0 then
  begin
    dwProcessId:=0;
    GetWindowThreadProcessId(hWindow, dwProcessId);
    if dwProcessId>0 then
      exit(Sametext(GetProcessName(dwProcessId),ExeName));
  end;
end;


begin
  try
   if IsWebBrowserRunning('MozillaWindowClass','firefox.exe') then
    Writeln('Firefox is Running');

   if IsWebBrowserRunning('{1C03B488-D53B-4a81-97F8-754559640193}','safari.exe') then
    Writeln('Safari is Running');

   if IsWebBrowserRunning('Chrome_WidgetWin_1','chrome.exe') then
    Writeln('Chrome is Running');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
于 2012-07-17T04:39:59.077 に答える