VC 获取托盘图标信息

 

http://blog.csdn.net/hzy694358/article/details/7400284

 

 

//本例以获取程序托盘图标位置为例

//根据需要还可以获取不少信息

参考:http://www.cnblogs.com/daxingxing/archive/2012/02/06/2340384.html

 

  1. //获取托盘区域数据  
  2. RECT CTray::GetTrayRect() 
  3.     RECT rect = {0}; 
  4.     HWND hWnd = NULL; 
  5.  
  6.     hWnd = FindTrayWnd(); 
  7.     if (hWnd != NULL) 
  8.     { 
  9.         if (!EnumNotifyWindow(rect,hWnd))//如果没在普通托盘区  
  10.         { 
  11.             hWnd = FindNotifyIconOverflowWindow();//在溢出区(win7)  
  12.             if (hWnd != NULL) 
  13.             { 
  14.                 EnumNotifyWindow(rect,hWnd); 
  15.             } 
  16.         } 
  17.     } 
  18.  
  19.     return rect; 
  20. //枚举获取托盘区域位置  
  21. bool CTray::EnumNotifyWindow(RECT &rect,HWND hWnd) 
  22.     //RECT rect = {0};  
  23.     bool bSuc = false
  24.     unsigned long lngPID = 0; 
  25.     long ret = 0,lngButtons = 0; 
  26.     long lngHwndAdr = 0,lngHwnd = 0;//,lngTextAdr,lngButtonID;  
  27.     HANDLE hProcess = NULL; 
  28.     LPVOID lngAddress = NULL,lngRect = NULL; 
  29.  
  30.     if (hWnd != NULL) 
  31.     { 
  32.         ret = GetWindowThreadProcessId(hWnd, &lngPID); 
  33.         if(ret != 0 && lngPID != 0) 
  34.         { 
  35.             hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID);//  
  36.             if (hProcess != NULL) 
  37.             { 
  38.                 lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE); 
  39.                 lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE); 
  40.                 lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0); //发送消息获取托盘button数量  
  41.                 if (lngAddress != NULL  && lngRect != NULL) 
  42.                 { 
  43.                     for(int i=0 ;i< lngButtons;i++) 
  44.                     { 
  45.                         RECT rc = {0};  
  46.                         int j = i; 
  47.                         ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));//发送消息获取托盘项数据起始地址  
  48.                         ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0); 
  49.                         if(ret != 0 && lngHwndAdr != -1) 
  50.                         { 
  51.                             ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);//获取句柄  
  52.                             if(ret != 0 && (HWND)lngHwnd == m_NotifyIconData.hWnd)//  
  53.                             { 
  54.                                 ret = ::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect); //发送消息获取托盘项区域数据  
  55.                                 ret = ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0);  //读取托盘区域数据  
  56.                                 if(ret != 0) 
  57.                                 { 
  58.                                     CWnd::FromHandle(hWnd)->ClientToScreen(&rc); 
  59.                                     rect = rc; 
  60.                                 } 
  61.                                 bSuc = true;//在普通托盘区找到,在溢出区不再查找  
  62.                                 break
  63.                             } 
  64.                         } 
  65.                     }  
  66.                 } 
  67.                 if (lngAddress != NULL) 
  68.                 { 
  69.                     VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT); 
  70.                     VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE); 
  71.                 } 
  72.                 if (lngRect != NULL) 
  73.                 { 
  74.                     VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT); 
  75.                     VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE); 
  76.                 } 
  77.                 CloseHandle(hProcess); 
  78.             } 
  79.         } 
  80.     } 
  81.     return bSuc; 
  82. //获取普通托盘区窗口句柄  
  83. HWND CTray::FindTrayWnd() 
  84.     HWND hWnd = NULL; 
  85.     HWND hWndPaper = NULL; 
  86.  
  87.     if ((hWnd = FindWindow(_T("Shell_TrayWnd"), NULL)) != NULL) 
  88.     { 
  89.         if ((hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL)) != NULL) 
  90.         { 
  91.             hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL); 
  92.             if(!hWndPaper) 
  93.                 hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL); 
  94.             else 
  95.                 hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL); 
  96.         } 
  97.     } 
  98.  
  99.     return hWnd; 
  100. //获取溢出托盘区窗口句柄  
  101. HWND CTray::FindNotifyIconOverflowWindow() 
  102.     HWND hWnd = NULL; 
  103.  
  104.     hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL); 
  105.     if (hWnd != NULL) 
  106.     { 
  107.         hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL); 
  108.     } 
  109.      
  110.     return hWnd; 
//获取托盘区域数据
RECT CTray::GetTrayRect()
{
	RECT rect = {0};
	HWND hWnd = NULL;

	hWnd = FindTrayWnd();
	if (hWnd != NULL)
	{
		if (!EnumNotifyWindow(rect,hWnd))//如果没在普通托盘区
		{
			hWnd = FindNotifyIconOverflowWindow();//在溢出区(win7)
			if (hWnd != NULL)
			{
				EnumNotifyWindow(rect,hWnd);
			}
		}
	}

	return rect;
}
//枚举获取托盘区域位置
bool CTray::EnumNotifyWindow(RECT &rect,HWND hWnd)
{
	//RECT rect = {0};
	bool bSuc = false;
	unsigned long lngPID = 0;
	long ret = 0,lngButtons = 0;
	long lngHwndAdr = 0,lngHwnd = 0;//,lngTextAdr,lngButtonID;
	HANDLE hProcess = NULL;
	LPVOID lngAddress = NULL,lngRect = NULL;

	if (hWnd != NULL)
	{
		ret = GetWindowThreadProcessId(hWnd, &lngPID);
		if(ret != 0 && lngPID != 0)
		{
			hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID);//
			if (hProcess != NULL)
			{
				lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE);
				lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);
				lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0); //发送消息获取托盘button数量
				if (lngAddress != NULL  && lngRect != NULL)
				{
					for(int i=0 ;i< lngButtons;i++)
					{
						RECT rc = {0}; 
						int j = i;
						ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress));//发送消息获取托盘项数据起始地址
						ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0);
						if(ret != 0 && lngHwndAdr != -1)
						{
							ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);//获取句柄
							if(ret != 0 && (HWND)lngHwnd == m_NotifyIconData.hWnd)//
							{
								ret = ::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect); //发送消息获取托盘项区域数据
								ret = ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0);  //读取托盘区域数据
								if(ret != 0)
								{
									CWnd::FromHandle(hWnd)->ClientToScreen(&rc);
									rect = rc;
								}
								bSuc = true;//在普通托盘区找到,在溢出区不再查找
								break;
							}
						}
					} 
				}
				if (lngAddress != NULL)
				{
					VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);
					VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);
				}
				if (lngRect != NULL)
				{
					VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);
					VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);
				}
				CloseHandle(hProcess);
			}
		}
	}
	return bSuc;
}
//获取普通托盘区窗口句柄
HWND CTray::FindTrayWnd()
{
	HWND hWnd = NULL;
	HWND hWndPaper = NULL;

	if ((hWnd = FindWindow(_T("Shell_TrayWnd"), NULL)) != NULL)
	{
		if ((hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL)) != NULL)
		{
			hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);
			if(!hWndPaper)
				hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);
			else
				hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);
		}
	}

	return hWnd;
}
//获取溢出托盘区窗口句柄
HWND CTray::FindNotifyIconOverflowWindow()
{
	HWND hWnd = NULL;

	hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);
	if (hWnd != NULL)
	{
		hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);
	}
	
	return hWnd;
}

 

//以下代码网上收集的,变量 初始化 指针句柄 及函数是否成功都没判定

//需要的自己加下判定,有时间再改了

 

  1. struct TRAYDATA 
  2.     HWND hwnd;                                
  3.     UINT uID;                                
  4.     UINT uCallbackMessage;        
  5.     DWORD Reserved[2];                
  6.     HICON hIcon;                                
  7. }; 
  8. void CTray::GetTrayRect() 
  9. HWND hWnd,hWndPaper; 
  10. unsigned long lngPID; 
  11. long ret,lngButtons; 
  12. HANDLE hProcess; 
  13. LPVOID lngAddress; 
  14. long lngTextAdr,lngHwndAdr,lngHwnd,lngButtonID; 
  15. TCHAR strBuff[1024]={0}; 
  16.   TRAYDATA trayData = {0}; 
  17.   TBBUTTON btnData={0}; 
  18.  
  19.  
  20. hWnd = FindWindow(_T("Shell_TrayWnd"), NULL); 
  21. hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL); 
  22. hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL); 
  23. if(!hWndPaper) 
  24. hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL); 
  25. else 
  26. hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL); 
  27. ret = GetWindowThreadProcessId(hWnd, &lngPID); 
  28. hProcess = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,0,lngPID); 
  29. lngAddress = VirtualAllocEx(hProcess,0, 0x4096, MEM_COMMIT, PAGE_READWRITE); 
  30. lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);                       
  31. RECT rc; POINT point; 
  32. LPVOID lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE); 
  33.  
  34. CRect rect; 
  35. for(int i=0 ;i< lngButtons;i++) 
  36. int j = i; 
  37. ret = SendMessage(hWnd,TB_GETBUTTON,j,long(lngAddress)); 
  38. ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 16),&lngTextAdr,4,0); 
  39. if(lngTextAdr != -1) 
  40. ret = ReadProcessMemory(hProcess, LPVOID(lngTextAdr),strBuff,1024,0); 
  41. //ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 12),&lngHwndAdr,4,0); //获取句柄  
  42. //ret = ReadProcessMemory(hProcess, LPVOID(lngHwndAdr),&lngHwnd, 4,0);  
  43. //ret = ReadProcessMemory(hProcess, LPVOID(long(lngAddress) + 4),&lngButtonID,4,0);//获取buttonID  
  44. CString str(strBuff); 
  45. if (str.Compare(m_NotifyIconData.szTip) == 0) 
  46. ::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect); 
  47. ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0);  //获取托盘图标区域  
  48. CWnd::FromHandle(hWnd)->ClientToScreen(&rc); 
  49.  
  50. //以下是隐藏托盘图标  
  51. //    {  
  52. //    if(show)  
  53. //    {  
  54. //    SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,0);  
  55. //    }  
  56. //    else  
  57. //    {   
  58. //    SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,1);  
  59. //    }  
  60. //    }  
  61.  
  62.  
  63. VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT); 
  64. VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE); 
  65. VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT); 
  66. VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE); 
  67. CloseHandle(hProcess); 
struct TRAYDATA
{
    HWND hwnd;                               
    UINT uID;                               
    UINT uCallbackMessage;       
    DWORD Reserved[2];               
    HICON hIcon;                               
};
void CTray::GetTrayRect()
{
HWND hWnd,hWndPaper;
unsigned long lngPID;
long ret,lngButtons;
HANDLE hProcess;
LPVOID lngAddress;
long lngTextAdr,lngHwndAdr,lngHwnd,lngButtonID;
TCHAR strBuff[1024]={0};
  TRAYDATA trayData = {0};
  TBBUTTON btnData={0};


hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
hWnd = FindWindowEx(hWnd, 0, _T("TrayNotifyWnd"), NULL);
hWndPaper = FindWindowEx(hWnd, 0, _T("SysPager"), NULL);
if(!hWndPaper)
hWnd = FindWindowEx(hWnd, 0, _T("ToolbarWindow32"), NULL);
else
hWnd = FindWindowEx(hWndPaper, 0, _T("ToolbarWindow32"), NULL);
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);
lngButtons = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);                      
RECT rc; POINT point;
LPVOID lngRect = VirtualAllocEx(hProcess,0,sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);

CRect rect;
for(int i=0 ;i< lngButtons;i++)
{
int j = i;
ret = SendMessage(hWnd,TB_GETBUTTON,j,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);//获取buttonID
CString str(strBuff);
if (str.Compare(m_NotifyIconData.szTip) == 0)
{
::SendMessage(hWnd,TB_GETITEMRECT,(WPARAM)j,(LPARAM)lngRect);
ReadProcessMemory(hProcess,lngRect,&rc, sizeof(rc),0);  //获取托盘图标区域
CWnd::FromHandle(hWnd)->ClientToScreen(&rc);
}

//以下是隐藏托盘图标
//    {
//    if(show)
//    {
//    SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,0);
//    }
//    else
//    { 
//    SendMessage(hWnd,TB_HIDEBUTTON,lngButtonID,1);
//    }
//    }


}
}
VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngAddress, 0, MEM_RELEASE);
VirtualFreeEx( hProcess, lngRect, sizeof(RECT), MEM_DECOMMIT);
VirtualFreeEx( hProcess, lngRect, 0, MEM_RELEASE);
CloseHandle(hProcess);
}

 

//另一例子

 

  1. VOID StartStorm() 
  2.          HWND hMain = FindWindow("animate_layered_window_class", "暴风媒体中心"); 
  3.          if ( hMain ) 
  4.          { 
  5.                  ShowWindow(hMain, SW_HIDE); 
  6.          } 
  7.          
  8.         
  9.         //得到工具栏句柄  
  10.      HWND hTray = FindWindow("Shell_TrayWnd", NULL); 
  11.      hTray = FindWindowEx(hTray, 0, "TrayNotifyWnd", NULL); 
  12.      hTray = FindWindowEx(hTray, 0, "SysPager", NULL); 
  13.      hTray = FindWindowEx(hTray, 0, "ToolbarWindow32", NULL); 
  14.          
  15.         //获取explore进程ID  
  16.          DWORD TrayPid; 
  17.          GetWindowThreadProcessId(hTray, &TrayPid); 
  18.          
  19.         //打开进程 并且开辟进程空间  
  20.          RECT rect; 
  21.          TBBUTTON tb; 
  22.          TBBUTTON pTb; 
  23.          LPVOID lpAddr; 
  24.          DWORD dwThreadIdOfICO; 
  25.          DWORD dwTempId = FindStorm("Stormtray.exe"); //你要点击的进程的PID  
  26.          
  27.          TRAYDATA traydata; 
  28.          
  29.         HANDLE hOpen = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TrayPid); 
  30.          lpAddr = VirtualAllocEx(hOpen, NULL, sizeof(tb) + sizeof(rect), MEM_COMMIT, PAGE_READWRITE); 
  31.          
  32.         int nCount = SendMessage(hTray, TB_BUTTONCOUNT, 0, 0); 
  33.          int i; 
  34.          DWORD dwOutWrite; 
  35.          for ( i = 0; i < nCount; i ++) 
  36.          { 
  37.                  ZeroMemory(&tb, sizeof(tb)); 
  38.                  ZeroMemory(&rect, sizeof(rect)); 
  39.                  //把参数写进目标进程  
  40.                  WriteProcessMemory(hOpen, lpAddr, &tb, sizeof(tb), &dwOutWrite); 
  41.                  //WriteProcessMemory(hOpen, (LPVOID)((DWORD)lpAddr + sizeof(pTb)), &rect, sizeof(rect), &dwOutWrite);  
  42.                  //获取BUTTON  
  43.                  SendMessage(hTray, TB_GETBUTTON, i, LPARAM(lpAddr)); 
  44.                  //读取TBBUTTON结构  
  45.                  ReadProcessMemory(hOpen, lpAddr, &pTb, sizeof(TBBUTTON), &dwOutWrite); 
  46.                  //读取TRAYDATA结构  
  47.                  ReadProcessMemory(hOpen, (LPVOID)pTb.dwData, &traydata, sizeof(TRAYDATA), &dwOutWrite); 
  48.                  
  49.                  GetWindowThreadProcessId(traydata.hwnd, &dwThreadIdOfICO); 
  50.                  if ( dwThreadIdOfICO == dwTempId ) 
  51.                  { 
  52.                          //获取ICO的RECT  
  53.                          LPVOID lp = (LPVOID)((DWORD)lpAddr + sizeof(pTb)); 
  54.                          SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)lp); 
  55.                          LPVOID lpdata = (LPVOID)((DWORD)lpAddr + sizeof(TBBUTTON)); 
  56.                          ReadProcessMemory(hOpen, lpdata, &rect, sizeof(rect), &dwOutWrite); 
  57.                          int iGap = rect.right/2; //得到图标的中间坐标的间隔  
  58.                          //点击  
  59.                          SendMessage(hTray, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.right - iGap, rect.bottom - iGap)); 
  60.                          SendMessage(hTray, WM_LBUTTONUP, 0, MAKELPARAM(rect.right - iGap, rect.bottom - iGap)); 
  61.                          //  
  62.                          CloseHandle(hOpen); 
  63.                          break;; 
  64.                  } 
  65.          } 
  66.          
VOID StartStorm()
{
         HWND hMain = FindWindow("animate_layered_window_class", "暴风媒体中心");
         if ( hMain )
         {
                 ShowWindow(hMain, SW_HIDE);
         }
        
       
        //得到工具栏句柄
     HWND hTray = FindWindow("Shell_TrayWnd", NULL);
     hTray = FindWindowEx(hTray, 0, "TrayNotifyWnd", NULL);
     hTray = FindWindowEx(hTray, 0, "SysPager", NULL);
     hTray = FindWindowEx(hTray, 0, "ToolbarWindow32", NULL);
        
        //获取explore进程ID
         DWORD TrayPid;
         GetWindowThreadProcessId(hTray, &TrayPid);
        
        //打开进程 并且开辟进程空间
         RECT rect;
         TBBUTTON tb;
         TBBUTTON pTb;
         LPVOID lpAddr;
         DWORD dwThreadIdOfICO;
         DWORD dwTempId = FindStorm("Stormtray.exe"); //你要点击的进程的PID
        
         TRAYDATA traydata;
        
        HANDLE hOpen = OpenProcess(PROCESS_ALL_ACCESS, FALSE, TrayPid);
         lpAddr = VirtualAllocEx(hOpen, NULL, sizeof(tb) + sizeof(rect), MEM_COMMIT, PAGE_READWRITE);
        
        int nCount = SendMessage(hTray, TB_BUTTONCOUNT, 0, 0);
         int i;
         DWORD dwOutWrite;
         for ( i = 0; i < nCount; i ++)
         {
                 ZeroMemory(&tb, sizeof(tb));
                 ZeroMemory(&rect, sizeof(rect));
                 //把参数写进目标进程
                 WriteProcessMemory(hOpen, lpAddr, &tb, sizeof(tb), &dwOutWrite);
                 //WriteProcessMemory(hOpen, (LPVOID)((DWORD)lpAddr + sizeof(pTb)), &rect, sizeof(rect), &dwOutWrite);
                 //获取BUTTON
                 SendMessage(hTray, TB_GETBUTTON, i, LPARAM(lpAddr));
                 //读取TBBUTTON结构
                 ReadProcessMemory(hOpen, lpAddr, &pTb, sizeof(TBBUTTON), &dwOutWrite);
                 //读取TRAYDATA结构
                 ReadProcessMemory(hOpen, (LPVOID)pTb.dwData, &traydata, sizeof(TRAYDATA), &dwOutWrite);
                
                 GetWindowThreadProcessId(traydata.hwnd, &dwThreadIdOfICO);
                 if ( dwThreadIdOfICO == dwTempId )
                 {
                         //获取ICO的RECT
                         LPVOID lp = (LPVOID)((DWORD)lpAddr + sizeof(pTb));
                         SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)lp);
                         LPVOID lpdata = (LPVOID)((DWORD)lpAddr + sizeof(TBBUTTON));
                         ReadProcessMemory(hOpen, lpdata, &rect, sizeof(rect), &dwOutWrite);
                         int iGap = rect.right/2; //得到图标的中间坐标的间隔
                         //点击
                         SendMessage(hTray, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
                         SendMessage(hTray, WM_LBUTTONUP, 0, MAKELPARAM(rect.right - iGap, rect.bottom - iGap));
                         //
                         CloseHandle(hOpen);
                         break;;
                 }
         }
        
}

 

//win7有一个溢出托盘区:以下是隐藏在托盘区中的托盘信息,用以上的方法找不到,因为在NotifyIconOverflowWindow里

Fhwnd = FindWindow("NotifyIconOverflowWindow", NULL)

参考文章:http://topic.csdn.net/u/20101003/23/859851ee-5aa1-4476-8ce1-1359826df2b0.html

 

  1. #include "stdafx.h"  
  2. #include <afx.h>  
  3. #include <locale.h>  
  4. #include <string>  
  5. usingnamespace std; 
  6.  
  7.  
  8.  
  9. typedefBOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
  10.  
  11. BOOL IsWow64() 
  12.     BOOL bIsWow64 = FALSE; 
  13.  
  14.     LPFN_ISWOW64PROCESS  
  15.         fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( 
  16.         GetModuleHandle(_T("kernel32")),"IsWow64Process"); 
  17.  
  18.     if (NULL != fnIsWow64Process) 
  19.     { 
  20.         if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) 
  21.         { 
  22.             // handle error  
  23.         } 
  24.     } 
  25.     return bIsWow64; 
  26.  
  27.  
  28. HWND FindTrayWnd() 
  29.     HWND hWnd = NULL; 
  30.      
  31.     hWnd = FindWindow(_T("Shell_TrayWnd"), NULL); 
  32.     hWnd = FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"), NULL); 
  33.     hWnd = FindWindowEx(hWnd, NULL, _T("SysPager"), NULL); 
  34.     hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL); 
  35.  
  36.  
  37.     return hWnd; 
  38.  
  39. HWND FindNotifyIconOverflowWindow() 
  40.     HWND hWnd = NULL; 
  41.  
  42.     hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL); 
  43.     hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL); 
  44.  
  45.     return hWnd; 
  46.  
  47. void EnumNotifyWindow(HWND hWnd) 
  48.     DWORD dwProcessId = 0; 
  49.     GetWindowThreadProcessId(hWnd,&dwProcessId); 
  50.  
  51.     HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId); 
  52.     if ( hProcess==NULL ){ 
  53.         return
  54.     } 
  55.     LPVOID lAddress = VirtualAllocEx(hProcess, 0, 4096, MEM_COMMIT, PAGE_READWRITE); 
  56.     if ( lAddress==NULL ){ 
  57.         return
  58.     } 
  59.     DWORD lTextAdr = 0; 
  60.     BYTE buff[1024] = {0}; 
  61.     CString strFilePath; 
  62.     CString strTile; 
  63.     HWND hMainWnd = NULL; 
  64.     int nDataOffset = sizeof(TBBUTTON) - sizeof(INT_PTR) - sizeof(DWORD_PTR); 
  65.     int nStrOffset = 18;  
  66.     if ( IsWow64() ){ 
  67.         nDataOffset+=4; 
  68.         nStrOffset+=6; 
  69.     } 
  70.  
  71.     //得到圖標個數  
  72.     int lButton = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0); 
  73.     for (int i = 0; i < lButton; i++) { 
  74.         SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)lAddress); 
  75.         //讀文本地址  
  76.         ReadProcessMemory(hProcess, (LPVOID)((DWORD)lAddress + nDataOffset), &lTextAdr, 4, 0); 
  77.         if ( lTextAdr!=-1 ) { 
  78.             //讀文本  
  79.             ReadProcessMemory(hProcess, (LPCVOID)lTextAdr, buff, 1024, 0); 
  80.             hMainWnd = (HWND)(*((DWORD*)buff)); 
  81.             strFilePath = (WCHAR *)buff + nStrOffset; 
  82.             strTile = (WCHAR *)buff + nStrOffset + MAX_PATH; 
  83.             _tprintf(_T("%s %s\n"),strTile,strFilePath); 
  84.         } 
  85.     } 
  86.     VirtualFreeEx(hProcess, lAddress, 4096, MEM_RELEASE); 
  87.     CloseHandle(hProcess); 
  88.  
  89.  
  90. int _tmain(int argc, _TCHAR* argv[]) 
  91.     setlocale(LC_ALL, "chs"); 
  92.     EnumNotifyWindow(FindTrayWnd()); 
  93.     _tprintf(_T("\n")); 
  94.     EnumNotifyWindow(FindNotifyIconOverflowWindow()); 
  95.     system("pause"); 
  96.     return 0; 
#include "stdafx.h"
#include <afx.h>
#include <locale.h>
#include <string>
using namespace std;



typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;

    LPFN_ISWOW64PROCESS 
        fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
        GetModuleHandle(_T("kernel32")),"IsWow64Process");

    if (NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
            // handle error
        }
    }
    return bIsWow64;
}


HWND FindTrayWnd()
{
    HWND hWnd = NULL;
    
    hWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
    hWnd = FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"), NULL);
    hWnd = FindWindowEx(hWnd, NULL, _T("SysPager"), NULL);
    hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);


    return hWnd;
}

HWND FindNotifyIconOverflowWindow()
{
    HWND hWnd = NULL;

    hWnd = FindWindow(_T("NotifyIconOverflowWindow"), NULL);
    hWnd = FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"), NULL);

    return hWnd;
}

void EnumNotifyWindow(HWND hWnd)
{
    DWORD dwProcessId = 0;
    GetWindowThreadProcessId(hWnd,&dwProcessId);

    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
    if ( hProcess==NULL ){
        return;
    }
    LPVOID lAddress = VirtualAllocEx(hProcess, 0, 4096, MEM_COMMIT, PAGE_READWRITE);
    if ( lAddress==NULL ){
        return;
    }
    DWORD lTextAdr = 0;
    BYTE buff[1024] = {0};
    CString strFilePath;
    CString strTile;
    HWND hMainWnd = NULL;
    int nDataOffset = sizeof(TBBUTTON) - sizeof(INT_PTR) - sizeof(DWORD_PTR);
    int nStrOffset = 18; 
    if ( IsWow64() ){
        nDataOffset+=4;
        nStrOffset+=6;
    }

    //得到圖標個數
    int lButton = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
    for (int i = 0; i < lButton; i++) {
        SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)lAddress);
        //讀文本地址
        ReadProcessMemory(hProcess, (LPVOID)((DWORD)lAddress + nDataOffset), &lTextAdr, 4, 0);
        if ( lTextAdr!=-1 ) {
            //讀文本
            ReadProcessMemory(hProcess, (LPCVOID)lTextAdr, buff, 1024, 0);
            hMainWnd = (HWND)(*((DWORD*)buff));
            strFilePath = (WCHAR *)buff + nStrOffset;
            strTile = (WCHAR *)buff + nStrOffset + MAX_PATH;
            _tprintf(_T("%s %s\n"),strTile,strFilePath);
        }
    }
    VirtualFreeEx(hProcess, lAddress, 4096, MEM_RELEASE);
    CloseHandle(hProcess);
}


int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "chs");
    EnumNotifyWindow(FindTrayWnd());
    _tprintf(_T("\n"));
    EnumNotifyWindow(FindNotifyIconOverflowWindow());
    system("pause");
    return 0;
}
posted @ 2013-03-15 16:33  jqb  阅读(795)  评论(0编辑  收藏  举报