- C#方式,参考链接(未验证):https://blog.csdn.net/yulinlover/article/details/3893302
- C++方式,参考链接(已验证有效):https://www.cnblogs.com/likebeta/archive/2012/08/06/2625261.html
- 但是C++方式的这篇文章有点问题,经过我改动后完全OK,修改后的代码如下:
-
#include <iostream> #include <windows.h> #include <tchar.h> #include <commctrl.h> using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; SIZE_T len = 256; TCHAR * ptb = new TCHAR[256]; TCHAR * buf = new TCHAR[256]; SIZE_T size; HWND 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); HWND tool = hwnd;// (HWND)0x0004007C; int lCount = SendMessage(tool, TB_BUTTONCOUNT, 0, 0);// '获取托盘图标个数 RECT rccc; GetWindowRect(hwnd, &rccc); DWORD proID; GetWindowThreadProcessId(tool, &proID); HANDLE hPro = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, NULL, proID); PVOID pBun = VirtualAllocEx(hPro, NULL, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE); PVOID pText = VirtualAllocEx(hPro, NULL, len, MEM_COMMIT, PAGE_EXECUTE_READWRITE); UINT buffer = len; for (int j = 0; j < lCount; j++) { DWORD si = SendMessage(tool, TB_GETRECT, (WPARAM)j, (LPARAM)pBun); si = SendMessage(tool, TB_GETBUTTONTEXT, (WPARAM)j, (LPARAM)pText); ReadProcessMemory(hPro, pBun, (LPVOID)ptb, len, &size); ReadProcessMemory(hPro, pText, (LPVOID)buf, len, &size); LPRECT pRect = (LPRECT)ptb; OffsetRect(pRect, rccc.left, rccc.top); cout << buf << endl; cout << (*pRect).left << endl << (*pRect).top << endl << (*pRect).right << endl << (*pRect).bottom << endl; } VirtualFreeEx(hPro, pBun, len, MEM_DECOMMIT); VirtualFreeEx(hPro, pText, len, MEM_COMMIT); delete ptb; return nRetCode; }
最完美C++版本,还考虑到了溢出托盘区:https://blog.csdn.net/hzy694358/article/details/7400284
获取系统托盘信息
最新推荐文章于 2024-03-31 12:49:06 发布