在.NET(而不是Windows窗体或控制台)下使用C#和WPF ,创建只能作为单个实例运行的应用程序的正确方法是什么?
我知道这与一些叫做互斥的神秘事物有关,我很少能找到一个不愿意停下来解释其中一个是什么的人.
代码还需要通知已经运行的实例用户尝试启动第二个,并且如果存在任何命令行参数,也可以传递.
我正在处理来自Windows的应用程序关联扩展文件.所以当你从Windows双击一个文件时,它将执行我的程序,我从那里处理文件,如:
procedure TMainForm.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ParamCount -1 do
begin
if SameText(ExtractFileExt(ParamStr(i)), '.ext1') then
begin
// handle my file..
// break if needed
end else
if SameText(ExtractFileExt(ParamStr(i)), '.ext2') then
begin
// handle my file..
// break if needed
end else
end;
end;
Run Code Online (Sandbox Code Playgroud)
这几乎是我想要的,但是当我测试时,我意识到它不考虑只使用我的程序的一个实例.
因此,例如,如果我从Windows中选择了多个文件并同时打开它们,这将创建与我的程序相同数量的实例,并打开文件数.
什么是一个很好的方法来解决这个问题,以便不是打开我的程序的几个实例,而是打开Windows的任何其他文件只会集中回到唯一的实例,我正常处理文件?
谢谢
UPDATE
我在这里找到了一篇很好的文章:http://www.delphidabbler.com/articles? article = 13&part = 2我认为这就是我需要的,并展示了如何使用rhooligan提到的Windows API.我现在要读完它..
如何获取使用给定文件名和互斥锁名称的进程的PID?(不是通过自定义内核驱动程序,而是在用户模式下的C#中.)
我在两个应用程序之间有一个共享的互斥锁.我想创建一个管理控制台,显示当前所有者的互斥锁名称.
如何获取当前拥有Mutex的应用程序名称?