根据你所需要的是信息,你可能想看看Forms.TScreen.WorkAreaRect,因为工作区域确定这样减去不仅在任务栏上,而且任何其他"栏"可能会限制可用的桌面空间.
您可以简单地使用Screen.WorkAreaRect代码,因为Screen: TScreen变量在Forms单元中声明并由VCL初始化.
小智 7
好吧,因为这个问题是关于如何获得任务栏坐标的,所以我决定通过使用带有ABM_GETTASKBARPOS消息参数的SHAppBarMessage函数发布另一个版本的方法来实现这一点.
我发布了两个版本; 一个有一个没有给定任务栏句柄.请注意,如果要发送ABM_GETTASKBARPOS消息,则应在APPBARDATA结构中指定hWnd成员,如ABM_GETTASKBARPOS描述中所述.所以第一个版本对于这种情况是安全的.第二个虽然有效,但它是正式错误的.
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
Data: TAppBarData;
begin
Data.hWnd := FindWindow('Shell_TrayWnd', nil);
Data.cbSize := SizeOf(TAppBarData);
if Data.hWnd <> 0 then
if SHAppBarMessage(ABM_GETTASKBARPOS, Data) = 1 then
ShowMessage(
'Left: ' + IntToStr(Data.rc.Left) + 'px ; ' +
'Top: ' + IntToStr(Data.rc.Top) + 'px ; ' +
'Width: ' + IntToStr(Data.rc.Right - Data.rc.Left) + 'px ; ' +
'Height: ' + IntToStr(Data.rc.Bottom - Data.rc.Top) + 'px'
);
end;
Run Code Online (Sandbox Code Playgroud)
请注意,此版本(未指定TAppBarData.hWnd成员)可以正常工作,但根据MSDN,它是错误的.
procedure TForm1.Button2Click(Sender: TObject);
var
Data: TAppBarData;
begin
Data.cbSize := SizeOf(TAppBarData);
if SHAppBarMessage(ABM_GETTASKBARPOS, Data) = 1 then
ShowMessage(
'Left: ' + IntToStr(Data.rc.Left) + 'px ; ' +
'Top: ' + IntToStr(Data.rc.Top) + 'px ; ' +
'Width: ' + IntToStr(Data.rc.Right - Data.rc.Left) + 'px ; ' +
'Height: ' + IntToStr(Data.rc.Bottom - Data.rc.Top) + 'px'
);
end;
Run Code Online (Sandbox Code Playgroud)