Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 任务栏宽度、高度和位置_Delphi - Fatal编程技术网

Delphi 任务栏宽度、高度和位置

Delphi 任务栏宽度、高度和位置,delphi,Delphi,我需要得到任务栏的宽度和高度。我还需要任务栏的位置。我怎样才能得到这个呢?这是你获得方向的方法 type TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT, _NONE); function GetTaskBarPos: TTaskBarPos; var hTaskbar: HWND; T: TRect; scrW, scrH: integer; begin hTaskBar := FindWindow('Shell_Tray

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

这是你获得方向的方法

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;
类型
TTaskBarPos=(顶部、底部、左侧、右侧、无);
函数GetTaskBarPos:TTaskBarPos;
变量
hTaskbar:HWND;
T:TRect;
scrW,scrH:整数;
开始
hTaskBar:=FindWindow('Shell_TrayWnd',nil);
如果hTaskbar为0,则
开始
GetWindowRect(hTaskBar,T);
ScrW:=屏幕宽度;
ScrH:=屏幕高度;
如果(T.Top>scrH第2部分)和(T.Right>=scrW),则
结果:=\u底部

否则,如果(T.Top
您只需从代码中使用
Screen.WorkAreaRect
,因为
Screen:TScreen
变量是在
表单中声明的,并由VCL初始化的。

好吧,因为这个问题是关于如何获取任务栏坐标的,我决定发布另一个版本,说明如何使用functi实现这一点使用消息参数打开。

我发布了两个版本,一个有任务栏句柄,一个没有任务栏句柄。请注意,如果您发送消息,您应该按照描述中提到的那样在结构中指定hWnd成员。因此,第一个版本在这种情况下是安全的。第二个版本可以工作,但在形式上是错误的

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;
我从中得到了这段代码,我尝试了这段代码,效果很好。即使任务栏的大小发生了变化,它也能正常工作

代码放在下面

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;
procedure TForm1.按钮1点击(发送方:TObject);
变量
hTaskbar:HWND;
T:TRect;
ScrW,ScrH:整数;
开始
ScrW:=屏幕宽度;
ScrH:=屏幕高度;
hTaskBar:=FindWindow('Shell_TrayWnd',nil);
GetWindowRect(hTaskBar,T);
如果(T.Top>ScrH第2部分)和(T.Right>=ScrW),则
ShowMessage(“屏幕底部”)
否则,如果(T.Top
  • GettaskBounds
  • 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;
const
W95_EXPLORERCLASSNAME='Shell_TrayWnd';
函数GetTaskBarBounds:TRect;
开始
GetWindowRect(FindWindow(W95_EXPLORERCLASSNAME“”),结果);
结束;
函数GetTaskBarSize:TPoint;
变量
TaskBarBounds:TRect;
开始
TaskBarBounds:=GetTaskBarBounds;
用(TaskBarBounds)do
结果:=点(右侧-abs(左侧),底部-abs(顶部));
结束;
函数GetTaskBarAlignment:TAlign;
变量
TaskBarBounds:TRect;
开始
结果:=alNone;
如果(FindWindow(W95_EXPLORERCLASSNAME,”)>0,则
开始
TaskBarBounds:=GetTaskBarBounds;
用(TaskBarBounds)do
//在屏幕的左侧还是顶部?

如果(左T变量保持任务栏的坐标,因此使用它来获取所需内容;)老实说,这感觉很不好,因为它取决于
FindWindow
。如果用户使用非标准任务栏,这将失败,如果有多个“条”,则将失败,我不确定在有多个监视器的系统上会发生什么。@daemon_x的底线是,任务栏不是用来绘制的。它是由系统所有的。不管是否有黑客行为,我都看不到编码大师david和prund 2超级英雄及时发回的解决delphi编程问题的有效解决方案。我发现你的评论ing我认为这个网站是关于多个用户在解决方案上工作,然后有人投票选出最佳解决方案,或者我错了吗?有人告诉我,这个代码不能正确地解释多个监视器。@prud的+1仍然使用findwindow,或者现在它没有错?ce iti mai place sa vrb Aiura
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;