
托盘图标的任意隐藏.doc
8页托盘图标的任意隐藏 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 进程 IDGetWindowThreadProcessId(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 - 1ret = SendMessage(lngTray, TB_GETBUTTON, ByVal i, ByVal lngAddress)ret = ReadProcessMemory(hProcess, ByVal lngAddress + 16, ByVal VarPtr(lngTextAdr), ByVal 4, ByVal 0&)If lngTextAdr 0 ThenModuleName = Space(MAX_PATH)nSize = 500lRet = GetModuleFileNameExA(hProcess, mModules(1), ModuleName, nSize)GetPath = Left(ModuleName, lRet)End Ifret = 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 LongPrivate 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 POINTAPIx As Longy As Long End Type Private Type NOTIFYICONDATAcbSize 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 LongDim l1 As Long pmenu = GetMenu(Form1.hwnd) submenu = GetSubMenu(pmenu, 0) If submenu ThenCMenu = True ElseCMenu = 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 uMsgCase WM_INITDIALOGCase WM_DESTROYCase WM_COMMANDCase WM_DRAWITEMCase WM_NOTIFYICON '有鼠标事件产生Select Case lParamCase WM_LBUTTONDOWN '按下鼠标左键'提示是否删除图标l = MsgBox(“Delete icon?“, vbYesNo)If l = vbYes Then'删除图标同时恢复窗口处理函数l = Icon_Del(hwnd)l = SetWindowLong(Form2.hwnd, GWL_WNDPROC, lproc)Form1.ShowElseEnd IfCase WM_RBUTTONDOWN '按下鼠标右键弹出菜单If submenu Thenl = GetCursorPos(po) '获的光标位置'在光标位置处弹出菜单l1 = TrackPopupMenu(submenu, (TPM_LEFTALIGN Or TPM_RIGHTBUTTON), po.x, po.y, 0, Form1.hwnd, vbNull)End IfCase ElseEnd SelectCase ElseDialogProc = False End Sel。












