第二次运行程序时如何做到只显示第一次程序而非第二次再打开? 我看到有一些软件:软件已经启动了!再次点这运行这个软件时,不是第二次打开,而是把第一次运行的窗口显示出来,这是怎么做到的? 请贴代码,谢谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 If App.PrevInstance Then '如果程序已经被打开就退出 Unload MeElseendif 大哥们,使用App.PrevInstance 去监测我知道啊,问题如何调出已在运行的程序啊? 用FindWindow函数找到自己的程序的窗口,获得句柄,然后调用ShowWindow或者其他函数显示出自己的程序 FindWindow VB声明 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 说明 寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题) 返回值 Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 参数表 参数 类型及说明 lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类 lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题 注解 很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数 示例 Dim hw&, cnt&Dim rttitle As String * 256hw& = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4cnt = GetWindowText(hw&, rttitle, 255)MsgBox Left$(rttitle, cnt), 0, "RTMain title" ShowWindow VB声明 Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 说明 控制窗口的可见性(在vb里使用:针对vb窗体及控件,请使用对应的vb属性) 返回值 Long,如窗口之前是可见的,则返回TRUE(非零),否则返回FALSE(零) 参数表 参数 类型及说明 hwnd Long,窗口句柄,要向这个窗口应用由nCmdShow指定的命令 nCmdShow Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数 SW_HIDE 隐藏窗口,活动状态给令一个窗口 SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 SW_SHOWMAXIMIZED 最大化窗口,并将其激活 SW_SHOWMINIMIZED 最小化窗口,并将其激活 SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 SW_SHOWNORMAL 与SW_RESTORE相同 SetForegroundWindow VB声明 Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long 说明 将窗口设为系统的前台窗口。这个函数可用于改变用户目前正在操作的应用程序 返回值 Long,非零表示成功,零表示失败。会设置GetLastError 参数表 参数 类型及说明 hwnd Long,带到前台的窗口 注解 不应随便使用它,因为一旦程序突然从后台进入前台,可能会使用户产生迷惑 使用DDE来实现这一功能的示例代码:Option Explicit'程序名称:DDE Demo'代码设计:Jadeluo'设计日期:2001/03/05'功能说明:用于演示如何通过DDE的方法来防止一个程序被运行两次' 同时还演示了在第二次运行时将一些参数传递给已运行的程序的功能'在设计时,窗体的LinkTopic被设置成了"DDE", 工程名称被设置成了"DDEDemo"'窗体上有一个Label控件, 名为lblRunning'窗体上还有两个TextBox控件, 名为txtServer和txtClientPrivate Sub Form_Load() Dim FirstRun As Boolean '暂停本程序的DDE Server Me.LinkMode = 0 '尝试连接已运行的DDE Demo txtClient.LinkMode = 0 txtClient.LinkTopic = "DDEDemo|DDE" txtClient.LinkItem = "txtServer" On Error Resume Next txtClient.LinkMode = 1 FirstRun = Err.Number <> 0 On Error GoTo 0 If FirstRun Then '这是第一次运行DDE Demo '打开本程序的DDE Server,用于被以后运行的DDE Demo连接 Me.LinkMode = 1 lblRunning.Caption = "DDE Demo started..." Else '产生一个随机数作为这次运行的ID Randomize txtClient.Text = Int(Rnd * 1000) '将ID传递给已运行的DDE Demo txtClient.LinkPoke '结束本次运行 End End IfEnd SubPrivate Sub txtServer_Change() '有其他DDE Demo运行了,传递来的是这些DDE Demo的ID lblRunning.Caption = lblRunning.Caption & vbCrLf & "Another DDE Demo ID:" & _ txtServer.Text Me.WindowState = 0 Me.ShowEnd Sub 楼上的代码有问题Me.LinkMode = 0不能在运行时设置!! 我明白了,还应该把Me.LinkMode 在设计时设成1,这样就行了!这个方法的确不错!!谢谢!! 紧急求助printer打印超过默认的宽度问题 VB串口发送数据之间的延时问题??? 删除ListView里的行 18分问一个错误,偶没有MSDN,请帮忙查一下。 我用SQL DTS创建了一个导入数据的DTS包,保存为VB的BAS文件.. 请推荐一种存储本地设置的方式 HUB冲突的原因? 紧急!关于工具栏的图标问题!高分回报!!在线等待! VB有一个选择日期的对话框,我怎么调啊?怎么读到反回值? 关于DataGrid的刷新问题 为什么改变不了打印机打印文字的方向呢 ?急 “查询”时出错,帮忙看看
Unload Me
Else
endif
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
说明
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
返回值
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
注解
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
示例
Dim hw&, cnt&
Dim rttitle As String * 256
hw& = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4
cnt = GetWindowText(hw&, rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, "RTMain title" ShowWindow VB声明
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
说明
控制窗口的可见性(在vb里使用:针对vb窗体及控件,请使用对应的vb属性)
返回值
Long,如窗口之前是可见的,则返回TRUE(非零),否则返回FALSE(零)
参数表
参数 类型及说明
hwnd Long,窗口句柄,要向这个窗口应用由nCmdShow指定的命令
nCmdShow Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同 SetForegroundWindow VB声明
Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
说明
将窗口设为系统的前台窗口。这个函数可用于改变用户目前正在操作的应用程序
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,带到前台的窗口
注解
不应随便使用它,因为一旦程序突然从后台进入前台,可能会使用户产生迷惑
'代码设计:Jadeluo
'设计日期:2001/03/05
'功能说明:用于演示如何通过DDE的方法来防止一个程序被运行两次
' 同时还演示了在第二次运行时将一些参数传递给已运行的程序的功能'在设计时,窗体的LinkTopic被设置成了"DDE", 工程名称被设置成了"DDEDemo"
'窗体上有一个Label控件, 名为lblRunning
'窗体上还有两个TextBox控件, 名为txtServer和txtClientPrivate Sub Form_Load()
Dim FirstRun As Boolean
'暂停本程序的DDE Server
Me.LinkMode = 0
'尝试连接已运行的DDE Demo
txtClient.LinkMode = 0
txtClient.LinkTopic = "DDEDemo|DDE"
txtClient.LinkItem = "txtServer"
On Error Resume Next
txtClient.LinkMode = 1
FirstRun = Err.Number <> 0
On Error GoTo 0
If FirstRun Then
'这是第一次运行DDE Demo
'打开本程序的DDE Server,用于被以后运行的DDE Demo连接
Me.LinkMode = 1
lblRunning.Caption = "DDE Demo started..."
Else
'产生一个随机数作为这次运行的ID
Randomize
txtClient.Text = Int(Rnd * 1000)
'将ID传递给已运行的DDE Demo
txtClient.LinkPoke
'结束本次运行
End
End If
End SubPrivate Sub txtServer_Change()
'有其他DDE Demo运行了,传递来的是这些DDE Demo的ID
lblRunning.Caption = lblRunning.Caption & vbCrLf & "Another DDE Demo ID:" & _
txtServer.Text
Me.WindowState = 0
Me.Show
End Sub
这个方法的确不错!!谢谢!!