15,980
社区成员




#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <commctrl.h>
#include <locale.h>
#pragma comment(lib, "user32")
typedef struct TRAYDATA
{
HWND hwnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved[2];
HICON hIcon;
} TRAYDATA;
int _tmain(void)
{
HWND hWnd = NULL;
DWORD dwPID;
DWORD dwCount;
HANDLE hPro;
LPVOID pTB;
DWORD i;
SIZE_T t;
TBBUTTON tb = { 0 };
TRAYDATA trayData = { 0 };
RECT *pRect;
RECT rc;
#define SE_DEBUG_PRIVILEGE 20
typedef LONG NTSTATUS;
BOOL bResult;
typedef NTSTATUS (WINAPI *_RtlAdjustPrivilege)(ULONG /*Privilege*/,
BOOL /*Enable*/,
BOOL /*CurrentThread*/,
PBOOL /*Enabled*/);
_RtlAdjustPrivilege RtlAdjustPrivilege = (_RtlAdjustPrivilege)GetProcAddress(GetModuleHandle(TEXT("ntdll")), "RtlAdjustPrivilege");
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &bResult);
_tsetlocale(LC_ALL, _T("chs"));
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);
GetWindowThreadProcessId(hWnd, &dwPID);
dwCount = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
//_tprintf(_T("%d\n"), dwCount);
hPro = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPID);
pTB = VirtualAllocEx(hPro, NULL, sizeof(TBBUTTON), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
pRect = VirtualAllocEx(hPro, 0, sizeof(RECT), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
for (i = 0; i < dwCount; ++i)
{
//获取BUTTON信息
LRESULT ret = SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)(LPTBBUTTON)pTB);
ReadProcessMemory(hPro, pTB, &tb, sizeof(TBBUTTON), &t);
ReadProcessMemory(hPro,
(LPCVOID)tb.dwData, //取dwData字段指向的TRAYDATA结构
&trayData,
sizeof(TRAYDATA),
NULL);
SendMessage(hWnd, TB_GETITEMRECT, i, (LPARAM)pRect); //发送消息获取托盘项区域数据
ReadProcessMemory(hPro, pRect, &rc, sizeof(rc), NULL); //读取托盘区域数据
//_tprintf(_T("%d %d %d %d\n"), rc.left, rc.top, rc.right, rc.bottom);
if (IS_INTRESOURCE(tb.iString))
_tprintf(_T("%d\n"), tb.iString);
else
{
TCHAR str[MAX_PATH];
ReadProcessMemory(hPro, (LPCVOID)tb.iString, str, MAX_PATH, &t); //tb.iString指向的是hPro空间
//_tprintf(_T("%s\n"), str);
if (_tcsstr(str, _T("Internet")))
{
POINT OldPoint, Point = { (rc.right - rc.left) * (i + 0.5), (rc.bottom - rc.top) * 0.5 };
ClientToScreen(hWnd, &Point);
GetCursorPos(&OldPoint);
SetCursorPos(Point.x, Point.y);
//Sleep(1000);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetCursorPos(OldPoint.x, OldPoint.y);
}
}
}
VirtualFreeEx(hPro, pRect, sizeof(RECT), MEM_DECOMMIT);
VirtualFreeEx(hPro, pRect, 0, MEM_RELEASE);
VirtualFreeEx(hPro, pTB, sizeof(TBBUTTON), MEM_DECOMMIT);
VirtualFreeEx(hPro, pTB, 0, MEM_RELEASE);
CloseHandle(hPro);
return 0;
}