大哥们~~~~~~~~小弟有一事想请教~~~~~~~~

smallbeggar2002 2003-04-14 02:54:14
请问如果最小化以后就在任务栏的右下角
...全文
29 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenxizhou 2003-04-14
  • 打赏
  • 举报
回复
主要是Shell_NotifyIcon的使用
用户 昵称 2003-04-14
  • 打赏
  • 举报
回复
到处都是
maskzha 2003-04-14
  • 打赏
  • 举报
回复
呵呵!这样的帖子到处都是!
叶帆 2003-04-14
  • 打赏
  • 举报
回复
form_load
'保存窗体最小化前的状态
If WindowState = vbMinimized Then '窗体最小化
LastState = vbNormal '=0
Else
LastState = WindowState '取窗体的状态
End If

KeepOnTop Me

AddToTray Me '增加图标到托盘

end sub

Private Sub Form_Resize()
Select Case WindowState
Case vbMinimized '最小化
AddToTray Me '增加图标到托盘
SetTrayTip "信使" '设置新的提示信息
Me.Visible = False
Case vbMaximized '最大化
RemoveFromTray '清除托盘内的图标
Case vbNormal '正常状态
RemoveFromTray '清除托盘内的图标
Me.Left = (Screen.Width - Me.Width) / 2
Me.Top = (Screen.Height - Me.Height) / 2
End Select

If WindowState <> vbMinimized Then LastState = WindowState
End Sub

Option Explicit
Public OldWindowProc As Long '旧的窗口进程号
Public TheForm As Form '保存的窗体信息
Public strCode() As String '所保存的数据

Public LastState As Integer '窗体的状态

'将消息传答窗口函数
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'设置窗口附加内存长型数值
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'发送修改任务栏图标
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

Public Type UseData
strName As String * 32
strCode As String * 32
End Type

Public useDatas As UseData

Public Type NOTIFYICONDATA 'ICON图标数据信息
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type

Private TheData As NOTIFYICONDATA

Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1
Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal CY As Long, ByVal wFlags As Long) As Long
'窗体放在最前
Sub KeepOnTop(F As Form)
Const SWP_NOMOVE = 2
Const SWP_NOSIZE = 1

Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2

SetWindowPos F.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub


' *********************************************
' 新的窗口进程
' *********************************************
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If Msg = TRAY_CALLBACK Then

' 用户单击托盘中的图标
If lParam = WM_LBUTTONUP Then '单击左键显示窗体
'窗体状态为最小化
If TheForm.WindowState = vbMinimized Then TheForm.WindowState = LastState
TheForm.Visible = True
TheForm.SetFocus
Exit Function
End If

End If

'发送其余的消息到原先的窗口信息处理进程
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End Function
' *********************************************
' 在托盘中增加窗体的图标
' *********************************************
Public Sub AddToTray(frm As Form)
'必须在设计状态下设置ShowInTaskbar为false,因为在运行状态下该属性只读。

' 保存当前窗体和菜单信息
Set TheForm = frm

' 设置新的窗口信息处理进程 '窗口进程 '窗口进程地址
OldWindowProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)

' 设置窗体图标的信息
With TheData
.uID = 0
.hwnd = frm.hwnd
.cbSize = Len(TheData)
.hIcon = frm.Icon.Handle
.uFlags = NIF_ICON
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With

'把图标放到图盘
Shell_NotifyIcon NIM_ADD, TheData
End Sub
' *********************************************
' 删除托盘内的图标
' *********************************************
Public Sub RemoveFromTray()
'删除托盘内的图标
With TheData
.uFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData

' 恢复原来窗口信息处理进程.
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc
End Sub
' *********************************************
' 设置新的托盘图标提示
' *********************************************
Public Sub SetTrayTip(tip As String)
With TheData
.szTip = tip & vbNullChar
.uFlags = NIF_TIP
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
' *********************************************
' 设置新的托盘图标
' *********************************************
Public Sub SetTrayIcon(pic As Picture)
' 如果图片的格式不是ICON类型,则退出
If pic.Type <> vbPicTypeIcon Then Exit Sub

'更新托盘图标
With TheData
.hIcon = pic.Handle
.uFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
penper 2003-04-14
  • 打赏
  • 举报
回复
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Type NOTIFYICONDATA
cbSize As Long '------- 大小
hwnd As Long '---------句柄
uId As Long '--------标志: 增加0,修改1,删除2
uFlags As Long '-------常数&H1 or &H2 or &H4
ucallbackMessage As Long '-----常数 &H200 (表示响应mouse_move)
hIcon As Long '------图标
szTip As String * 64 ' ---提示语
End Type
Public ntcTrayData As NOTIFYICONDATA

Private Sub Form_Resize()
Select Case WindowState
Case vbMinimized
If Me.Visible Then
Me.Visible = False
Shell_NotifyIcon &H0, ntcTrayData
End If
End Select
End Sub
佛的光辉 2003-04-14
  • 打赏
  • 举报
回复
搜索一下以前的贴子,讨论过很多次了

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧