当前位置: 代码迷 >> WinCE >> C# win ce 怎么在手持设备上只能运行单个实例
  详细解决方案

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

热度:96   发布时间:2016-04-28 13:19:50.0
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
  相关解决方案