您的位置:首页 > 理论基础

如何实现单点登录(一台计算机,只能运行一个客户端)

2012-03-08 09:49 681 查看
首先,我是在wpf上面做开发,检测单点应该是在应用程序初始化的时候进行,所以将代码写在了App.xaml.cs代码文件中。

覆写

protected override void OnStartup(StartupEventArgs e)
{ base.OnStartup(e);}

方法。

再次在 base.OnStartup(e); 之前写上检测进程的代码。

int count = 0;
//Process[] a = Process.GetProcesses();

foreach (Process item in Process.GetProcesses())
{
if (item.ProcessName == "WMS.Views.WpfView")
{
++count;
if (count == 2)
{
CheckExistProcess("WMS.Views.WpfView");

Environment.Exit(0);

}
}

}


使用count检测进程是否已经存在,若已经存在 ,则执行CheckExistProcess("WMS.Views.WpfView"); 方法,然后结束本进程。

#region 实现窗体获得焦点并还原

[DllImport("USER32.DLL", CharSet = CharSet.Auto)]
private static extern int ShowWindow(
System.IntPtr hWnd,
int nCmdShow
);
[DllImport("USER32.DLL", CharSet = CharSet.Auto)]
private static extern bool SetForegroundWindow(
System.IntPtr hWnd
);

[DllImport("user32.dll ")]
public extern static int SetActiveWindow(IntPtr hwnd);

[DllImport("user32.dll ")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

private const int SW_NORMAL = 1;
//判断是否存在名为processName的进程(程序),存在的话使它获得焦点
//例 if (CheckExistProcess("JobExec") == false)
private static bool CheckExistProcess(string processName)
{
bool aRet = false;

System.Diagnostics.Process[] arrProcess
= System.Diagnostics.Process.GetProcessesByName(processName);
if (arrProcess.Length > 0) { aRet = true; }

//09/06/05 Stt Add by Meng バグ3249
if (aRet)
{
try
{
foreach (System.Diagnostics.Process hProcess in arrProcess)
{

ShowWindow(hProcess.MainWindowHandle, SW_NORMAL);
ShowWindowAsync(hProcess.MainWindowHandle, 9);// 9就是SW_RESTORE标志,表示还原窗体
SetForegroundWindow(hProcess.MainWindowHandle);
SetActiveWindow(hProcess.MainWindowHandle);
break;
}
}
catch { }
}
//09/06/05 End Add by Meng バグ3249

return aRet;
}

#endregion


调用Windows API实现将进程窗体获得焦点,并处于窗口顶端,如是最小化状态,则还原。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐