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;