打开第二次VB程序时通知第一次运行的程序并自己关闭的方法

 开场白:很多程序,如WINDOWS MEDIA PLAYER,在程序第二次打开,第一次的程序并未关闭时,会自动激活第一次运行的程序,而且会自动把选取的音乐添加到第一次的那个程序的播放列表里,这是如何作到的呢?

思路:利用APP对象的PrevInstance属性,该属性在该实例运行第二次以上时返回TRUE,并且利用注册表为中介,记录第一次运行的程序的窗体的hWnd值,向其发送一条特定的消息,并在该消息被第一个程序捕获时分析,读去作为中介的注册表里的信息即可!OK!开工!

首先,新打开一个工程,添加一个窗体和一个模块。向模块里添加如下几个API及常数:
SendMessage
SetWindowLong
GetWindowLong
CallWindowProc

GWL_WNDPROC
ZIDINGYIXIAOXI = 101010 '这个常数是自己定的,但一定不要与WINDOWS的消息重复
定义全局LONG类型变量:prevWndProc.作用:保存窗体以前的窗口回调函数,以便在退出时恢复,否则……

在FORM的LOAD事件里写下如下代码:

If App.PrevInstance = True Then  '如果已经有一个实例在运行
  SendMessage CLng(GetSetting(App.EXEName, "Dynamic Data", "hWnd")), ZIDINGYIXIAOXI, 0, ByVal 0& '发送自定义消息
  Unload Me '卸载窗体
  Exit Sub  '跳出程序
End If

prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '*     '记录以前的窗口回调函数
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc '*  '挂上自己的窗口回调函数
SaveSetting App.EXEName, "Dynamic Data", "hWnd", CStr(Me.hwnd) '在注册表里写下本窗体的句柄



在窗体的UnLoad事件里写下如下代码:
SetWindowLong Me.hwnd, GWL_WNDPROC, prevWndProc '把窗口回调函数换成以前的,否则会死机


然后,在模块里写这样一个函数(就是回调函数):
Public Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = ZIDINGYIXIAOXO Then '判断是否为第二个实例发来的自定义消息
  Form1.Show '显示窗体
  Form1.WindowState = 2 '最大化
End If
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) '让Windows处理余下的消息
End Function

好了,基本思路大概就是这样了,大家还可以完善,比如把第二个程序被运行时的参数写到注册表里并加以处理.但这只是个框架,那些程序大概就是这么实现的.

这个方法最大的缺点就是以比较不安全的注册表作为记录hWnd的地方,希望哪位有更好的方法来解决这个问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值