是否有可能在.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();
}
您的代码几乎没问题。唯一缺少的是删除应用程序出口,并在其中放入将当前运行实例置于顶部所需的代码。我在过去这样做,所以你不需要禁用或隐藏图标,你只需检测到已经运行的实例,并把它放在前台。
编辑:这里有一些代码片段:
[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中创建单实例应用程序的最佳方法是什么?