本文整理自网络,侵删。
USES Commctrl,ShellAPI
procedure TForm1.Button1Click(Sender: TObject);var TBHWND:HWND; i,count:integer; PID,PRC: THandle; Buff: PChar; Info: _TBBUTTON; R: Cardinal; S: array[0..1024] of char;begin
TBHWND :=FindWindow('Shell_TrayWnd', nil);TBHWND :=FindWindowEx(TBHWND ,0,'TrayNotifyWnd', nil);TBHWND :=FindWindowEx(TBHWND ,0,'SysPager', nil);TBHWND :=FindWindowEx(TBHWND ,0,'ToolbarWindow32', nil);
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[0]) + SizeOf(Info))); ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);
if pos('QQ',StrPas(S))>0 then //如果button的TEXT中包含'QQ' SendMessage(TBHWND, TB_DELETEBUTTON, i, 0); //删除 SendMessage(TBHWND, TB_HIDEBUTTON, i, 0); //显示 SendMessage(TBHWND, TB_HIDEBUTTON, i, 1); //隐藏 Form1.Memo1.Lines.Add(StrPas(S)); //在MEMO1中记录所有button的TEXT end;
VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);CloseHandle(PRC);end;
相关的消息:TCM_ADJUSTRECT TB_ADDBITMAPTCM_DELETEALLITEM TB_ADDBUTTONS TB_GETMAXSIZE TB_SAVERESTORETCM_DELETEITEM TB_ADDSTRING TB_GETOBJECT TB_SETANCHORHIGHLIGHTTCM_DESELECTALL TB_AUTOSIZE TB_GETPADDING TB_SETBITMAPSIZETCM_GETCURFOCUS TB_BUTTONCOUNT TB_GETRECT TB_SETBUTTONINFOTCM_GETCURSEL TB_BUTTONSTRUCTSIZE TB_GETROWS TB_SETBUTTONSIZETCM_GETEXTENDEDSTYLE TB_CHANGEBITMAP TB_GETSTATE TB_SETBUTTONWIDTHTCM_GETIMAGELIST TB_CHECKBUTTON TB_GETSTYLE TB_SETCMDIDTCM_GETITEM TB_COMMANDTOINDEX TB_GETTEXTROWS TB_SETDISABLEDIMAGELISTTCM_GETITEMCOUNT TB_CUSTOMIZE TB_GETTOOLTIPS TB_SETEXTENDEDSTYLETCM_GETITEMRECT TB_DELETEBUTTON TB_HIDEBUTTON TB_SETHOTIMAGELISTTCM_GETROWCOUNT TB_ENABLEBUTTON TB_HITTEST TB_SETHOTITEMTCM_GETTOOLTIPS TB_GETANCHORHIGHLIGHT TB_INDETERMINATE TB_SETIMAGELISTTCM_HIGHLISHTITEM TB_GETBITMAP TB_INSERTBUTTON TB_SETINDENTTCM_HITTEST TB_GETBITMAPFLAGS TB_INSERTMARKHITTEST TB_SETINSERTMARKTCM_INSERTITEM TB_GETBUTTON TB_ISBUTTONCHECKED TB_SETINSERTMARKCOLORTCM_REMOVEIMAGE TB_GETBUTTONINFO TB_ISBUTTONENABLED TB_SETMAXTEXTROWSTCM_SETCURFOCUS TB_GETBUTTONSIZE TB_ISBUTTONHIDDEN TB_SETPADDINGTCM_SETCURSEL TB_GETBUTTONTEXT TB_ISBUTTONHIGHLIGHTED TB_SETPARENTTCM_SETEXTENDEDSTYLE TB_GETDISABLEDIMAGELIST TB_ISBUTTONINDETERMINATE TB_SETROWSTCM_SETIMAGELIST TB_GETEXTENDEDSTYLE TB_ISBUTTONPRESSED TB_SETSTATETCM_SETITEM TB_GETHOTIMAGELIST TB_LOADIMAGES TB_SETSTYLETCM_SETITEMEXTRA TB_GETHOTITEM TB_MAPACCELERATOR TB_SETTOOLTIPSTCM_SETITEMSIZE TB_GETIMAGELIST TB_MARKBUTTONTCM_SETMINTABWIDTH TB_GETINSERTMARK TB_MOVEBUTTONTCM_SETPADDING TB_GETINSERTMARKCOLOR TB_PRESSBUTTONTCM_SETTOOLTIPS TB_GETITEMRECT TB_REPLACEBITMAP
相关阅读 >>
Delphi strtoint 将“字符型”转换成“整数型”
Delphi xe5 android 解决ide真机调试不起问题
Delphi2010中Delphi class explorer妙用
更多相关阅读请进入《Delphi》频道 >>