这个问题和我以前如何得到任务栏按钮的矩形一样啊~~~~~~~~~<br>一定有某个没有公开的东西可以做到,不过根据现有的资料无法用简单的方式得到的,可以采取一个笨办法来做到:<br>首先我们可以很轻松找到SysTray的句柄,用FindWindowEx就可以了,这个不用多说,找到之后,你会发现他其实是一个标准的Toolbar,这样就很简单了,我们可以用ToolbarMessage来做既可:<br>首先发送TB_BUTTONCOUNT信息得到Button Count,做一个循环:<br>for i:=0 to Count - 1 do<br>begin<br> 发送TB_GETBUTTON,得到第I个Button的Command ID;<br> 发送TB_GETBUTTONTEXT,得到第I个Button的Caption;<br> 判断Caption,如果是我们指定的Button则<br> begin<br> 发送TB_GETITEMRECT,得到第I个Button的RECT;<br> 退出;<br> end;<br>end;<br><br>需要注意的是,使用上面的消息,所使用的内存空间必须在Shell之内,利用ReadProcessMemoery和WriteProcessMemory既可。<br>具体的代码自己写吧,我给出我取Taskbar Button的Rect的代码供参考:<br>我修改了一下,应该可以使用:<br><br>uses CommCtrl;<br><br>function GetSysTrayWnd: HWND;<br>begin<br> Result := FindWindow('Shell_TrayWnd', nil);<br> Result := FindWindowEx(Result, 0, 'TrayNotifyWnd', nil);<br> Result := FindWindowEx(Result, 0, 'SysPager', nil);<br> Result := FindWindowEx(Result, 0, 'ToolbarWindow32', nil);<br>end;<br><br>function GetTaskBarButtonRect(Title: string): TRect;<br>{<br> 返回指定Title的窗口按钮在任务栏的按钮的矩形区域<br> 例如返回当前程序的任务栏按钮矩形:<br> GetTaskBarButtonRect(Application.Title);<br>}<br>var<br> h: HWND;<br> C, i: integer;<br> Info: _TBBUTTON;<br> Item: tagTCITEM;<br> Buff: PChar;<br> S: array[0..1024] of char;<br> PID: THandle;<br> PRC: THandle;<br> R: Cardinal;<br>begin<br> FillChar(Result, SizeOf(Result), 0);<br> H := GetSysTrayWnd;<br> if H = 0 then Exit;<br> GetWindowThreadProcessId(H, @PID);<br> PRC := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, PID);<br> Buff := VirtualAllocEx(PRC, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);<br><br> if Format('%d.%d',[Win32MajorVersion,Win32MinorVersion]) >= '5.1' then // Is Windows XP or Higher<br> begin<br> C := SendMessage(H, TB_BUTTONCOUNT, 0, 0);<br> for i := 0 to C - 1 do<br> begin<br> FillChar(Info, SizeOf(Info), 0);<br> WriteProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);<br><br> SendMessage(H, TB_GETBUTTON, i, integer(Buff));<br> ReadProcessMemory(PRC, Buff, @Info, SizeOf(Info), R);<br><br> SendMessage(H, TB_GETBUTTONTEXT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));<br> ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @S[0], SizeOf(S), R);<br> Form1.Memo1.Lines.Add(StrPas(S));<br> if SameText(StrPas(S), Title) and not Boolean(SendMessage(H, TB_ISBUTTONHIDDEN, Info.idCommand, 0)) then<br> begin<br> SendMessage(H, TB_GETRECT, Info.idCommand, integer(integer(@Buff[0]) + SizeOf(Info)));<br> ReadProcessMemory(PRC, Pointer(integer(@Buff[0]) + SizeOf(Info)), @Result, SizeOf(Result), R);<br><br> Windows.ClientToScreen(H, Result.TopLeft);<br> Windows.ClientToScreen(H, Result.BottomRight);<br><br> Break;<br> end;<br> end;<br> end<br> else<br> begin<br> C := SendMessage(H, TCM_GETITEMCOUNT, 0, 0);<br> for i := 0 to C - 1 do<br> begin<br> with Item do<br> begin<br> mask := TCIF_TEXT;<br> dwState := 0;<br> dwStateMask := 0;<br> cchTextMax := 2048;<br> pszText := PChar(integer(Buff) + SizeOf(Item) * 4);<br> iImage := 0;<br> lParam := 0;<br> end;<br> WriteProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);<br> SendMessage(H, TCM_GETITEM, i, Integer(Buff));<br><br> ReadProcessMemory(PRC, Buff, @Item, SizeOf(Item), R);<br> ReadProcessMemory(PRC, PChar(integer(Buff) + SizeOf(Item) * 4), @S[0], SizeOf(S), R);<br><br> if SameText(S, Title) then<br> begin<br> SendMessage(H, TCM_GETITEMRECT, i, integer(Buff));<br> ReadProcessMemory(PRC, Buff, @Result, SizeOf(Result), R);<br><br> Windows.ClientToScreen(H, Result.TopLeft);<br> Windows.ClientToScreen(H, Result.BottomRight);<br> Break;<br> end;<br> end;<br> end;<br><br> VirtualFreeEx(PRC, Buff, 0, MEM_RELEASE);<br> CloseHandle(PRC);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> DrawAnimatedRects(Handle, IDANI_CAPTION, BoundsRect, GetTaskBarButtonRect('音量'));<br>end;<br><br>