2

FireMonkeyとマルチプラットフォーム アプリケーション ( Windows + Mac OS X ) を使用して、アプリケーションのインスタンスを 1 つだけ同時に実行するにはどうすればよいでしょうか?

以前のインスタンスが既に実行されている場合、それをデスクトップのフォアグラウンド ウィンドウとして設定するにはどうすればよいですか?

  • ファイルがロックされているかどうかを確認できます。
    • not locked : ロックして正常に実行します
    • locked : 以前のバージョンを見つけて (Windows では方法を知っていますが、Mac では ?)、それをフォアグラウンド ウィンドウとして設定します
  • 同じプロセスが何回起動されたかを確認できます(Windowsでは同じですが、Mac OS Xでそれを行う方法)
  • ...
4

1 に答える 1

4

Windows と OSX の両方で、実行中のアプリケーションのリストを取得し、自分のアプリケーションがリストにあるかどうかを確認してから、メッセージを表示して閉じることができます。OSX では NSWorkspace の lauchedApplications メソッドでリストを取得でき、Windows では同じ目的で toolhelp32 ライブラリを使用できます。これは、私のウェブサイトでブログに書いた TPlatformExtensions クラスの関連コードです。

OSX の場合:

uses Macapi.AppKit, Macapi.Foundation;

class procedure TPlatformExtensionsMac.GetRunningApplications(
  Applist: TStringlist);
var
  fWorkSpace:NSWorkSpace;
  list:NSArray;
  i: Integer;
  lItem:NSDictionary;
  key,value: NSString;
begin
  fWorkSpace := TNsWorkspace.Wrap(TNsWorkSpace.OCClass.sharedWorkspace);
  list := fWorkspace.launchedApplications;
  if (List <> nil) and (List.count > 0) then
  begin
    for i := 0 to list.count-1 do
    begin
      lItem := TNSDictionary.Wrap(List.objectAtIndex(i));
      key := NSSTR(String(PAnsiChar(UTF8Encode('NSApplicationBundleIdentifier'))));
      // You can also use NSApplicationPath or NSApplicationName
      value := TNSString.Wrap(lItem.valueForKey(key));
      Applist.Add(String(value.UTF8String));
    end;
  end;
end; 

Windows の場合:

uses Winapi.TlHelp32, Winapi.Windows;

class procedure TPlatformExtensionsWin.GetRunningApplications(
  Applist: TStringlist);
var
 PE: TProcessEntry32;
 Snap: THandle;
 fName: String;
begin
  pe.dwsize:=sizeof(PE);
  Snap:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> 0 then
  begin
    if Process32First(Snap, PE) then
    begin
     fName := String(PE.szExeFile);
     Applist.Add(fName);
     while Process32Next(Snap, PE) do
     begin
       fName := String(PE.szExeFile);
       Applist.Add(fName);
     end;
    end;
    CloseHandle(Snap);
  end;
end; 

この件についてさらに情報が必要な場合は、この件に関する私の記事を読むことができます。

于 2012-11-24T23:36:13.447 に答える