delphi 如何删除 Windows 托盘区指定图标?  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 如何删除 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
————————————————

原文链接:https://blog.csdn.net/dbyoung/article/details/119002716


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.12393093109131 seconds