编程隐藏其他程序的托盘图标

DDGG 2009-12-14 03:03:12
有一个软件,运行时会在任务条右下角显示托盘图标,但是它自己又没有选项可以设置不显示。
有没有办法通过编程实现隐藏其他程序的托盘图标呢?

我目前想到的办法是用CreateProcess加载该软件,然后用CreateRemoteThread调用LoadLibrary函数为该进程装入一个DLL,在DLL里替换掉这个进程的Shell_NotifyIcon函数,让它什么也不干。

有人写过类似的代码么?可否给个例子,谢谢!
...全文
326 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
d383137359 2009-12-14
  • 打赏
  • 举报
回复
Arnold9009 2009-12-14
  • 打赏
  • 举报
回复
mark
pady_pady 2009-12-14
  • 打赏
  • 举报
回复
强人,mark留用
DDGG 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loaden 的回复:]
需要自己修改一下。
这是我在一个工程里隐藏图标的,不过,我排除了音量、卡巴等图标。
自己看着修改一下,就可以调用了。
[/Quote]

挖!这么厉害!先拜谢了,回去试试!
老邓 2009-12-14
  • 打赏
  • 举报
回复
要隐藏指定程序的托盘图标,只需要修改下面代码:通过比较类名来区别。
 // 排除,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;
}
老邓 2009-12-14
  • 打赏
  • 举报
回复
需要自己修改一下。
这是我在一个工程里隐藏图标的,不过,我排除了音量、卡巴等图标。
自己看着修改一下,就可以调用了。
sduxiaoxiang 2009-12-14
  • 打赏
  • 举报
回复
LS达人
老邓 2009-12-14
  • 打赏
  • 举报
回复
// 控制托盘图标显示或隐藏
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;
}
老邓 2009-12-14
  • 打赏
  • 举报
回复
// 控制托盘图标显示或隐藏
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;
}
老邓 2009-12-14
  • 打赏
  • 举报
回复
嗯,这个我比较擅长。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧