急问:API函数Shell_NotifyIcon的使用问题!!!!!

cemma 2005-02-25 02:46:47
我在使用Shell_NotifyIcon时发现删除图标总是失败,图标总是无法由应用程序去除。

全局的模块变量声明有:
Public NIM_data As NOTIFYICONDATA

窗口LOAD事件中初始化NIM_data并执行Shell_NotifyIcon成功添加图标。

窗口TERMINATE事件中为如下代码:
NIM_data.uFlags = 0&
NIM_data.cbSize = Len(NIM_data)
lngReturn = Shell_NotifyIcon(NIM_DELETE, NIM_data)
发现返回值lngReturn为0,但GETLASTERROR返回0。

程序的其他代码部分没有修改NIM_data。

我查看MSDN样例程序,不见我的程序有什么异常。
请问什么原因导致Shell_NotifyIcon(NIM_DELETE, NIM_data)失败。



...全文
220 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugouku 2005-02-25
  • 打赏
  • 举报
回复
'给一个完整的添加图标到任务栏的类模块
' To use on form:
' Public myTrayIcon As New clsSysTrayIcon
' myTrayIcon.RemoveIcon Me
' myTrayIcon.ShowIcon Me
' myTrayIcon.ChangeIcon Me, (Image, Picture Box, Etc)
' myTrayIcon.ChangeToolTip Me, InputBox("Enter Tool Tip")
'
' ****** Tray Menu Source ****** (Drop In Form)
'
'Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
' Remember..... The value of X will be different if the icon is minimised
' to the system tray. The values in this case will be as follows,
' 7680 ' MouseMove
' 7695 ' Left MouseDown
' 7710 ' Left MouseUp
' 7725 ' Left DoubleClick
' 7740 ' Right MouseDown
' 7755 ' Right MouseUp
' 7770 ' Right DoubleClick
'If myTrayIcon.bRunningInTray Then 'Check to see if form is in the system tray
' Select Case X 'If it is, use X to get message value
' Case 7710: PopupMenu Me.mnuBar1, vbPopupMenuRightButton 'Show a menubar
' Case 7725: myTrayIcon.RemoveIcon Me
' End Select
'End If
'
'End Sub

Option Explicit

Private Type NOTIFYICONDATA
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 FormHandle As Long
Private mvarbRunningInTray As Boolean
Private SysIcon As NOTIFYICONDATA
Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Private Property Let bRunningInTray(ByVal vData As Boolean)
mvarbRunningInTray = vData
End Property


Property Get bRunningInTray() As Boolean
bRunningInTray = mvarbRunningInTray
End Property

Public Sub ShowIcon(ByRef sysTrayForm As Form)
SysIcon.cbSize = Len(SysIcon)
SysIcon.hwnd = sysTrayForm.hwnd
SysIcon.uId = vbNull
SysIcon.uFlags = 7
SysIcon.ucallbackMessage = 512
SysIcon.hIcon = sysTrayForm.Icon
SysIcon.szTip = sysTrayForm.Caption + Chr(0)
Shell_NotifyIcon 0, SysIcon
mvarbRunningInTray = True
End Sub

Public Sub RemoveIcon(sysTrayForm As Form)
SysIcon.cbSize = Len(SysIcon)
SysIcon.hwnd = sysTrayForm.hwnd
SysIcon.uId = vbNull
SysIcon.uFlags = 7
SysIcon.ucallbackMessage = vbNull
SysIcon.hIcon = sysTrayForm.Icon
SysIcon.szTip = Chr(0)
Shell_NotifyIcon 2, SysIcon
'If sysTrayForm.Visible = False Then sysTrayForm.Show 'Incase user can't see form
mvarbRunningInTray = False
End Sub

Public Sub ChangeIcon(sysTrayForm As Form, picNewIcon As ListImage)

If mvarbRunningInTray = True Then 'If running in the tray
SysIcon.cbSize = Len(SysIcon)
SysIcon.hwnd = sysTrayForm.hwnd
'SysIcon.uId = vbNull
'SysIcon.uFlags = 7
'SysIcon.ucallbackMessage = 512
SysIcon.hIcon = picNewIcon.Picture
'SysIcon.szTip = sysTrayForm.Caption + Chr(0)
Shell_NotifyIcon 1, SysIcon
End If

End Sub

Public Sub ChangeToolTip(sysTrayForm As Form, strNewTip As String)

If mvarbRunningInTray = True Then 'If running in the tray
SysIcon.cbSize = Len(SysIcon)
SysIcon.hwnd = sysTrayForm.hwnd
SysIcon.szTip = strNewTip & Chr(0)
Shell_NotifyIcon 1, SysIcon
End If

End Sub
cemma 2005-02-25
  • 打赏
  • 举报
回复
谢谢,我也发现了,
现在写在UNLOAD事件里,就不报错了,
zyl910 2005-02-25
  • 打赏
  • 举报
回复
TERMINATE事件是VB类析构事件
此时窗口已经卸载了
导致Shell_NotifyIcon因为无效窗口句柄而报错

应该写在Unload事件中
zyl910 2005-02-25
  • 打赏
  • 举报
回复
hwnd和id填好没有
CODE:// 结构内存用0初使化 - 注意: 一些Windows函数要求这么做,不过我记不得哪些需要,哪些不需要了:) NOTIFYICONDATA niData; ZeroMemory(&niData,sizeof(NOTIFYICONDATA));// 得到Shell32的版本号,并依此设置结构成员cbSize的大小 - 注意:MSDN文档中关于这部分的说明有点模糊不清(见本文后面),所以我并不确定下面的代码是否完全正确 ULONGLONG ullVersion = GetDllVersion(_T("Shell32.dll")); if(ullVersion >= MAKEDLLVERULL(6,0,0,0)) niData.cbSize = sizeof(NOTIFYICONDATA); else if(ullVersion >= MAKEDLLVERULL(5,0,0,0)) niData.cbSize = NOTIFYICONDATA_V2_SIZE; else niData.cbSize = NOTIFYICONDATA_V1_SIZE;// 结构成员uID可以是任何UINT值,这个ID用来标志你的托盘图标,Shell_NotifyIcon函数后面将会用到这个值 niData.uID = MY_TRAY_ICON_ID;// 结构成员uFlags指出哪些结构成员是有效的。此处也可以设置提示窗口的样式,如冒泡提示:NIF_INFO niData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;// 装载图标。 - 注意:调用完函数Shell_NotifyIcon后应销毁该图标。 niData.hIcon = (HICON)LoadImage( hInstance, MAKEINTRESOURCE(IDI_MY_ICON), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);// 设置接收托盘事件消息的窗口句柄。 niData.hWnd = hWnd;// 设置发送消息值。- 注意:消息值的大小应该在WM_APP和0xBFFF之间 niData.uCallbackMessage = MY_TRAY_ICON_MESSAGE;

7,785

社区成员

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

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