BOOL CHide::ShowTrayIcon(BOOL bShow){ HWND hWnd
= FindWindow(_T("Shell_TrayWnd"),
NULL); if (hWnd
== NULL)
return FALSE; hWnd
= FindWindowEx(hWnd, NULL, _T("TrayNotifyWnd"),
NULL); if (hWnd
== NULL)
return FALSE; ::EnableWindow(hWnd, bShow);
// 托盘区禁用,防音量打开 hWnd
= FindWindowEx(hWnd, NULL, _T("SysPager"),
NULL); if (hWnd
== NULL)
return FALSE; hWnd
= FindWindowEx(hWnd, NULL, _T("ToolbarWindow32"),
NULL); if (hWnd
== NULL)
return FALSE; DWORD dwProcessID; GetWindowThreadProcessId(hWnd,
&dwProcessID); HANDLE hProcess
= OpenProcess(PROCESS_VM_OPERATION
| PROCESS_VM_READ
| PROCESS_VM_WRITE, FALSE, dwProcessID);
if (hProcess
== NULL)
return FALSE;
int nItemCount
= (int)SendMessage(hWnd, TB_BUTTONCOUNT,
0,
0); PVOID pvData
= VirtualAllocEx(hProcess, NULL,
sizeof(TBBUTTON), MEM_RESERVE
| MEM_COMMIT, PAGE_READWRITE);
if (pvData
== NULL
|| nItemCount
<
1) { CloseHandle(hProcess);
return FALSE; }
for (int i
=
0; i
< nItemCount; i++) { TBBUTTON bi;
DWORD dwBytesRead = (DWORD)
-
1; SendMessage(hWnd, TB_GETBUTTON, i, (LPARAM)pvData); ReadProcessMemory(hProcess, pvData,
&bi,
sizeof(bi),
&dwBytesRead);
if (dwBytesRead
<
sizeof(TBBUTTON))
continue; DWORD dwData[2]
= {0,
0}; ReadProcessMemory(hProcess, (PVOID)bi.dwData, dwData,
sizeof(dwData),
&dwBytesRead);
if (dwBytesRead
<
sizeof(dwData))
continue;
// 获取图标所属窗口的句柄,其中(int)dwData[1]代表图标ID
TCHAR szClassName[50]; ZeroMemory(&szClassName,
sizeof(szClassName)); GetClassName((HWND)(DWORD_PTR)dwData[0],
szClassName, _countof(szClassName)); // 排除,if (bi.fsState & TBSTATE_HIDDEN)可判状态
if (StrCmp(szClassName, _T("Connections
Tray"))
==
0
|| StrCmp(szClassName, _T("SystemTray_Main"))
==
0
|| StrCmp(szClassName, _T("#32770"))
==
0
|| StrCmp(szClassName, _T("AVP.Tray"))
==
0) {
continue; }
else { SendMessage(hWnd, TB_HIDEBUTTON, bi.idCommand,
!bShow); } } VirtualFreeEx(hProcess, pvData,
0, MEM_RELEASE); CloseHandle(hProcess);
// 刷新托盘 ::SendMessage(HWND_BROADCAST,
WM_SETTINGCHANGE, 0,
0);
return TRUE;}
控制托盘图标显示或隐藏
最新推荐文章于 2024-01-16 16:25:11 发布