获取Windows系统托盘图标

csdnzgj828网友提供:

 

http://info.52z.com/html/24668.html

 

有网友提出,能不能在程序界面上显示当前的托盘图标,这样更直观一些。这一点我也曾想到过,也知道奥秘就在TBBUTTON这个结构体的dwData域里面,可惜这个域的结构在MSDN中没有描述。我也曾试着发送TB_GETIMAGELIST消息获取image list的句柄,然后用CImageList::FromHandle加载到CImageList中,但却都失败了。

    在csdn网友的帮助下,我弄清了dwData的结构,并据此改进了程序,下面的截图是改进版运行的画面。
    

    其实dwData有一个这样的机构,我们命名为TRAYDATA:

  1. struct TRAYDATA
  2. {
  3.     HWND hwnd;                  
  4.     UINT uID;               
  5.     UINT uCallbackMessage;      
  6.     DWORD Reserved[2];          
  7.     HICON hIcon;                //托盘图标的句柄
  8. }; 

    要获取到这个hIcon,其实很简单:

  1. //分配虚拟内存
  2. lngAddress = VirtualAllocEx(hProcess,  NULL,  sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); 
  3.   
  4. //将hProcess进程内,地址为lngAddress中的内容(大小为sizeof(TBBUTTON))获取到tb中
  5. ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress)), &tb, sizeof(TBBUTTON), 0);

  6. //将hProcess进程内,地址为tb.dwData中的内容(大小为sizeof(TRAYDATA))获取到tray中
  7. ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, sizeof(TRAYDATA), 0);

    然后就可以用tray.hIcon索引到这个图标句柄了

 

-------------------------------------------------------------------------------------

 

HWND hWnd,hWndTmp;
 unsigned long lngPID;
 long ret,lngButtons;
 HANDLE hProcess;
 LPVOID lngAddress;
 long lngTextAdr,lngHwndAdr,lngHwnd,lngButtonID;
 char strBuff[1024]={0};
 char* str = NULL;
 
 hWnd = ::FindWindow("Shell_TrayWnd", NULL);
 hWnd = ::FindWindowEx(hWnd, 0, "TrayNotifyWnd", NULL);
 hWndTmp = ::FindWindowEx(hWnd, 0, "SysPager", NULL);
 if(!hWndTmp)
  hWnd = ::FindWindowEx(hWnd, 0, "ToolbarWindow32", NULL);
 else
  hWnd = ::FindWindowEx(hWndTmp, 0, "ToolbarWindow32", NULL);
 TRACE("/nhWnd=%x/n",hWnd);
 ret = ::GetWindowThreadProcessId(hWnd, &lngPID);
 hProcess = ::OpenProcess(PROCESS_ALL_ACCESS
  |PROCESS_VM_OPERATION
  |PROCESS_VM_READ
  |PROCESS_VM_WRITE,
  0,
  lngPID);
 lngAddress = VirtualAllocEx(hProcess, 0,0x4096, MEM_COMMIT, PAGE_READWRITE);//0x02e60000
 lngButtons = ::SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
 for(int i = 0 ;i<lngButtons ;i++)
 {
  ret = ::SendMessage(hWnd,TB_GETBUTTON,i,long(lngAddress));
  
  ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 16), &lngTextAdr, 4, 0);
  if(lngTextAdr != -1)
  {
   ret = ::ReadProcessMemory(hProcess, LPVOID(lngTextAdr), strBuff, 1024, 0);
   ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12), &lngHwndAdr, 4, 0);
   ret = ::ReadProcessMemory(hProcess, LPVOID(lngHwndAdr), &lngHwnd, 4, 0);
   ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 4), &lngButtonID, 4, 0);
  }

  HWND h = (HWND)lngHwnd;
  HICON hIcon = (HICON)::SendMessage(h,WM_GETICON,ICON_SMALL,0);
  
  if(hIcon == NULL)
  {
  }
  else
  {
   ((CStatic*)GetDlgItem(IDC_STATIC1))->SetIcon(hIcon);
  }
 }
 
 ::VirtualFreeEx( hProcess, lngAddress, 0X4096, MEM_RELEASE);
 ::CloseHandle(hProcess);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值