求一个能隐藏系统托盘区任何图标的代码?
如音量图标
网上找到一些,但看不懂!

解决方案 »

  1.   

    使用Shell_NotifyIcon函数,前提是你必须知道这个图标所属的进程的句柄,可以使用FindWindows以及其他的来找到。
    从Hide窗口的角度来考虑,是找不到这个图标的句柄。那是因为它一个ImageList,是找不到句柄的(这个和时钟区域不同)。代码:  
          uses   
          shellapi;   
        
      procedure   TForm1.Button1Click(Sender:   TObject);   
      var   
          nt:   TNotifyIconData;   
      begin   
          with   nt   do   
          begin   
              cbSize   :=   SizeOf(nt);   //#32770   
              Wnd         :=   FindWindow(nil,'记事本(Top)'   );   
              uid         :=   0;   
              uFlags   :=   NIF_ICON   or   NIF_MESSAGE   or   NIF_TIP;   
              uCallbackMessage   :=   WM_USER   +   17;   
              hIcon     :=   0;   
              szTip     :=   '';   
          end;   
          Shell_NotifyIcon(NIM_DELETE,   @nt);   
      end;     
      

  2.   

    请mwy654321前往领分:
    http://topic.csdn.net/u/20080413/14/e470a307-9394-444a-a307-14bdf0c69c63.html之所以献分,是因为我没弄成功,想知道您的答案
      

  3.   

    代码下载地址:www.mwymwy.cn/1.rar 结贴吧!谢谢!下次有问题请随时提出来。
      

  4.   

    谢谢!我接受答案了!希望楼主结贴并给mwy654321评分!
      

  5.   

    function   GetSysTrayWnd:   HWND;
    begin
        result := FindWindow('Shell_TrayWnd',nil);
        result := FindWindowEx(result,0,'TrayNotifyWnd',nil);
        result := FindWindowEx(result,0,'SysPager',nil);
        result := FindWindowEx(result,0,'ToolbarWindow32',nil);
    end;procedure FreeIcon;
    var
      ShellHandle: THandle;
      PID: THandle;
      PRC:   THandle;
      Buff: pchar;
      i,Count: integer;
      Info:   _TBBUTTON;
      R:   Cardinal;
      S:   array[0..1024]   of   char;
    begin
      ShellHandle := GetSysTrayWnd; //得到托盘处句炳
      GetWindowThreadProcessId(ShellHandle,   @PID);
      PRC := OpenProcess(PROCESS_VM_OPERATION   or   PROCESS_VM_READ   or   PROCESS_VM_WRITE,   False,   PID);
      Buff:=VirtualAllocEx(PRC,   nil,   4096,   MEM_RESERVE   or   MEM_COMMIT,   PAGE_READWRITE);
      Count := SendMessage(ShellHandle,   TB_BUTTONCOUNT,   0,   0);
      for i := 0 to Count - 1 do
      begin
        FillChar(Info,   SizeOf(Info),   0);
        WriteProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R);
        SendMessage(ShellHandle, TB_GETBUTTON, i,integer(Buff));
        ReadProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R);
        SendMessage(ShellHandle,   TB_GETBUTTONTEXT,   Info.idCommand,   integer(integer(@Buff[0])   +   SizeOf(Info)));
        ReadProcessMemory(PRC,   Pointer(integer(@Buff[0])   +   SizeOf(Info)),   @S[0],   SizeOf(S),   R);
        SendMessage(ShellHandle,TB_HIDEBUTTON,i,1);
        SendMessage(ShellHandle, TB_AUTOSIZE, 0, 0)
      end;
      VirtualFreeEx(PRC,   Buff,   0,   MEM_RELEASE);
      CloseHandle(PRC);
    end;
      

  6.   

    看看MSDN则可得到结果了!,上面的代码就可隐藏托盘处所有的图标!
    如果稍微修改一下,则可隐藏任何一个图标
    SendMessage(ShellHandle,TB_HIDEBUTTON,i,1); 这句则可隐藏!I就是图标在托盘中的索引。
      

  7.   

    再请看看
    http://www.why100000.com/Htmls/_bian_cheng_zhuan_qu435.htm
      

  8.   

    CoolTrayIcon组件应该是够用,并且组件带源码。
      

  9.   


    另外,注意,我刚刚看了下mwy654321的代码
    他的代码并不能隐藏托盘的图标,只不过是得到托盘而已。
      

  10.   

    多谢各位,特别是suiyunonghen你很热心
      

  11.   

    编译报错
      Info:   _TBBUTTON; 
      

  12.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
     USES Commctrl,ShellAPI;
     function   GetSysTrayWnd:   HWND;
    begin 
        result := FindWindow('Shell_TrayWnd',nil); 
        result := FindWindowEx(result,0,'TrayNotifyWnd',nil); 
        result := FindWindowEx(result,0,'SysPager',nil); 
        result := FindWindowEx(result,0,'ToolbarWindow32',nil); 
    end; procedure FreeIcon; 
    var 
      ShellHandle: THandle; 
      PID: THandle; 
      PRC:   THandle; 
      Buff: pchar; 
      i,Count: integer; 
      Info:_TBBUTTON;
      R:   Cardinal; 
      S:   array[0..1024]   of   char; 
    begin
      ShellHandle := GetSysTrayWnd; //得到托盘处句炳
      GetWindowThreadProcessId(ShellHandle,   @PID); 
      PRC := OpenProcess(PROCESS_VM_OPERATION   or   PROCESS_VM_READ   or   PROCESS_VM_WRITE,   False,   PID); 
      Buff:=VirtualAllocEx(PRC,   nil,   4096,   MEM_RESERVE   or   MEM_COMMIT,   PAGE_READWRITE); 
      Count := SendMessage(ShellHandle,   TB_BUTTONCOUNT,   0,   0); 
      for i := 0 to Count - 1 do 
      begin 
        FillChar(Info,   SizeOf(Info),   0); 
        WriteProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R); 
        SendMessage(ShellHandle, TB_GETBUTTON, i,integer(Buff)); 
        ReadProcessMemory(PRC,   Buff,   @Info,   SizeOf(Info),   R); 
        SendMessage(ShellHandle,   TB_GETBUTTONTEXT,   Info.idCommand,   integer(integer(@Buff[0])   +   SizeOf(Info))); 
        ReadProcessMemory(PRC,   Pointer(integer(@Buff[0])   +   SizeOf(Info)),   @S[0],   SizeOf(S),   R); 
        SendMessage(ShellHandle,TB_HIDEBUTTON,i,1); 
        SendMessage(ShellHandle, TB_AUTOSIZE, 0, 0) 
      end; 
      VirtualFreeEx(PRC,   Buff,   0,   MEM_RELEASE); 
      CloseHandle(PRC); 
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    GetSysTrayWnd;
    end;end.
    似乎并没有隐藏全部图标?
      

  13.   

    我的是整个工程,我这边是可以实现隐藏的。隐藏的时候单击前面的复选框。
    代码如果你已经下载了,我就删除1.rar了。
      

  14.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}   USES Commctrl,ShellAPI;
    procedure TForm1.Button1Click(Sender: TObject);
    var TBHWND:HWND;
        i,count:integer;
        PID,PRC: THandle;
        Buff: PChar;
        Info: _TBBUTTON;
        R: Cardinal;
        S: array[0..1024] of char;
    begin
    TBHWND := FindWindow('Shell_TrayWnd', nil);                  // Shell_TrayWnd: 任务栏窗口
    TBHWND := FindWindowEx(TBHWND, 0, 'TrayNotifyWnd', nil);     // TrayNotifyWnd:任务栏类
    TBHWND := FindWindowEx(TBHWND, 0, 'ToolbarWindow32', nil);   // ToolbarWindow32:托盘类,是一个toolbarif TBHWND=0 then exit;GetWindowThreadProcessId(TBHWND, @PID);
    PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);
    Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);count:=SendMessage(TBHWND,TB_BUTTONCOUNT,0 , 0);          //托盘中button的个数,不一定是图标的个数,有些button是隐藏的。for i:=0 to count-1 do
        begin
          FillChar(Info, SizeOf(Info), 0);
          WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);  //消息使用的内存空间必须在Shell之内,所以利用ReadProcessMemoery和WriteProcessMemory。
          SendMessage(TBHWND, TB_GETBUTTON, i, integer(Buff));
          ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);      SendMessage(TBHWND, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
          ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);      if pos('QQ',StrPas(S))>0 then            //如果button的TEXT中包含'QQ'
             SendMessage(TBHWND, TB_DELETEBUTTON, i, 0);          //删除
          Form1.Memo1.Lines.Add(StrPas(S));        //在MEMO1中记录所有button的TEXT
        end;
    VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
    CloseHandle(PRC);
    end;end.
    这是我找到的代码,也没有隐藏指定的图标?
      

  15.   

    恩!给mwy654321正宗道歉!
    代码,我没有测试清楚!是可以隐藏的!但是有的图标我还是没有隐藏成功!遗憾!
      

  16.   

    MagicHide 2006
    用了一下,这个软件,感觉比较理想
      

  17.   

    ***************************************************************************   思想决定行动,交流产生力量。  
    程序员在深圳QQ群大集   专业分类:   
    程序员在深圳JAVA群4247660   
    程序员在深圳c++群15195967   
    程序员在深圳.NET群Ⅱ:12203296   
    程序员在深圳TCP/IP协议栈开发:16956462   
    程序员在深圳JS & AJAX群:12578377   
    程序员在深圳英语学习群:23864353   
    深序员在深圳VB:11055959   
    程序员在深圳c++Ⅱ17409451   
    程序员在深圳c++群15195967   
    程序员在深圳嵌入式开发群37489763   
    程序员在深圳移动开发群31501597   
    程序员在深圳创业群33653422   不限专业分类:   
    高级群:17538442   
    第三群:2650485   
    第二群:7120862   
    第五群:29537639   
    第四群:28702746   
    第六群:10590618   
    第七群:10543585   
    第八群:12006492   
    第九群:19063074   
    第十群:2883885   
    第十一群:25460595   
    第十二群:9663807   深圳程序员QQ群联盟成立两年多,拥有三十个以上的QQ群,人数达两千多人,有30%以上的成员的经验丰富  的老手,包括国内外顶级大公司的成员(如微软、IBM,SUN,华为)、国内著名高校和研究院成员,和有  丰富实践经验的高级程序(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入  式操作系统),还有少数女程序员。  现推介如下QQ群,如有兴趣速速加入:深程高级群:17538442(此群不欢迎新手,已经在深圳工作的,月薪  6K以下的不欢迎)c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 JAVA:4247660     
    ——————————————————————————————————————————    
    希望大家不要认为群能给你送来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到  一点信息或许能带来一点启发。  
    有人说常聊QQ的人肯定技术不怎么样,但其实很多技术高朋友不需要做一些简单的重复劳动所以还是有  时间聊天的。   *****************************************************************************
      

  18.   

    呵呵,
    count:=SendMessage(TBHWND,TB_BUTTONCOUNT,0 , 0);          //托盘中button的个数,不一定是图标的个数,有些button是隐藏托盘中的Button的个数就是图标的个数!想想ToolBar的原理,那个东西其实就是一个ToolBar了,
    图标就是附于Button上的!我的那个代码其实是可以隐藏所有图标的!
      

  19.   


    你看看这里:
    http://community.csdn.net/help/GetUsablePoint.htm
    每次发贴提问都可以免费得到30分,如果发贴低于30分,那么虽然是在提问问题表面上是花费可用分了,实际上反而赚分了。基本上低于80分的贴子我在回答的时候都会要求加分,否则只帮楼主顶下贴子算了。你看我提问过的问题,每次给分都不低于100分,我不是那种没有诚意的人。有些人在贴子标题中注明非常焦急,可是贴子才给了20分,我不相信他仅有这20分的这种解释,因为每次发贴都可以得到30分。楼主还算不错了,我的问题不是针对楼主。