注册 登录
编程论坛 VB6论坛

求禁止重复运行,激活最小化或隐藏窗口置前焦点代码

rogersgb 发布于 2016-03-03 11:03, 4293 次点击
If App.PrevInstance ThenMsgBox "程序已运行", vbExclamation + vbOKOnly, "操作提示"EndEndIf
8 回复
#2
风吹过b2016-03-04 11:45
代码没在这,就说一个原理吧。使用到了系统自定义消息。

1、程序运行,判断是不是第一个运行。如果是,继续 ,如果否,跳4
2、挂钩自己的消息,监控自定义消息。自定义消息,你这里面只需要定义一个。
3、如果检测到自定义的消息,把自己显示出来。

4、以自己的名字来 检索系统 句柄,应该能发现2个。对这二个系统句柄 都发自定义消息。
5、结束自己。



#3
wmf20142016-03-04 11:51
可以使用进程间通讯DDE通知已运行的进程自动前置,获得焦点,然后自己退出。
#4
rogersgb2016-03-04 12:27
回复 3楼 wmf2014
好象试过,但我这程序运行后,最小化或隐藏后,就不会激活窗口到显示,点击没反应
#5
风吹过b2016-03-04 12:54
DDE 我没用过,看过介绍,据说已被微软放弃了,所以更没去看。

我喜欢自己掌握所能掌握的部分,对DDE无视。
#6
wmf20142016-03-04 19:56
楼主可提交自己的工程文件嘛,估计这里的有大神瞬间帮你解决的。
vb里设置dde比较简单,只需要设置窗体的LinkMode属性,几行代码即可搞定,不需要控件,不需要api声明。百度了下,没看到说微软放弃的说法,不过是一个动态数据交换协议,大概用的人少,很多大神只看到高大上,不屑用它吧。
#7
rogersgb2016-03-05 08:15
回复 6楼 wmf2014
用下面代码,第二次运行时,FORM1窗口没有显示出来,点击无反应.第一次运行后窗口隐藏成托盘图标,第二次没反应

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

Sub Main()
    If App.PrevInstance Then
        'Form1 为你程序主窗口标题,不要和别的程序一样
        SetForegroundWindow FindWindow(vbNullString, App.Title)
    Else
        Form1.Show
    End If
End Sub


#8
风吹过b2016-03-05 11:25
DDE,初步测试可行。

参考:
http://blog.
#9
rogersgb2016-03-06 08:59
回复 8楼 风吹过b
谢谢,这种方法可行,已解决
1