请问怎么隐藏托盘上的某一程序的图标!不是我自己的程序!是某一程序的在托盘上的图标!比如:音量”什么的!

解决方案 »

  1.   

    var
      TrayHandle : Thandle;
    begin
      TrayHandle:=FindWindowEx(FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'SysPager',nil),0,'ToolbarWindow32',nil);
      {XP,2003下}
      //TrayHandle:=FindWindowEx( FindWindowEx( FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'ToolbarWindow32',nil);--2000下  
      SendMessage(TrayHandle,TB_HIDEBUTTON,1,1);    //隐藏某个图标
      SendMessage(TrayHandle,TB_HIDEBUTTON,1,0);    //显示某个图标
    end;
      

  2.   

    获取系统托盘的任意一个图标的句柄并隐藏/// Code By Kingron, 2003
    /// 获取系统托盘某个图标的坐标区域,如果要隐藏某个图标例如音量的图标,也很方便,改改就可以了
    function GetSysTrayIconRect(Text: string): TRect;
    {
      返回系统托盘中指定文字的图标的矩形区域。
      例如返回音量控制图标的矩形区域:
      GetSysTrayIconRect('音量');
    }
    begin
      result := GetToolBarButtonRect(GetSysTrayWnd, Text);
    end;function GetSysTrayWnd: HWND;
    {
      返回系统托盘的句柄,适合于WinXP以上版本
    }
    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;function GetToolBarButtonRect(hWnd: HWND; Title: string): TRect;
    {
      返回指定工具栏对应的按钮指定文本的矩形区域
      hWnd:工具栏句柄,Title:需要返回矩形区域的按钮文字
      返回值:指定按钮的边界矩形,屏幕坐标
    }
    var
      C, i: integer;
      Inf _TBBUTTON;
      Item: tagTCITEM;
      Buff: PChar;
      S: array[0..1024] of char;
      PID: THandle;
      PRC: THandle;
      R: Cardinal;
    begin
      FillChar(result, SizeOf(result), 0);
      if hWnd = 0 then Exit;
      GetWindowThreadProcessId(hWnd, @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);  if Format('%d.%d', [Win32MajorVersion, Win32MinorVersion]) >= '5.1' then {// Is Windows XP or Higher}
      begin
        C := SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0);
        for i := 0 to C - 1 do
        begin
          FillChar(Info, SizeOf(Info), 0);
          WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);      SendMessage(hWnd, TB_GETBUTTON, i, integer(Buff));
          ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);      SendMessage(hWnd, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
          ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
          if SameText(StrPas(S), Title) and not Boolean(SendMessage(hWnd, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then
          begin
            SendMessage(hWnd, TB_GETRECT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));
            ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @result, SizeOf(result), R);        Windows.ClientToScreen(hWnd, result.TopLeft);
            Windows.ClientToScreen(hWnd, result.BottomRight);        Break;
          end;
        end;
      end
      else
      begin
        C := SendMessage(hWnd, TCM_GETITEMCOUNT, 0, 0);
        for i := 0 to C - 1 do
        begin
          with Item do
          begin
            mask := TCIF_TEXT;
            dwState := 0;
            dwStateMask := 0;
            cchTextMax := 2048;
            pszText := PChar(integer(Buff) + SizeOf(Item) * 4);
            iImage := 0;
            lParam := 0;
          end;
          WriteProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
          SendMessage(hWnd, TCM_GETITEM, i, Integer(Buff));      ReadProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);
          ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(Item) * 4), @S[0], SizeOf(S), R);      if SameText(S, Title) then
          begin
            SendMessage(hWnd, TCM_GETITEMRECT, i, integer(Buff));
            ReadProcessMemory(PRC, Buff, @result, SizeOf(result), R);        Windows.ClientToScreen(hWnd, result.TopLeft);
            Windows.ClientToScreen(hWnd, result.BottomRight);
            Break;
          end;
        end;
      end;  VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
      CloseHandle(PRC);
    end;
      

  3.   

    我试过楼上的代码,在win2000我的机器上出了点问题!
    怎么一显示,有很多重复的图标?
      

  4.   

    隐藏系统托盘
    procedure hideStartbutton(visi:boolean);  
    {visi 为 True 则显示,False则隐藏} 
    Var  
      Tray, Child : hWnd;  
      C : Array[0..127] of Char;  
      S : String;  
    Begin  
      Tray := FindWindow('Shell_TrayWnd', NIL);  
      Child := GetWindow(Tray, GW_CHILD);  
      While Child <> 0 do 
      Begin  
        If GetClassName(Child, C, SizeOf(C)) > 0 Then 
        Begin  
          S := StrPAS(C);  
          If UpperCase(S) = 'TRAYNOTIFYWND' then 
          begin  
            If Visi then ShowWindow(Child, 1)  
                    else ShowWindow(Child, 0);  
          end;  
        End;  
        Child := GetWindow(Child, GW_HWNDNEXT);  
      End;  
    End;  
    这是隐藏系统托盘的,你可以再搞个热键!:)