如何删除 Windows 托盘区指定图标?

本文介绍了如何在Delphi中利用WinAPI删除Windows任务栏上的QQ图标。通过查找并操作相关窗口句柄,获取按钮信息,比对按钮文字,最终调用TB_DELETEBUTTON函数来移除指定图标。提供的代码示例详细展示了实现过程,并在WIN10X64环境下进行了测试。
摘要由CSDN通过智能技术生成

一:原理
  1、使用 TB_BUTTONCOUNT, 获取按钮数量;
  2、使用 TB_GETBUTTON,获取每一个按钮信息;
  3、使用 TB_GETBUTTONTEXT,获取按钮文字;
  4、比较文字,是否是你想要删除的图标。
  5、使用 TB_DELETEBUTTON 删除图标。

二:实现
   以删除 QQ 图标为例:

uses Winapi.CommCtrl;

procedure TForm1.btn1Click(Sender: TObject);
var
  hToolbar : THandle;
  I, Count : Integer;
  hProcess : THandle;
  PID      : THandle;
  Buffer   : Pointer;
  tbn      : TTBButton;
  intLen   : SIZE_T;
  strLength: Integer;
  strTBText: WideString;
begin
  hToolbar := FindWindow('Shell_TrayWnd', nil);
  hToolbar := FindWindowEx(hToolbar, 0, 'TrayNotifyWnd', nil);
  hToolbar := FindWindowEx(hToolbar, 0, 'SysPager', nil);
  hToolbar := FindWindowEx(hToolbar, 0, 'ToolbarWindow32', '用户提示通知区域');
  Count    := SendMessage(hToolbar, TB_BUTTONCOUNT, 0, 0);

  GetWindowThreadProcessId(hToolbar, @PID);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  Buffer   := VirtualAllocEx(hProcess, nil, SizeOf(TTBButton), MEM_COMMIT, PAGE_READWRITE);
  try
    for I := 0 to Count - 1 do
    begin
      intLen := 0;
      SendMessage(hToolbar, TB_GETBUTTON, I, Integer(Buffer));
      ReadProcessMemory(hProcess, Buffer, @tbn, SizeOf(TTBButton), intLen);
      strLength := SendMessage(hToolbar, TB_GETBUTTONTEXT, tbn.idCommand, Integer(Buffer));
      SetLength(strTBText, strLength);
      ReadProcessMemory(hProcess, Buffer, @(strTBText[1]), strLength * SizeOf(strTBText[1]), intLen);
      if (strTBText[1] = 'Q') and (strTBText[2] = 'Q') then
      begin
        SendMessage(hToolbar, TB_DELETEBUTTON, I, 0);
        Break;
      end;
    end;
  finally
    VirtualFreeEx(hProcess, Buffer, 0, MEM_RELEASE);
    CloseHandle(hProcess);
  end;
end;

测试环境:WIN10X64 + Delphi10.4.2
qq交流群:101611228

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值