我需要获得任务栏的宽度和高度。我还需要任务栏的位置。我怎么能得到这个?
答案 0 :(得分:8)
根据您需要的信息,您可能需要查看Forms.TScreen.WorkAreaRect,因为识别出的工作区不仅会减去 TaskBar,还会减去其他任何“栏“可能会限制可用的桌面空间。
您可以在代码中使用Screen.WorkAreaRect
,因为Screen: TScreen
单位中声明了Forms
变量,并由VCL初始化。
答案 1 :(得分:7)
好吧,因为这个问题是关于如何获得任务栏坐标的,所以我决定发布另一个版本的方法来实现这一点,方法是使用带有SHAppBarMessage消息参数的ABM_GETTASKBARPOS函数。 />
我发布了两个版本;一个有一个没有给定任务栏句柄。请注意,如果您要发送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;
请注意,此版本(未指定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;
答案 2 :(得分:2)
这就是我所拥有的(在Win95十年中制作;-)并且仍然有效):
以下是代码:
const
W95_EXPLORERCLASSNAME = 'Shell_TrayWnd';
function GetTaskBarBounds : TRect;
begin
GetWindowRect( FindWindow( W95_EXPLORERCLASSNAME, '' ), Result );
end;
function GetTaskBarSize : TPoint;
var
TaskBarBounds : TRect;
begin
TaskBarBounds:=GetTaskBarBounds;
with( TaskBarBounds ) do
Result:=Point( Right - abs( Left ), Bottom - abs( Top ) );
end;
function GetTaskBarAlignment : TAlign;
var
TaskBarBounds : TRect;
begin
Result:=alNone;
if( FindWindow( W95_EXPLORERCLASSNAME, '' ) > 0 ) then
begin
TaskBarBounds:=GetTaskBarBounds;
with( TaskBarBounds ) do
// At Left or at top of screen ?
if( Left <= 0 ) and ( Top <= 0 ) then
begin
if( Bottom >= 480 ) then
Result:=alLeft
else Result:=alTop;
end
else begin
if( Left <= 0 ) then
Result:=alBottom
else Result:=alRight;
end;
end;
end;
答案 3 :(得分:0)
以下是如何获得方向
type
TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT, _NONE);
function GetTaskBarPos: TTaskBarPos;
var
hTaskbar: HWND;
T: TRect;
scrW, scrH: integer;
begin
hTaskBar := FindWindow('Shell_TrayWnd', nil);
if hTaskbar <> 0 then
begin
GetWindowRect(hTaskBar, T);
ScrW := Screen.Width;
ScrH := Screen.Height;
if (T.Top > scrH div 2) and (T.Right >= scrW) then
Result := _BOTTOM
else if (T.Top < scrH div 2) and (T.Bottom <= scrW div 2) then
Result := _TOP
else if (T.Left < scrW div 2) and (T.Top <= 0) then
Result := _LEFT
else
if T.Left >= ScrW div 2 then
Result := _RIGHT;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
TaskBarPos: TTaskBarPos;
begin
TaskBarPos := GetTaskBarPos;
case TaskBarPos of
_LEFT: ShowMessage('Left Position');
_TOP: ShowMessage('Top Position');
_RIGHT: ShowMessage('Right Position');
_BOTTOM: ShowMessage('Bottom Position');
end;
end;
答案 4 :(得分:0)
我从http://www.delphitips.net/2007/08/26/taskbar-position获得了此代码我试过这个并且工作正常。它甚至可以改变任务栏的大小。
代码放在下面。
procedure TForm1.Button1Click(Sender: TObject);
var
hTaskbar: HWND;
T: TRect;
ScrW, ScrH: Integer;
begin
ScrW := Screen.Width;
ScrH := Screen.Height;
hTaskBar := FindWindow('Shell_TrayWnd', nil);
GetWindowRect(hTaskBar, T);
if (T.Top > ScrH div 2) and (T.Right >= ScrW) then
ShowMessage('Bottom of the screen')
else if (T.Top < ScrH div 2) and (T.Bottom <= ScrW div 2) then
ShowMessage('Top of the screen')
else if (T.left < ScrW div 2) and (T.Top <= 0) then
ShowMessage('Left side of the screen')
else
ShowMessage('Right side of the screen');
end;