zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SpringBoot集成beetl模板快速入门
    小记---idea springboot 报错没有get或者set方法
    android在style中使用自定义属性 error: style attribute not found.
    ieda使用 在jsp页面中,有时候会出现不能智能显示方法 idea pageContext.setAttribute
    ieda使用 在jsp页面中,有时候会出现不能智能显示方法 idea pageContext.setAttribute
    logback的使用和logback.xml详解,在Spring项目中使用log打印日志
    classpath和classpath*区别
    SpringBoot项目在IntelliJ IDEA中实现热部署
    idea 警告:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
    linux 删除文件后 df 查看磁盘空间并没有释放
  • 原文地址:https://www.cnblogs.com/jiqiubo/p/2961695.html
Copyright © 2011-2022 走看看