gpt4 book ai didi

delphi - 从系统托盘图标定位表单

转载 作者:行者123 更新时间:2023-12-02 05:32:51 25 4
gpt4 key购买 nike

我想显示系统托盘图标事件的表单,该表单仅在任务栏旁边显示一些信息,并在一段时间后自行消失。我遇到的主要问题是将表单定位在正确的位置并且可见。我找到了几种方法来确定图标的位置,但在测试中我发现它们根据操作系统不一致(我在另一个应用程序中尝试过这一点,最终放弃并使用居中模式形式)。例如:

procedure GetWorkAreaRect(var outrect: TRect);
// returns the dimensions of the work area.
begin
Systemparametersinfo(SPI_GETWORKAREA, 0, @outrect, 0);
end;

当它起作用时,问题是确定将表单放在哪里(上、下、左、右)。有什么建议吗?

编辑:问题在于定位表单与系统托盘图标的关系,不一定确定系统托盘图标的位置。我又进行了一次尝试,只要满足某些条件,它就可以工作。最值得注意的是,如果任务栏设置为自动隐藏,它将不起作用,因为假设单击是在工作区域之外进行的。当表单设置为自动隐藏时,情况并非如此。

function PositionForm(X, Y, Width, Height: Integer): TPoint;
// receives mouse-click position in X and Y, form width and height in width and height
// returns Left and Top in TPoint.X and TPoint.Y.
var
workrect: TRect;
resrect: TPoint;
begin
GetWorkAreaRect(workrect);
if Y > WorkRect.Bottom then // taskbar is on bottom
begin
resRect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Bottom - Height;
end
else
if X > WorkRect.Right then // taskbar is on right
begin
resrect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Bottom - Height;
end
else
if X < WorkRect.Left then // taskbar is on left
begin
resrect.X := WorkRect.Left;
resrect.Y := WorkRect.Bottom - Height;
end
else
if Y < WorkRect.Top then // taskbar is on top
begin
resrect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Top;
end;
Result := ResRect;
end;

所以从表面上看,问题似乎是找到一种独立的方法来确定任务栏所在的位置......或者可以扩展上面的逻辑来处理这个问题吗?

最佳答案

当您的通知图标收到与操作相对应的消息时,您可以在该点进行查询以找出屏幕上的关联点。

例如,如果您在图标的消息过程中处理 WM_RBUTTONUPWM_CONTEXTMENU 等,则可以调用 GetMessagePos找出与消息关联的图标上的位置。

我用以下函数将其包装起来,以便可以将消息解码为 TPoint:

function MessagePoint: TPoint;
begin
Result := TSmallPoint(GetMessagePos());
end;

所以你可以做的是,在你的图标的消息过程中,记下这一点。当您需要显示表单时,请使用此点来确定图标所在的位置。由于该点可能位于任务栏中,因此您需要将其剪切到工作区域中。

<小时/>

您的问题更新后,您似乎想知道如何找到任务栏的位置。通过调用 SHAppBarMessage 传递 ABM_GETTASKBARPOS 来实现这一点。

关于delphi - 从系统托盘图标定位表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com