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

一:原理
  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
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

dbyoung

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值