Delphi 获得任务栏位置?

Delphi 获得任务栏位置?,delphi,taskbar,system-tray,Delphi,Taskbar,System Tray,我使用以下方法隐藏了我的主应用程序: Application.ShowMainForm:= False; 该应用程序使用了我指定的弹出菜单的TTrayIcon 通过使用并选择任务栏图标中的一个弹出菜单,我希望使我的应用程序再次可见,但我希望应用程序的位置在任务栏上方弹出 默认情况下,Windows任务栏位于底部,因此在这种情况下,我的应用程序将显示在时钟上方的右下角-当然,任务栏可以由用户移动和调整大小,因此我需要一种明确了解这些指标的方法 简单地说,我希望我的应用程序出现在任务栏的角落,在系

我使用以下方法隐藏了我的主应用程序:

Application.ShowMainForm:= False;
该应用程序使用了我指定的弹出菜单的TTrayIcon

通过使用并选择任务栏图标中的一个弹出菜单,我希望使我的应用程序再次可见,但我希望应用程序的位置在任务栏上方弹出

默认情况下,Windows任务栏位于底部,因此在这种情况下,我的应用程序将显示在时钟上方的右下角-当然,任务栏可以由用户移动和调整大小,因此我需要一种明确了解这些指标的方法

简单地说,我希望我的应用程序出现在任务栏的角落,在系统时钟的上方(或旁边)

提前感谢。

在Windows 7上,您可以致电

在早期版本的Windows上,您所能做的就是使用相当怪异的黑客。

在Windows 7上,您可以调用

在早期版本的Windows上,您所能做的就是使用相当怪异的黑客操作。

用于获取任务栏的位置:

SHAppBarMessage(ABM_GETTASKBARPOS, appBarData);
与“主”监视器的大小一起:

您可以计算出任务栏是否位于

  • 底部
屏幕的大小

{Calculate taskbar position from its window rect. However,
 on XP it may be that the taskbar is slightly larger or smaller than the
 screen size. Therefore we allow some tolerance here.
}
if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) and
        NearlyEqual(rcTaskbar.Right, nScreenWidth, TASKBAR_X_TOLERANCE) then
begin
    // Taskbar is on top or on bottom
    if NearlyEqual(rcTaskbar.Top, 0, TASKBAR_Y_TOLERANCE) then
        FTaskbarPlacement := ABE_TOP
    else
        FTaskbarPlacement := ABE_BOTTOM;
end
else
begin
    // Taskbar is on left or on right
    if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) then
        FTaskbarPlacement := ABE_LEFT
    else
        FTaskbarPlacement := ABE_RIGHT;
end;
这样,您就可以弹出祝酒词:

case FTaskbarPlacement of
ABE_RIGHT:
   begin
      Self.Left := rcTaskbar.Left-Self.Width;
      Self.Top := rcTaskbar.Bottom - Self.Height;
   end;
ABE_LEFT:
   begin
      Self.Left := rcTaskbar.Right;
      Self.Top := rcTaskbar.Bottom - Self.Height;
   end;
 ABE_TOP:
    begin
       Self.Left := rcTaskbar.Right - Self.Height;
       Self.Top := rcTaskbar.Bottom;
    end;
 else //ABE_BOTTOM
    // Taskbar is on the bottom or Invisible
    Self.Left := rcTaskbar.Right - Self.Width;
    Self.Top := rcTaskbar.Top - Self.Height;
 end;

用于获取任务栏的位置:

SHAppBarMessage(ABM_GETTASKBARPOS, appBarData);
与“主”监视器的大小一起:

您可以计算出任务栏是否位于

  • 底部
屏幕的大小

{Calculate taskbar position from its window rect. However,
 on XP it may be that the taskbar is slightly larger or smaller than the
 screen size. Therefore we allow some tolerance here.
}
if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) and
        NearlyEqual(rcTaskbar.Right, nScreenWidth, TASKBAR_X_TOLERANCE) then
begin
    // Taskbar is on top or on bottom
    if NearlyEqual(rcTaskbar.Top, 0, TASKBAR_Y_TOLERANCE) then
        FTaskbarPlacement := ABE_TOP
    else
        FTaskbarPlacement := ABE_BOTTOM;
end
else
begin
    // Taskbar is on left or on right
    if NearlyEqual(rcTaskbar.Left, 0, TASKBAR_X_TOLERANCE) then
        FTaskbarPlacement := ABE_LEFT
    else
        FTaskbarPlacement := ABE_RIGHT;
end;
这样,您就可以弹出祝酒词:

case FTaskbarPlacement of
ABE_RIGHT:
   begin
      Self.Left := rcTaskbar.Left-Self.Width;
      Self.Top := rcTaskbar.Bottom - Self.Height;
   end;
ABE_LEFT:
   begin
      Self.Left := rcTaskbar.Right;
      Self.Top := rcTaskbar.Bottom - Self.Height;
   end;
 ABE_TOP:
    begin
       Self.Left := rcTaskbar.Right - Self.Height;
       Self.Top := rcTaskbar.Bottom;
    end;
 else //ABE_BOTTOM
    // Taskbar is on the bottom or Invisible
    Self.Left := rcTaskbar.Right - Self.Width;
    Self.Top := rcTaskbar.Top - Self.Height;
 end;

在运行时创建一个TForm

还可以为透明度设置AlphaBlendValue 0,为AlphaBlend设置TRUE

但大部分设置
WindowState:=wsMaximized
可见:=假
然后,无论任务栏的位置是什么,只需获取该窗体的顶部\左侧\宽度\高度


然后只需根据此参考调整您的申请位置

在运行时创建一个TForm

还可以为透明度设置AlphaBlendValue 0,为AlphaBlend设置TRUE

但大部分设置
WindowState:=wsMaximized
可见:=假
然后,无论任务栏的位置是什么,只需获取该窗体的顶部\左侧\宽度\高度



然后只需根据此参考调整您的申请位置

即使任务栏已固定,图标也会移动。添加或删除新图标。图标可以隐藏,然后由用户显示。知道它最靠近屏幕的哪个角落就足够了吗?我猜Craig想模仿Windows Live Messenger、Windows Update等在屏幕右下角弹出的行为(至少如果你在那里有通知区——因为我总是在那里,我不知道WLM和WU如何确定使用哪个角落)@Andreas是的,你是对的,我想在任务栏角落/系统托盘区域附近弹出一个消息框或小表单。即使任务栏已固定,图标也会移动。添加或删除新图标。图标可以隐藏,然后由用户显示。知道它最靠近屏幕的哪个角落就足够了吗?我想Craig想知道麦克风显示屏幕右下角弹出的Windows Live Messenger、Windows Update等的行为(至少如果您在那里看到了通知区域——因为我总是在那里,我不知道WLM和WU如何确定使用哪个角落)@Andreas是的,你是对的,我想在任务栏角/系统托盘附近弹出一个消息框或小表单area@Andreas我猜添加它是为了减少MSDN论坛上的负载,这些论坛提出了此API函数可以回答的问题!@Andreas我猜添加它是为了减少MSDN论坛上的负载,这些论坛提出了此API函数可以回答的问题函数可以回答!+1这是查找最近角的方法,我认为这是最好的解决方案。试图找到实际的图标坐标太麻烦了。我读到他的问题是想知道任务栏在哪里-这样他就可以在通知区域(即toast)附近弹出他的应用程序。我从来都不知道可以在通知区域中获取图标的位置。(不是你真的想要的-它可以随时隐藏或移动)你需要知道一个精确位置的时间是当你右键点击时显示一个弹出菜单,但你收到的消息中包含坐标。我认为你对问题的理解是正确的。你可以使用uEdge来查找任务栏的位置。0-左,1-上,2-右,3-下。+1这是查找最近角的方法ach,我认为这是最好的解决方案。试图定位实际图标坐标太难了。我读到他的问题是想知道任务栏在哪里——这样他就可以在通知区域(即toast)附近弹出他的应用程序。我从来不知道有能力在通知区域中获取图标的位置。(并非您真正想要的-它可以随时隐藏或移动)你需要知道一个精确位置的时间是当你右键单击时显示一个弹出菜单,但你收到的消息包含坐标。我认为你对问题的理解是正确的。你可以使用uEdge查找任务栏的位置。0-左,1-上,2-右,3-下。当任务栏自动隐藏时会发生什么?操作系统似乎按照它的逻辑运行,以获得其他带有标题栏之类的窗口式程序;然后更新它;是谁让操作系统随时更改它的,因此只要程序不受此逻辑的审查,它与其他项目的特定内容无关;如任务栏;它也会失败[如果]其他程序占用了桌面的工作空间;这真的不是什么大问题;当任务栏自动隐藏时会发生什么?操作系统似乎按照其逻辑工作,以便在其他带有标题栏和