获取任务栏位置?

时间:2011-07-03 19:27:03

标签: delphi taskbar system-tray

我的主应用程序隐藏了:

Application.ShowMainForm:= False;

应用程序使用TTrayIcon,我已将弹出菜单分配给。

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

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

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

提前致谢。

3 个答案:

答案 0 :(得分:8)

使用SHAppBarMessage获取任务栏的位置:

SHAppBarMessage(ABM_GETTASKBARPOS, appBarData);

这与“主要”监视器的大小一起:

nScreenWidth := GetSystemMetrics(SM_CXSCREEN);
nScreenHeight := GetSystemMetrics(SM_CYSCREEN);

如果任务栏位于

,您可以解决问题
屏幕的

及其大小。

{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;

enter image description here

答案 1 :(得分:5)

在Windows 7上,您可以拨打Shell_NotifyIconGetRect()

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

答案 2 :(得分:-3)

在运行时创建TForm

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

但主要是设置WindowState:=wsMaximized;visible:=FALSE; 然后通过任务栏的位置,只需获得该表单的顶部\ left \ width \ height

然后只需通过此引用调整您的应用程序位置;