C# win ce 如何在手持设备上只能运行单个实例

lili20090907 2012-02-07 09:37:17
C# 开发的win CE 程序,如何让他只能在手持设备上 运行单个实例。 求解。
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwqwqw408 2012-02-08
  • 打赏
  • 举报
回复
任何一种进程间通信的手段都可以吧。。最最简单的做法,用一个文件,进程运行时独占方式打开它(不存在要先创建),如果打开失败,说明有进程运行了,就退出。。
帮帮你我她 2012-02-08
  • 打赏
  • 举报
回复
调用例子

'启动对象
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
帮帮你我她 2012-02-08
  • 打赏
  • 举报
回复
再给个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 通用的程序单例运行-混合

帮帮你我她 2012-02-08
  • 打赏
  • 举报
回复
有转换器自己转吧,给你个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 下,本文件只运行一次



northcan 2012-02-08
  • 打赏
  • 举报
回复
用互斥量,下面是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));
lili20090907 2012-02-07
  • 打赏
  • 举报
回复
详细一点,哥们,俺是新手。。。
91program 2012-02-07
  • 打赏
  • 举报
回复
使用互斥量

FindWindow()

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧