请教一个删除托盘图标的问题

cenge455 2015-10-16 02:33:56
软件系统分了前台显示和后台计算两个部分,当前台根据相关判断,认为后台程序需要重新启动时,将后台程序关闭再重启。由于后台程序是隐藏到托盘的,所以关闭后台程序的同时需要删除其图标。
目前我的处理方式是这样的:1.根据程序名称获取进程ID,2。通过进程ID获取后台的主窗体句柄。3.通过窗体句柄删除其托盘图标。
删除方法如下:
'删除程序的托盘图标
Sub EdlDel(ByVal hWnd As Long)

With MyNotify
.uId = 0
.uFlags = NIF_ICON
.cbSize = Len(MyNotify)
.hWnd = hWnd 'frm.HWnd 是程序主窗体的句柄
End With

Shell_NotifyIcon NIM_DELETE, MyNotify
End Sub

上述方法,在后台程序的退出代码里使用me.hwnd获取其句柄删除图标是可行的,可是通过前台程序怎么就不行了呢?
...全文
162 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenge455 2015-11-12
  • 打赏
  • 举报
回复
通过给后台进程打日志,发现这样一个现象:后台程序启动后,Main函数中调用frm_main.hide,将后台程序隐藏,此时,日志中记录的句柄,与前台程序通过进程ID获取的句柄不一致。但是,如果在前台程序开始检查后台程序之前将后台程序调出显示一次,不管是后台程序一直显示或者重新隐藏到托盘,这时前台程序通过进程ID得到的句柄是与日志记录中的句柄一致的,可以正常将后台程序的托盘图标删除。
Tiger_Zhao 2015-10-28
  • 打赏
  • 举报
回复
还是那句话:能够响应就走前后台的通讯。
cenge455 2015-10-27
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
这不是扯谈么! 如果后台不能响应了,就算你正确调用 Shell_NotifyIcon 它一样没响应啊!
不急不急,咱先解决一下可以响应的情况下调用Shell_NotifyIcon的问题
Tiger_Zhao 2015-10-26
  • 打赏
  • 举报
回复
这不是扯谈么!
如果后台不能响应了,就算你正确调用 Shell_NotifyIcon 它一样没响应啊!
cenge455 2015-10-25
  • 打赏
  • 举报
回复
@Tiger_Zhao 目前是在无法确认后台计算的程序是否能正常响应,才需要做的强制关闭。前台程序做通知的话后台可能是没法接收了 @zhao4zhong1 有很大的可能就是句柄不一样,但是我的后台程序就一个主窗体的,根据后台进程ID获取其主窗体的句柄方法如下:
'根据句柄获取进程ID
Function ProcIDFromWnd(ByVal hWnd As Long) As Long
    
Dim idProc As Long

    GetWindowThreadProcessId hWnd, idProc
    ProcIDFromWnd = idProc
    
End Function
'根据程序进程ID获取程序的主窗口句柄
Function GetWndHandleFromProcID(ByVal idProc As Long) As Long

Dim hWnd As Long

    hWnd = FindWindow(vbNullString, vbNullString)
    
    Do Until hWnd = 0
        '检查是否具有父窗体
       If GetParent(hWnd) = 0 Then
            '匹配进程ID,符合则返回窗体的句柄
            If idProc = ProcIDFromWnd(hWnd) Then
                GetWndHandleFromProcID = hWnd
                Exit Do
            End If
       End If
       hWnd = GetWindow(hWnd, GW_HWNDNEXT)
    Loop
End Function
遍历所有当前的窗口句柄,如果句柄无父窗体句柄,则根据其句柄得其进程ID与后台的进程ID比较,一致则认为该句柄为后台进程的主窗体句柄。难道在后台程序中加载托盘图标时用的me.hWnd和该方法得到的句柄会不一样?错在了哪个环节呢?
Tiger_Zhao 2015-10-19
  • 打赏
  • 举报
回复
前后台的通讯中加个命令,前台通知后台,让后台自己关闭、删除托盘图标。
赵4老师 2015-10-19
  • 打赏
  • 举报
回复
句柄不一样。我猜。

1,488

社区成员

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

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