vb托盘与主程序关系问题

geosmancn 2008-04-04 06:37:24
希望可以实现主程序与托盘分离,像杀毒软件那样,可以自启动托盘。通过托盘可以打开主程序!(上面部分都已经实现)。怎么样直接执行主程序,执行时判断托盘如果打开则执行主程序,未打开则先打开托盘,再执行主程序!
我是菜鸟,希望可以讲得稍微详细些!跪谢!
...全文
63 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
有问题请先GOOGLE,BAIDU
回复
luo_yu_ 2008-04-17
以下方法绝对可以的哦!

1、新建立一个VB6工程,将Form1的ShowInTaskBar属性设置为False

2、菜单:工程--添加模块 按“打开”这样就添加了一个新模块,名为Module1,保存为Module1.bas

3、在Module1中写下如下代码:

Option Explicit

Public Const MAX_TOOLTIP As Integer = 64
Public Const NIF_ICON = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206

Public Const SW_RESTORE = 9
Public Const SW_HIDE = 0

Public nfIconData As NOTIFYICONDATA


Public Type NOTIFYICONDATA
cbSize As Long
hWnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * MAX_TOOLTIP
End Type

Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

'4、在Form1的Load事件中写下如下代码:

Private Sub Form_Load()

'以下把程序放入System Tray====================================System Tray Begin
With nfIconData
.hWnd = Me.hWnd
.uID = Me.Icon
.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon.Handle
'定义鼠标移动到托盘上时显示的Tip
.szTip = App.Title + "(版本 " & App.Major & "." & App.Minor & "." & App.Revision & ")" & vbNullChar
.cbSize = Len(nfIconData)
End With
Call Shell_NotifyIcon(NIM_ADD, nfIconData)
'=============================================================System Tray End
Me.Hide
End Sub

'5、在Form1的QueryUnload事件中写入如下代码:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call Shell_NotifyIcon(NIM_DELETE, nfIconData)
End Sub

'6、在Form1的MouseMove事件中写下如下代码:

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lMsg As Single
lMsg = X / Screen.TwipsPerPixelX
Select Case lMsg
Case WM_LBUTTONUP
'MsgBox "请用鼠标右键点击图标!", vbInformation, "实时播音专家"
'单击左键,显示窗体
ShowWindow Me.hWnd, SW_RESTORE
'下面两句的目的是把窗口显示在窗口最顶层
'Me.Show
'Me.SetFocus
'' Case WM_RBUTTONUP
'' PopupMenu MenuTray '如果是在系统Tray图标上点右键,则弹出菜单MenuTray
'' Case WM_MOUSEMOVE
'' Case WM_LBUTTONDOWN
'' Case WM_LBUTTONDBLCLK
'' Case WM_RBUTTONDOWN
'' Case WM_RBUTTONDBLCLK
'' Case Else
End Select
End Sub

7、现在将程序保存起来运行看看系统托盘处是否增加了一个本工程的图标。单击此图标,Form1就自动弹出来了。
回复
hongfei_2007 2008-04-06
用系统函数
与托盘联系起来
回复
cbm6666 2008-04-04
那你就来个最简单的exe , 代码就只有放入托盘与响应托盘菜单的事件, 菜单事件中可以加上 shell一个或多个exe, 程序一打开窗体就隐藏只看得到托盘.

第二个或第三个或第N个exe 就捆绑在资源文件里面, 要用到就随时释放 shell运行.
回复
geosmancn 2008-04-04
那样的话就是要多个.exe文件了?是这个意思吗?单个exe文件肯定要同时打开主程序?
回复
geosmancn 2008-04-04
答非所问!不如瑞星?和人家比的念头我都没想过!俺不是专业人士!再说人家瑞星有人家的可取之处!
回复
显示图标的程序未必就多大了,主程序比如是100M,托盘程序可能就1K,只要能够实现shell 主程序 就行了。
回复
你不用考虑瑞星怎么做的,否则你的程序岂不是不如瑞星了

cbm666说的很正确了。
回复
geosmancn 2008-04-04
是不是要搞什么程序组才能实现?没搞过呀!很麻烦吧?
回复
geosmancn 2008-04-04
像瑞星杀毒软件那样,有一个防火墙,另外还有个防火墙主程序!
还有,托盘本来不应该占用很多资源吧?如果只是把主程序隐藏,那样不是很占资源?
托盘肯定也要.exe,那能不能一个软件有几个.exe?怎么实现?就像瑞星防火墙那样!
回复
zuoxingyu 2008-04-04
帮顶
回复
cbm6666 2008-04-04
托盘与程序是连体的, exe没打开你拿什么放托盘,你只看到托盘而没看到窗体,那是因为窗体隐藏了,

点击托盘的菜单后窗体才会出来.

回复
geosmancn 2008-04-04
TX们为什么都不进来帮顶下?俺等着呢!
回复
geosmancn 2008-04-04
TX们为什么都不进来帮顶下?俺等着呢!
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7489

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-04-04 06:37
社区公告
暂无公告