首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

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

2012-03-14 
C# win ce 如何在手持设备上只能运行单个实例C# 开发的win CE 程序,如何让他只能在手持设备上 运行单个实

C# win ce 如何在手持设备上只能运行单个实例
C# 开发的win CE 程序,如何让他只能在手持设备上 运行单个实例。 求解。

[解决办法]
使用互斥量

FindWindow()


[解决办法]
用互斥量,下面是c++ API的例子,c#也类似:

C/C++ code
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做的 互斥量 
VB.NET code
    '===============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的呵呵
VB.NET code
    '------------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 通用的程序单例运行-混合
[解决办法]
调用例子
VB.NET code
    '启动对象    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 


[解决办法]
任何一种进程间通信的手段都可以吧。。最最简单的做法,用一个文件,进程运行时独占方式打开它(不存在要先创建),如果打开失败,说明有进程运行了,就退出。。

热点排行