首页 »DotNet » 隐藏系统托盘图标:隐藏Windows系统托盘图标 »正文
隐藏系统托盘图标:隐藏Windows系统托盘图标
来源: 发布时间:星期四, 2009年2月12日 浏览:84次 评论:0
曾经写过 篇Windows下 任务栏图标编程 其实那篇文章讲 是如何将我们自己 最小化到托盘并进行操作 编程思路方法 前两天看到论坛里有人讨论如何隐藏托盘图标 记得从前为朋友写过 个隐藏大智慧软件Software 采用 思路方法就是将窗口最小化并隐藏大智慧在托盘上 图标 但是 涉及到键盘钩子 最后并没有这么做 而是用添加 个虚拟桌面 思路方法达到了效果 看到这篇帖子 依稀想起我曾经做过 些尝试 平时总是没有动力整理 些零碎 代码 这回碰到了也算给自己 个机会 首先用Spy 查找 下系统托盘所在 窗口类:
可以看到我们需要 ToolbarWindow32其实是有层次 但不能直接用FindWindow获取ToolbarWindow32句柄 而应该像下面 代码这样 层层深入查找
="highlighter-cpp">
hWnd = ::FindWindow(="">"Shell_TrayWnd", NULL);
="alt"> hWnd = ::FindWindowEx(hWnd, 0, =" ">"TrayNot yWnd" , NULL);
="alt"> hWndTmp = ::FindWindowEx(hWnd, 0, =" ">"SysPager" , NULL);
="keyword">(!hWndTmp)
="alt"> hWnd = ::FindWindowEx(hWnd, 0, =" ">"ToolbarWindow32" , NULL);
="keyword">
="alt"> hWnd = ::FindWindowEx(hWndTmp, 0, =" ">"ToolbarWindow32" , NULL);
我们 目标是隐藏系统托盘图标 很明显是 个跨进程操作 因此要明白是哪个进程在维护这些图标 知道了窗口 句柄 获取其背后 进程就比较容易了:
="highlighter-cpp">
ret = ::GetWindowThreadProcessId(hWnd, &lngPID);
="alt">
hProcess = ::OpenProcess(PROCESS_ALL_ACCESS
="alt"> |PROCESS_VM_OPERATION
|PROCESS_VM_READ
="alt"> |PROCESS_VM_WRITE,
0,
="alt"> lngPID);
首先获取进程ID,然后打开进程 获取进程句柄 接着在进程内分配 段内存:
="highlighter-cpp">
lngAddress = VirtualAllocEx(hProcess, 0, 0x4096, MEM_COMMIT, PAGE_READWRITE);
="alt"> ret = ::SendMessage(hWnd,TB_GETBUTTON,i,="datatypes">long (lngAddress));
并向窗口发送TB_GETBUTTON消息 获得托盘Button 信息 这里 lngAddress中存储 是TBBUTTON结构 其内容如下:
="highlighter-cpp">
="keyword">typedef ="keyword">struct _TBBUTTON {
="alt"> ="datatypes"> iBitmap;="comment">// zero-based index of button image
="datatypes"> idCommand; ="comment">// command to be sent when button pressed
="alt"> ="datatypes">BYTE fsState; ="comment">// button state--see below
="datatypes">BYTE fsStyle; ="comment">// button style--see below
="alt"> ="datatypes">DWORD dwData; ="comment">// application- d value
="datatypes"> iString;="comment">// zero-based index of button label
="alt"> } TBBUTTON;
当鼠标移动到系统托盘图标上后 会有 些提示信息 这些信息保存在dwData中 而idCommand则是TBBUTTON id 我们要隐藏或者显示图标 都要针对这个图标id进行操作:
="highlighter-cpp">
ret = ::ReadProcessMemory(hProcess, ="datatypes">LPVOID(lngTextAdr), strBuff, 1024, 0);
="alt"> ret = ::ReadProcessMemory(hProcess, ="datatypes">LPVOID (="datatypes">long (lngAddress) + 4), &lngButtonID, 4, 0);
strBuffer中存放提示信息 lngButtonID中存放id 有了这些信息 要操作托盘图标就非常简单了 例如我可以 根据某些条件匹配strBuffer 然后根据相应 lngButtonID隐藏图标 隐藏或者显示图标是发送TB_HIDEBUTTON消息
="highlighter-cpp">
::SendMessage(hWnd, TB_HIDEBUTTON, BID, MAKELONG (="keyword">true, 0)); ="comment">//隐藏图标
="alt"> ::SendMessage(hWnd, TB_HIDEBUTTON, BID, MAKELONG (="keyword">false ,0)); ="comment">//显示图标
当操作完成后 记得做清理工作:
="highlighter-cpp">
::VirtualFreeEx( hProcess, lngAddress, 0x4096, MEM_RELEASE);
="alt"> ::CloseHandle(hProcess);
上面仅仅是针对 个图标 操作 其实可以发送TB_BUTTONCOUNT消息 获得图标数量 然后循环处理 这里是我写 个 sample 其中第 列显示 是图标id 第 2列显示 是图标提示信息 在ListBox上选取 然后可以点击隐藏 恢复 整理总结 下 隐藏Windows系统托盘图标基本步骤是这样 : 1:获取窗口句柄 2:打开系统进程 3:分配虚拟内存,读取进程内存获取相应信息 4:操作 5:释放内存 关闭进程句柄
相关文章
读者评论
发表评论
|
|