试试看这样行不:在应用程序设置中,勾选“生成单个实例应用程序”,然后在应用程序事件中处理这个事件
成都创新互联公司致力于互联网品牌建设与网络营销,包括网站设计、成都网站建设、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。成都创新互联公司为不同类型的客户提供良好的互联网应用定制及解决方案,成都创新互联公司核心团队十年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。
Private Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
'这里的 e.CommandLine应该就是双击第二个文件时传进来的命令行
End Sub
在项目上右键,然后选择属性,打开如下图所示的项目属性对话框:
然后选择左边的“应用程序”标签页,再勾选上“生成单个实例应用程序”。
最简单的方法
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) 0 Then End
前提是你的程序名别太普通了容易和别的进程重名就不行了
方法一:通过Diagnostics.Process.GetProcessesByName函数来检测程序是否已经启动
Imports System.Windows.Forms
Module Module1
Sub Main()
'检测多重启动
If Diagnostics.Process.GetProcessesByName( _
Diagnostics.Process.GetCurrentProcess.ProcessName).Length 1 Then
MessageBox.Show("已经一个实例的本程序正在运行。")
Return
End If
Application.Run(New Form())
End Sub
End Module
不过这个方法有个缺点,如果用户改了下exe的名字就检测不到了,所以更好的方法如下
方法2:使用Mutex
Imports System.Windows.Forms
Module Module1
Sub Main()
Dim createdNew As Boolean
' 创建mutex
Dim mutex As System.Threading.Mutex = _
New System.Threading.Mutex(True, "YourAppName", createdNew)
If createdNew = False Then
MessageBox.Show("已经一个实例的本程序正在运行。")
Return
End If
Application.Run(New Form())
' 释放mutex
mutex.ReleaseMutex()
End Sub
End Module
虽然你的想法是在 LoginBtn_Click 事件中将复杂的操作分离出去以减轻UI的负担, 这很好完全没有问题.
但是问题在于 Me.Invoke(dh)这里,若是ChkLogin里面仍然是大规模的操作呢 你的代码就又变成将很复杂的操作扔给了UI, 当然会出现窗体无法拖动的情况了.
解决办法很简单, 很多种. 将ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke仅仅只是做简单的轻量的刷新之类的操作就好了.
希望能帮上你的忙.
因为你Dim lByte As Byte 没有声名数组,
lSWiter.WriteByte(Nothing) '这句话也是错误的,你把文件流给写入空了,所以第二次运行打开文件就没有数据了。
多调试,跟踪数据,可以多学点经验。