托盘图标的任意隐藏

1、    用FindWindow函数获取ToolbarWindow32的句柄。

    lngTemp = FindWindow("Shell_TrayWnd", vbNullString)
    lngTemp = FindWindowEx(lngTemp, 0, "TrayNotifyWnd", vbNullString)
    lngTemp = FindWindowEx(lngTemp, 0, "SysPager", vbNullString)
    lngTray = FindWindowEx(lngTemp, 0, "ToolbarWindow32", vbNullString)

2、用GetWindowThreadProcessId获取ToolbarWindow32进程ID

   GetWindowThreadProcessId(lngTray, lngPID)    'lngPID返回进程ID

3、用OpenProcess打开一个已存在的进程对象

hProcess = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, lngPID)

4、用VirtualAllocEx申请内存空间

lngAddress = VirtualAllocEx(hProcess, ByVal 0&, ByVal 4096&, MEM_COMMIT, PAGE_READWRITE)

5、用SendMessage发送TB_BUTTONCOUNT消息到ToolbarWindow32,返回图标数。

lngButtons = SendMessage(lngTray, TB_BUTTONCOUNT, 0, 0)

6、用ReadProcessMemory从进程内存空间读取数据:图标标题、图标句柄、图标进程ID(注意,要有足够的权限)

For i = 0 To lngButtons - 1
        ret = SendMessage(lngTray, TB_GETBUTTON, ByVal i, ByVal lngAddress)
        ret = ReadProcessMemory(hProcess, ByVal lngAddress + 16, ByVal VarPtr(lngTextAdr), ByVal 4, ByVal 0&)
        If lngTextAdr <> -1 Then
            ret = ReadProcessMemory(hProcess, ByVal lngTextAdr, ByVal VarPtr(strBuff(0)), ByVal 1024, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngAddress + 12, ByVal VarPtr(lngHwndAdr), ByVal 4, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngHwndAdr, ByVal VarPtr(lngHwnd), ByVal 4, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngAddress + 4, ByVal VarPtr(lngButtonID), ByVal 4, ByVal 0&)
             '获取进程ID
             Call GetWindowThreadProcessId(lngHwnd, lngTbID)
          
            strText = ConverNull(strBuff)
            'lngHwnd 所属窗口handle
            'strText 托盘图标文字
            List1.AddItem lngHwnd & " - " & strText & " - 进程ID:" & lngTbID
        End If
    Next i

7、获取图标所在进程的完整路径名称

Private Declare Function GetWindowThreadProcessId Lib "user32 " (ByVal hWnd As Long, _
                                                         lpdwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "Kernel32.dll " (ByVal Handle As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll " (ByVal dwDesiredAccessas As Long, _
                                  ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll " (ByVal hProcess As Long, _
                                  ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll " (ByVal hProcess As Long, _
                                  ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
     
Const PROCESS_QUERY_INFORMATION = 1024
Const PROCESS_VM_READ = 16
Const MAX_PATH = 260

Function GetPath(ByVal hWnd As Long) As String
    Dim hProcess         As Long
    Dim ProcID             As Long
    Dim cbNeed             As Long
    Dim ModuleName     As String
    Dim nSize               As Long
    Dim lRet                 As Long
    Dim mModules(1 To 200)         As Long
    GetWindowThreadProcessId hWnd, ProcID
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcID)
    lRet = EnumProcessModules(hProcess, mModules(1), 200, cbNeed)
    If lRet <> 0 Then
          ModuleName = Space(MAX_PATH)
          nSize = 500
          lRet = GetModuleFileNameExA(hProcess, mModules(1), ModuleName, nSize)
          GetPath = Left(ModuleName, lRet)
    End If
    ret = CloseHandle(hProcess)
End Function

Private Sub Command1_Click()
    cPath = GetPath(131860) '图标HWD句柄
    Print cPath
End Sub
8、根据图标HWD句柄进行添加、删除、更改操作。


Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hicon As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As Any) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Private Type POINTAPI
    x As Long
    y As Long
End Type

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 Const NIM_ADD = 0             '添加图标
Private Const NIM_MODIFY = 1          '修改图标
Private Const NIM_DELETE = 2          '删除图标

Private Const NIF_MESSAGE = 1         '当有鼠标事件发生时产生消息
Private Const NIF_ICON = 2            '
Private Const NIF_TIP = 4             '图标有提示字符串


Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_USER = &H400
Private Const WM_NOTIFYICON = WM_USER + &H100
Private Const WM_COMMAND = &H111
Private Const WM_DESTROY = &H2
Private Const WM_DRAWITEM = &H2B
Private Const WM_INITDIALOG = &H110
Private Const WM_PAINT = &HF
Private Const WM_MENUSELECT = &H11F

Private Const GWL_WNDPROC = (-4) '替换窗口处理函数

Dim pmenu As Long
Dim submenu As Long


Function CMenu() As Boolean
'这个函数获得Form1的子菜单
Dim l As Long
Dim l1 As Long

pmenu = GetMenu(Form1.hwnd)
submenu = GetSubMenu(pmenu, 0)
If submenu Then
    CMenu = True
Else
    CMenu = False
End If
End Function
Function Icon_Del(ihwnd As Long) As Long
Dim ano As NOTIFYICONDATA
Dim l As Long

ano.hwnd = ihwnd
ano.uID = 0
ano.cbSize = Len(ano)
'删除图标
Icon_Del = Shell_NotifyIcon(NIM_DELETE, ano)
End Function
'这个函数接收图标句柄和窗口句柄并且新建图标
Function Icon_Add(ihwnd As Long, hicon As Long) As Long
Dim ano As NOTIFYICONDATA
Dim astr As String

'为图标添加提示行
astr = LTrim$(InputBox$("Input the tips you wanted to add."))
ano.szTip = astr + Chr$(0)
'设置消息接收窗口
ano.hwnd = ihwnd
ano.uID = 0
'图标有提示并且可以发送消息
ano.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
ano.hicon = hicon
ano.cbSize = Len(ano)
'将图标的回调消息设置为WM_NOTIFYICON,当在图标区域有鼠标消息,系统就会向
'消息接收窗口发送WM_NOTIFYICON消息。
ano.uCallbackMessage = WM_NOTIFYICON
Icon_Add = Shell_NotifyIcon(NIM_ADD, ano)
End Function

Function DialogProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'该函数为Form2的窗口处理函数。
Dim l As Long
Dim l1 As Long
Dim po As POINTAPI

Select Case uMsg
    Case WM_INITDIALOG
    Case WM_DESTROY
    Case WM_COMMAND
    Case WM_DRAWITEM
    Case WM_NOTIFYICON '有鼠标事件产生
      Select Case lParam
        Case WM_LBUTTONDOWN     '按下鼠标左键
          '提示是否删除图标
          l = MsgBox("Delete icon?", vbYesNo)
          If l = vbYes Then
            '删除图标同时恢复窗口处理函数
            l = Icon_Del(hwnd)
            l = SetWindowLong(Form2.hwnd, GWL_WNDPROC, lproc)
            Form1.Show
          Else
          End If
        Case WM_RBUTTONDOWN     '按下鼠标右键弹出菜单
          If submenu Then
            l = GetCursorPos(po)        '获的光标位置
            '在光标位置处弹出菜单
            l1 = TrackPopupMenu(submenu, (TPM_LEFTALIGN Or TPM_RIGHTBUTTON), po.x, po.y, 0, Form1.hwnd, vbNull)
          End If
        Case Else
      End Select
    Case Else
      DialogProc = False
End Select
DialogProc = True
End Function

Private Sub Command1_Click()
Dim ano As NOTIFYICONDATA
ano.hwnd = 131860     '图标句柄
ano.uID = 0
ano.cbSize = Len(ano)
' ano.uFlags = 0
'删除图标
Call Shell_NotifyIcon(2, ano)

End Sub

枚举托盘程序

Option Explicit

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function WriteProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long

Private Const READ_CONTROL As Long = &H20000
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const STANDARD_RIGHTS_READ As Long = (READ_CONTROL)
Private Const STANDARD_RIGHTS_EXECUTE As Long = (READ_CONTROL)
Private Const STANDARD_RIGHTS_ALL As Long = &H1F0000
Private Const STANDARD_RIGHTS_WRITE As Long = (READ_CONTROL)
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
Private Const PROCESS_TERMINATE As Long = (&H1)
Private Const WM_USER As Long = &H400


Private Const TB_BUTTONCOUNT As Long = (WM_USER + 24)
Private Const TB_HIDEBUTTON As Long = (WM_USER + 4)
Private Const TB_GETBUTTON As Long = (WM_USER + 23)
Private Const TB_GETBITMAP As Long = (WM_USER + 44)
Private Const TB_DELETEBUTTON As Long = (WM_USER + 22)
Private Const TB_ADDBUTTONS As Long = (WM_USER + 20)
Private Const TB_INSERTBUTTON As Long = (WM_USER + 21)
Private Const TB_ISBUTTONHIDDEN As Long = (WM_USER + 12)
Private Const ILD_NORMAL As Long = &H0
Private Const PROCESS_VM_OPERATION As Long = (&H8)
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const PROCESS_VM_WRITE As Long = (&H20)
Private Const MEM_RESERVE As Long = &H2000
Private Const MEM_COMMIT As Long = &H1000
Private Const MEM_RELEASE As Long = &H8000
Private Const PAGE_READWRITE As Long = &H4


Private Const SW_SHOW = 5
Private Const SW_HIDE = 0
Private Const SW_RESTORE = 9
Private Const SW_SHOWNORMAL = 1
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOWNA = 8
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_SHOWDEFAULT = 10


Private Function ConverNull(ByVal s As String) As String
    Dim nullpos As Long
    
    nullpos = InStr(s, Chr$(0))
    
    If nullpos > 0 Then
        ConverNull = Left(s, nullpos - 1)
    Else
        ConverNull = s
    End If

 

End Function
Private Sub Form_Load()

    Command1.Caption = "枚举"
    
End Sub


Private Sub Command1_Click()
Dim lngTemp As Long, lngTray As Long, lngPID As Long, lngPID2 As Long
Dim hProcess As Long, lngProcess As Long, lngAddress As Long
Dim lngCount As Long, lngButtons As Long, ret As Long
Dim lngTextAdr As Long, lngHwndAdr As Long, lngButtonID As Long
Dim hIcon As Long, lngHwnd As Long, lngTrayDC As Long
Dim lpFileName As String * 1024
Dim strBuff(1024) As Byte
Dim strText As String
Dim i As Long


    lngTemp = FindWindow("Shell_TrayWnd", vbNullString)
    lngTemp = FindWindowEx(lngTemp, 0, "TrayNotifyWnd", vbNullString)
    lngTemp = FindWindowEx(lngTemp, 0, "SysPager", vbNullString)
    lngTray = FindWindowEx(lngTemp, 0, "ToolbarWindow32", vbNullString)

    ret = GetWindowThreadProcessId(lngTray, lngPID)
    hProcess = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, lngPID)
    lngAddress = VirtualAllocEx(hProcess, ByVal 0&, ByVal 4096&, MEM_COMMIT, PAGE_READWRITE)
    lngButtons = SendMessage(lngTray, TB_BUTTONCOUNT, 0, 0)
    
    For i = 0 To lngButtons - 1
    
        ret = SendMessage(lngTray, TB_GETBUTTON, ByVal i, ByVal lngAddress)
        ret = ReadProcessMemory(hProcess, ByVal lngAddress + 16, ByVal VarPtr(lngTextAdr), ByVal 4, ByVal 0&)
        
        If lngTextAdr <> -1 Then
            ret = ReadProcessMemory(hProcess, ByVal lngTextAdr, ByVal VarPtr(strBuff(0)), ByVal 1024, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngAddress + 12, ByVal VarPtr(lngHwndAdr), ByVal 4, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngHwndAdr, ByVal VarPtr(lngHwnd), ByVal 4, ByVal 0&)
            ret = ReadProcessMemory(hProcess, ByVal lngAddress + 4, ByVal VarPtr(lngButtonID), ByVal 4, ByVal 0&)
            
            strText = ConverNull(strBuff)
            List1.AddItem lngHwnd & " - " & strText
        End If
        
    Next i
    
    VirtualFreeEx hProcess, ByVal lngAddress, ByVal 4096&, MEM_RELEASE
    CloseHandle hProcess
End Sub

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值