是否有可能在.net紧凑框架上完全避免多实例?

本文关键字:完全避免 实例 框架 有可能 net 是否 | 更新日期: 2023-09-27 18:08:54

因为我已经尝试了很多方法来阻止运行在。net compact framework 3.5上的手持设备上的多实例问题。

目前,我通过创建"互斥"得到了解决方案,并检查是否有相同的进程正在运行。我把这条语句放在"program .cs"中,它将在程序启动时第一次执行。

但我认为这并不能解决我的问题,因为我收到了用户的请求,他们需要在程序运行时禁用"程序图标"。

我理解用户的观点,有时他们可能在短时间内多次"打开"程序。所以,如果它还能"打开"。这意味着程序需要初始化,最后可能会失败。是否有可能绝对防止多重实例?或者有没有其他不需要编程的方法,比如在Windows CE上编辑注册表?


我的源代码:

bool firstInstance;
NamedMutex mutex = new NamedMutex(false, "MyApp.exe", out firstInstance);
if (!firstInstance)
{
    //DialogResult dialogResult = MessageBox.Show("Process is already running...");
    Application.Exit();
}

是否有可能在.net紧凑框架上完全避免多实例?

NamedMutex是来自OpenNetCF的类。

您的代码几乎没问题。唯一缺少的是删除应用程序出口,并在其中放入将当前运行实例置于顶部所需的代码。我在过去这样做,所以你不需要禁用或隐藏图标,你只需检测到已经运行的实例,并把它放在前台。

编辑:

这里有一些代码片段:

[DllImport("coredll.dll")]
private static extern IntPtr FindWindow(IntPtr className, string windowName);
[DllImport("coredll.dll")]
internal static extern int SetForegroundWindow(IntPtr hWnd);
[DllImport("coredll.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, int hwnd2, int x,int y, int cx, int cy, int uFlags);
if (IsInstanceRunning())
{
    IntPtr h = FindWindow(IntPtr.Zero, "Form1");
    SetForegroundWindow(h);
    SetWindowPos(h, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height, 0x0040);
    return;
}

查看这些链接获取更多信息…

http://www.nesser.org/blog/archives/56(含注释)

在Compact Framework中创建单实例应用程序的最佳方法是什么?