专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 隐藏系统托盘图标:隐藏Windows系统托盘图标 »正文

隐藏系统托盘图标:隐藏Windows系统托盘图标

来源: 发布时间:星期四, 2009年2月12日 浏览:84次 评论:0


    曾经写过篇Windows下任务栏图标编程其实那篇文章讲是如何将我们自己最小化到托盘并进行操作编程思路方法前两天看到论坛里有人讨论如何隐藏托盘图标记得从前为朋友写过个隐藏大智慧软件Software采用思路方法就是将窗口最小化并隐藏大智慧在托盘上图标但是涉及到键盘钩子最后并没有这么做而是用添加个虚拟桌面思路方法达到了效果

    看到这篇帖子依稀想起我曾经做过些尝试平时总是没有动力整理些零碎代码这回碰到了也算给自己个机会
    首先用Spy查找下系统托盘所在窗口类:

      


    可以看到我们需要ToolbarWindow32其实是有层次但不能直接用FindWindow获取ToolbarWindow32句柄而应该像下面代码这样层层深入查找


    ="highlighter-cpp">
  1. hWnd = ::FindWindow(="">"Shell_TrayWnd", NULL);
  2. ="alt">hWnd = ::FindWindowEx(hWnd, 0, ="">"TrayNotyWnd", NULL);
  3. ="alt">hWndTmp = ::FindWindowEx(hWnd, 0, ="">"SysPager", NULL);
  4. ="keyword">(!hWndTmp)
  5. ="alt">     hWnd = ::FindWindowEx(hWnd, 0, ="">"ToolbarWindow32", NULL);
  6. ="keyword">
  7. ="alt">     hWnd = ::FindWindowEx(hWndTmp, 0, ="">"ToolbarWindow32", NULL);

    我们目标是隐藏系统托盘图标很明显是个跨进程操作因此要明白是哪个进程在维护这些图标知道了窗口句柄获取其背后进程就比较容易了:
    ="highlighter-cpp">
  1. ret = ::GetWindowThreadProcessId(hWnd, &lngPID);
  2. ="alt">
  3. hProcess = ::OpenProcess(PROCESS_ALL_ACCESS
  4. ="alt">        |PROCESS_VM_OPERATION
  5.         |PROCESS_VM_READ
  6. ="alt">        |PROCESS_VM_WRITE,
  7.         0,
  8. ="alt">        lngPID);

    首先获取进程ID,然后打开进程获取进程句柄
    接着在进程内分配段内存:
    ="highlighter-cpp">
  1. lngAddress = VirtualAllocEx(hProcess,  0,  0x4096, MEM_COMMIT, PAGE_READWRITE);
  2. ="alt">ret = ::SendMessage(hWnd,TB_GETBUTTON,i,="datatypes">long(lngAddress));

    并向窗口发送TB_GETBUTTON消息获得托盘Button信息这里lngAddress中存储是TBBUTTON结构其内容如下:
    ="highlighter-cpp">
  1. ="keyword">typedef ="keyword">struct _TBBUTTON {
  2. ="alt">="datatypes"> iBitmap;="comment">// zero-based index of button image
  3. ="datatypes"> idCommand;  ="comment">// command to be sent when button pressed
  4. ="alt">="datatypes">BYTE fsState;   ="comment">// button state--see below
  5. ="datatypes">BYTE fsStyle;   ="comment">// button style--see below
  6. ="alt">="datatypes">DWORD dwData;   ="comment">// application-d value
  7. ="datatypes"> iString;="comment">// zero-based index of button label 
  8. ="alt">} TBBUTTON;

    当鼠标移动到系统托盘图标上后会有些提示信息这些信息保存在dwData中而idCommand则是TBBUTTONid我们要隐藏或者显示图标都要针对这个图标id进行操作:
    ="highlighter-cpp">
  1. ret = ::ReadProcessMemory(hProcess, ="datatypes">LPVOID(lngTextAdr),  strBuff,  1024,  0);
  2. ="alt">ret = ::ReadProcessMemory(hProcess, ="datatypes">LPVOID(="datatypes">long(lngAddress) + 4),  &lngButtonID,  4,  0);

    strBuffer中存放提示信息lngButtonID中存放id有了这些信息要操作托盘图标就非常简单了例如我可以
根据某些条件匹配strBuffer然后根据相应lngButtonID隐藏图标隐藏或者显示图标是发送TB_HIDEBUTTON消息
    ="highlighter-cpp">
  1. ::SendMessage(hWnd,   TB_HIDEBUTTON,   BID,  MAKELONG (="keyword">true, 0)); ="comment">//隐藏图标
  2. ="alt">::SendMessage(hWnd,   TB_HIDEBUTTON,   BID,  MAKELONG (="keyword">false,0)); ="comment">//显示图标

    当操作完成后记得做清理工作:
    ="highlighter-cpp">
  1. ::VirtualFreeEx( hProcess,  lngAddress,  0x4096, MEM_RELEASE);
  2. ="alt">::CloseHandle(hProcess);

    上面仅仅是针对个图标操作其实可以发送TB_BUTTONCOUNT消息获得图标数量然后循环处理这里是我写
sample其中第列显示是图标id第 2列显示是图标提示信息在ListBox上选取然后可以点击隐藏恢复

     

    整理总结隐藏Windows系统托盘图标基本步骤是这样:

    1:获取窗口句柄

    2:打开系统进程

    3:分配虚拟内存,读取进程内存获取相应信息

    4:操作

    5:释放内存关闭进程句柄
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: