关于枚举任务栏托盘里的图标
我想判断某个图标是否在“任务栏托盘”里出现,有什么好办法吗?
谢谢了! 

解决方案 »

  1.   

    试试发送工具条控件的消息(TB_XXXX)到托盘区域看
      

  2.   

    可以通过图标代表的程序,列举进程中的应用程序用Api来判断!
      

  3.   

    参考:
    何通过托盘图标得到该所属进程
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207497
      

  4.   

    谢谢 balloonman2002
    我去看看
      

  5.   

    VB中获得托盘图标文字、所属窗口handle
    lngTemp = FindWindow("Shell_TrayWnd", vbNullString)
        lngTemp = FindWindowEx(lngTemp, 0, "TrayNotifyWnd", vbNullString)
        lngTemp = FindWindowEx(lngTemp, 0, "SysPager", vbNullString)
        lngTray = FindWindowEx(lngTemp, 0, "ToolbarWindow32", vbNullString)
        Debug.Print "lngTray="; lngTray
        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)
                'lngHwnd 所属窗口handle
                'strText 托盘图标文字
            End If
        Next i
        VirtualFreeEx hProcess, ByVal lngAddress, ByVal 4096&, MEM_RELEASE
        CloseHandle hProcess
      

  6.   

    感谢 kmlxk
    我试试能否看懂,谢谢了
      

  7.   

    回复 kmlxk
    有些不明白:"OpenProcess" 等过程要怎么声明呢,谢谢了。
    可以找到完整的代码或源程序吗。
      

  8.   

    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 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 Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate 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 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 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 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
      

  9.   

    感谢 kmlxk
    我试试看,不懂又请教你。
      

  10.   

    感谢 kmlxk
    我的基础实在是差了,原来只会用VBS写一些脚本,现在看这些VB代码,好多地方看不懂,研究了几天,还是没有搞明白,例如“strBuff”这些又该怎么来声明或定义呢?
    要是能有完整的源代码就好了。
      

  11.   

    完整的源代码http://www.blogchinese.com/user1/36039/archives/2005/118870.shtml
      

  12.   

    啊。。居然没有看到,还傻傻的TOP一次。
    非常感谢 kmlxk 提供的源代码,真的非常感谢。