一:原理
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