使用FireMonkey和一个多平台应用程序(Windows + Mac OS X),如何同时运行一个应用程序的一个实例?
如果以前的实例已经在运行,如何将其设置为桌面前景窗口?
- 我可以检查文件是否被锁定:
- 未锁定:我锁定并正常运行
- 锁定 :找到以前的版本(在windows上,我知道怎么做..但在mac上?)并将其设置为前台窗口
- 我可以检查同一进程启动了多少次(同上,在 Windows 上,好的,但是如何在 Mac OS X 上执行)
- ...
使用FireMonkey和一个多平台应用程序(Windows + Mac OS X),如何同时运行一个应用程序的一个实例?
如果以前的实例已经在运行,如何将其设置为桌面前景窗口?
对于 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;
如果您需要有关该主题的更多信息,可以阅读我关于该主题的文章。