woawn 发表于 2012-8-21 00:32:14

“疯狂刷新”的托盘图标都隐藏的功能


突然想到又添加一个把“疯狂刷新”的托盘图标都隐藏的功能。于是百度了半天才弄到一个还可以的实现功能。
http://www.delphitop.com/UpFile/201108/201181211517884.jpg

(添加uses CommCtrl;)
procedure HideAllTrace;
var TBHWND: HWND;
i, count: Integer;
PID, PRC: THandle;
Buff: PChar;
Info: _TBBUTTON;
R: Cardinal;
S: array of char;
begin
TBHWND := GetSysTrayWnd;
if TBHWND = 0 then exit;

GetWindowThreadProcessId(TBHWND, @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);
count := SendMessage(TBHWND, TB_BUTTONCOUNT, 0, 0); //托盘中button的个数,不一定是图标的个数,有些button是隐藏的。
for i := 0 to count - 1 do
begin
FillChar(Info, SizeOf(Info), 0);
WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R); //消息使用的内存空间必须在Shell之内,所以利用ReadProcessMemoery和WriteProcessMemory。
SendMessage(TBHWND, TB_GETBUTTON, i, Integer(Buff));
ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);

SendMessage(TBHWND, TB_GETBUTTONTEXT, Info.idCommand, Integer(Integer(@Buff) + SizeOf(Info)));
ReadProcessMemory(PRC, Pointer(Integer(@Buff) + SizeOf(Info)), @S, SizeOf(S), R);
if pos('疯狂刷新', StrPas(S)) > 0 then //如果button的TEXT中包含'疯狂刷新'
SendMessage(TBHWND, TB_DELETEBUTTON, i, 0); //删除
end;
VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);
CloseHandle(PRC);
end;


转帖自:http://www.delphitop.com/html/chengxu/1589.html


向往 发表于 2012-8-21 01:14:00

本帖最后由 向往 于 2012-8-21 01:27 编辑


呃.....不好意思......请问.....   疯狂刷新是什么??


woawn 发表于 2012-8-21 01:38:55

向往 发表于 2012-8-21 01:14 static/image/common/back.gif
呃.....不好意思......请问.....   疯狂刷新是什么??

他后面的一段话就是答案,托盘图标都隐藏的功能,托盘上的图标没了,就像是在不断地刷新。

Angel丶L 发表于 2015-2-1 16:38:50

支持楼主发扬Delphi
页: [1]
查看完整版本: “疯狂刷新”的托盘图标都隐藏的功能