C# win ce 如何在手持设备上只能运行单个实例
C# 开发的win CE 程序,如何让他只能在手持设备上 运行单个实例。 求解。
[解决办法]
使用互斥量
FindWindow()
等
[解决办法]
用互斥量,下面是c++ API的例子,c#也类似:
HANDLE hMutex = CreateMutex(NULL, FALSE, TEXT("SINGLE_INSTANCE"));if(!hMutex){ DEBUGMSG(TRUE, (TEXT("\r\nFailed to CreateMutex()..."))); return FALSE;}if (GetLastError() == ERROR_ALREADY_EXISTS){ DEBUGMSG(TRUE, (TEXT("\r\nApp already run,CloseHandle(%x)..."), hMutex)); CloseHandle(hMutex); return FALSE;} DEBUGMSG(TRUE, (TEXT("\r\nApp is running (%x)..."), hMutex));
[解决办法]
有转换器自己转吧,给你个VBNET做的 互斥量
'===============WINCE 下,本文件只运行一次 <DllImport("coredll.dll", SetLastError:=True)> _ Private Function CreateMutex(ByVal lpMutexAttributes As IntPtr, ByVal bInitiaOwner As Boolean, ByVal lpName As String) As IntPtr End Function <DllImport("coredll.dll")> _ Private Function ReleaseMutex(ByVal hMutex As IntPtr) As Boolean End Function ' <DllImport("coredll.dll", CharSet:=CharSet.Auto)> _ ' Private Function OpenMutex(ByVal dwDesiredAccess As UInteger, ByVal bInheritHandle As Integer, ByVal lpName As String) As IntPtr ' End Function ' <DllImport("coredll.dll")> _ ' Private Function GetLastError() As Integer ' End Function Const ERROR_ALREADY_EXISTS As Integer = 183 Function Ce_CheckInstance(ByVal Forms_Caption_Name As String) As Boolean '原定义后即为 =False '表示不存在 Dim ipHMutex As IntPtr = CreateMutex(IntPtr.Zero, True, Forms_Caption_Name) '函数输出错误号,下面比较-创建 ' Return Marshal.GetLastWin32Error() = ERROR_ALREADY_EXISTS ' 返回判等式值是否相等,相等为TRUE ,表示已经存在 If Marshal.GetLastWin32Error() = ERROR_ALREADY_EXISTS Then Ce_CheckInstance = True '表示已经存在 End If Try ReleaseMutex(ipHMutex) '释放 Catch End Try End Function '===============WINCE 下,本文件只运行一次
[解决办法]
再给个FindWindow的呵呵
'------------wince 与 WINXP 通用的程序单例运行-混合 Function Check_Run_1(ByVal Forms_Caption_Name As String) As Boolean '原定义后即为 =False '表示不存在 Try Dim hWnd As IntPtr = FindWindow(IntPtr.Zero, Forms_Caption_Name) ' -WINCE 查找窗体法,是程序运行单例 If hWnd.ToInt32 <> 0 Then '表示已经存在 Check_Run_1 = True ' MessageBox.Show(hWnd.ToInt32) '句柄可以按需要输出,到整个程序 End If Catch 'ex As Exception Try If Xp_CheckInstance(Forms_Caption_Name) = True Then '表示已经存在 ‘WINCE Check_Run_1 = True ' MessageBox.Show("!!") End If Catch ex As Exception End Try End Try Return Check_Run_1 End Function '-------------wince 与 WINXP 通用的程序单例运行-混合
[解决办法]
调用例子
'启动对象 Sub Main() '------ 配置XML读取 Xml_FileName = Get_Xml_filename(Kjx) '获得当前运行文件的目录及配置文件名--全路径,不存在则创建默认配置文件,存在则读取数据到 KJX '-----------装载一次则执行一次升级,升级如果成功则退出,不成功则做服务器调试器用-还能再次执行升级。 If Upgrade_Fz_Prg(Kjx.File_Name, Kjx.Temp_dir, Kjx.Window_Name) = True Then Exit Sub '根据XML文件升级,升级如果成功则退出。 '-----WINCE 与 WINXP 通用的单例运行检查-STA Dim hWnd As IntPtr Try hWnd = Ce_Check_Run("分站的辅助升级") ' CE系统下找窗体句柄 Catch hWnd = Xp_Check_Run("分站的辅助升级") ' XP系统下找窗体句柄 End Try If hWnd.ToInt32 = 0 Then Application.Run(Upgrade_Main) '(New Upgrade_Main) '=0 没有发现 "分站的辅助升级" 程序窗口,则运行之 '-----WINCE 与 WINXP 通用的单例运行检查-END End Sub
[解决办法]
任何一种进程间通信的手段都可以吧。。最最简单的做法,用一个文件,进程运行时独占方式打开它(不存在要先创建),如果打开失败,说明有进程运行了,就退出。。