读取托盘栏图标对应进程ID

void RefreshToolBarIcons(void)
{
    m_treeview.DeleteAllItems();
    HWND hst = ::FindWindow(_T("Shell_TrayWnd"), NULL);
    if (!hst)
    {
        return;
    }
    HWND htn = ::FindWindowEx(hst, NULL, _T("TrayNotifyWnd"), NULL);
    if (!htn)
    {
        return;
    }
    HWND hsp = ::FindWindowEx(htn, NULL, _T("SysPager"), NULL);
    if (hsp)
    {
        htn = hsp;
    }
    HWND htw = ::FindWindowEx(htn, NULL, _T("ToolbarWindow32"), NULL);
    if (!htw)
    {
        return;
    }
    DWORD dwPId = 0;
    ::GetWindowThreadProcessId(htw, &dwPId);

    HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_OPERATION, FALSE, dwPId);
    if (hProcess)
    {
        HMODULE hMod = NULL;
        DWORD cbNeeded = 0;
        TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
        {
            GetModuleFileNameEx( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
        }

        HTREEITEM hRoot = m_treeview.InsertItem(TVIF_TEXT|TVIF_PARAM, _T("TrayNotify"),  0, 0, 0, 0, dwPId, TVI_ROOT, TVI_ROOT);
        //
        DWORD dwRead = 0;
        CToolBarCtrl tbCtrl = htw;
        int nBtnCount = tbCtrl.GetButtonCount();
        for (int i = 0; i < nBtnCount; ++i)
        {
            TBBUTTON tbn, pTbn;
            memset(&tbn, 0, sizeof(tbn));
            if(tbCtrl.GetButton(i, &pTbn))
            {
                if(::ReadProcessMemory(hProcess, &pTbn, &tbn, sizeof(tbn), &dwRead))
                {
                    if(tbn.iString == -1)
                    {
                        continue;
                    }
                    TCHAR szName[MAX_PATH] = _T("NoName");
                    ::ReadProcessMemory(hProcess, (void *)tbn.iString, szName, sizeof(szName)/sizeof(szName[0]), &dwRead); 
                    szName[dwRead/sizeof(szName[0])] = _T('/0');
                   
                    if(tbn.fsState&TBSTATE_HIDDEN)
                    {
                        _tcscat_s(szName, _T("[Hiden]"));
                    }
                    else
                    {
                        _tcscat_s(szName, _T("[Visible]"));
                    }
                    dwPId = -1;
                    HWND hWnd = NULL;
                    if(::ReadProcessMemory(hProcess, (void *)tbn.dwData, &hWnd, sizeof(hWnd), &dwRead))
                    {
                        ::GetWindowThreadProcessId(hWnd, &dwPId);
                        if (-1 != dwPId)
                        {
                            m_treeview.InsertItem(TVIF_TEXT|TVIF_PARAM, szName, 0, 0, 0, 0, dwPId, hRoot, TVI_LAST);
                        }
                    }
                }
            }
        }
        ::CloseHandle(hProcess);
        m_treeview.Expand(hRoot);
    }   
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值