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

关于程序第二次运行解决方案

2012-02-19 
关于程序第二次运行已知App.PrevInstance可以检测出程序是否正在运行..但是我想在程序第二次运行时,把第一

关于程序第二次运行
已知App.PrevInstance可以检测出程序是否正在运行..

但是我想在程序第二次运行时,把第一个程序设置焦点了,并且调用第一次程序的其中一个窗口!

我想应该用API在进程中找第一个程序的关键字,得到HWD   再给个焦点..    
关于怎么调用其中的一个窗口,我有点想不通,
请高手指点..   并给出查找进程以及激活窗体的方法.

[解决办法]
有以下几步:

一,注册一个互斥体(CreateMutex)

二,注册一个自定义消息(RegisterWindowMessage)

然后把自己某个窗体子类化,监视那个自定义消息;

程序在启动时,先检查一下互斥体。如果存在,就向子类化的窗体发送一个自定义消息(SendMessage),然后退出。

查找那个子类化窗体可以使用FindWindow,标题你自己应该知道。
[解决办法]
以前写的使用DDE来实现防止程序第二次运行及在第二次运行时将一些参数传递给已运行的程序的的代码。

Option Explicit

'程序名称:DDE Demo
'代码设计:Jade
'设计日期:2001/03/05
'功能说明:用于演示如何通过DDE的方法来防止一个程序被运行两次
' 同时还演示了在第二次运行时将一些参数传递给已运行的程序的功能

Private Sub Form_Load()
Dim FirstRun As Boolean
'暂停本程序的DDE Server
Me.LinkMode = 0
'尝试连接已运行的DDE Demo
txtClient.LinkMode = 0
'在设计时,窗体frmDDE的LinkTopic被设置成了 "DDE ",工程名称被设置成了 "DDEDemo "
'另外有一个TextBox的名称被设置成了 "txtServer "
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 Sub

Private Sub txtServer_Change()
'有其他DDE Demo运行了,传递来的是这些DDE Demo的ID
lblRunning.Caption = lblRunning.Caption & vbCrLf & "Another DDE Demo ID: " & _
txtServer.Text
End Sub

在txtServer_Change你可以处理程序第二次运行时传递来的参数,象 "并且调用第一次程序的其中一个窗口 "这种要求还是非常容易实现的。
[解决办法]
可以把hwnd记录在注册表中,然后第二次运行的程序可以通过hwnd与前一实例通讯
[解决办法]
标记在注册表中 要是被别的程序终止了 那下次运行就要出问题了

App.PrevInstance 只对同一路径的程序有效 如果复制一份再运行就检测不出来了

可以
FINDWINDOW 为防止标题被更改 可以在TIMER控件里Frm.Caption = "名称 "
[解决办法]
用FINDWINDOWS找到后可用API中是SETWINDOWSFOCUS好像是这个设置焦点
若不行就用SHOWWINDOWD

热点排行