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;
この件についてさらに情報が必要な場合は、この件に関する私の記事を読むことができます。