任务栏的宽度,高度和位置

时间:2011-06-29 10:28:12

标签: delphi

我需要获得任务栏的宽度和高度。我还需要任务栏的位置。我怎么能得到这个?

5 个答案:

答案 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十年中制作;-)并且仍然有效):

  • GetTaskBarBounds
  • GetTaskBarSize
  • GetTaskBarAlignment

以下是代码:

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;