首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

再问关于“生成单个应用程序实例”的有关问题

2012-02-02 
再问关于“生成单个应用程序实例”的问题刚才在论坛中找了一下,发现有人提供如下代码:STAThread()SharedSu

再问关于“生成单个应用程序实例”的问题
刚才在论坛中找了一下,发现有人提供如下代码:

  <STAThread()>   Shared   Sub   main(ByVal   cmdargs()   As   String)
                Dim   createdNew   As   Boolean   '返回是否赋予使用线程的互斥体初始所属权
                Dim   Instance   As   System.Threading.Mutex   '同步基元变量
                Instance   =   New   System.Threading.Mutex(True,   "MutexName ",   createdNew)
                If   createdNew   Then   '赋予了线程初始所属权,也就是首次使用互斥体
                        System.Windows.Forms.Application.Run(New   Form1)   '运行程序
                        Instance.ReleaseMutex()   '释放Mutex一次
                Else
                   
                        MessageBox.Show( "该程序已经启动 ",   "禁止启动多个实例 ",   MessageBoxButtons.OK,   MessageBoxIcon.Stop)
                        Application.Exit()
                End   If
        End   Sub

        我把如上代码分别放到Form1.Desinger.vb和Form1.vb中均没有效果。烦请高手能详细告知。
       
        另外如何再次大开程序的时候让已经打开的程序成为当前窗体。

[解决办法]
我是这样做的
在模块中写

'For single instance
Public Function CheckNimsRunning() As Integer
Dim pTmp As Process() = Process.GetProcesses()
Dim pCurrent As Process = Process.GetCurrentProcess()

If (pTmp.Length > 0) Then
Dim i As Integer
While (i < pTmp.Length)
If (pTmp(i).Id > 4) Then
If (pTmp(i).Id <> pCurrent.Id) Then
'If (pTmp(i).MainModule.ModuleName = pCurrent.MainModule.ModuleName) Then
If (pTmp(i).ProcessName = pCurrent.ProcessName) Then
Return (pTmp(i).Id)
End If
End If
End If

i = i + 1
End While
End If

Return (0)
End Function

然后在入口的 Form_Load 中合适的位置写入下代码

'For single instance
Dim pNimsID As Integer = CheckNimsRunning()
If (pNimsID > 0) Then
AppActivate(pNimsID)

Me.Close()
Exit Sub
End If
[解决办法]
而且貌似在 Project 的属性中,应用程序选项下有个 “启用应用程序框架”,里面有个选项叫“生成单个实例应用程序”,可能和你的要求有关。不过我已经用了上面的方法了,就没有再测试这个(我的Project就要完工了,我不想节外生枝),如果你测试了,不管什么结果,希望能告诉我,谢谢先

热点排行