Delphi 如何使窗体像任务栏一样与屏幕边缘对齐?

Delphi 如何使窗体像任务栏一样与屏幕边缘对齐?,delphi,windows-7,delphi-xe2,toolbar,Delphi,Windows 7,Delphi Xe2,Toolbar,我正在构建一个“仪表板”应用程序,该应用程序在任何给定显示器的任何边缘都始终可见,即使其他应用程序被最大化。我不一定需要它“总是在上面”(虽然我会),但我需要让它成为屏幕的一部分,作为我自己的桌面工具栏,就像Windows任务栏一样。即使应用程序最大化,窗口也位于该区域内,使该窗口始终可见(桌面区域更小) 如何使应用程序的主窗体与屏幕边缘对齐 PS-我不需要回答所有额外的处理,如屏幕分辨率的变化。。。我只需要知道如何首先将其作为“屏幕的一部分”对齐。如果没有其他内容,您可以手动确定此信息。查看表

我正在构建一个“仪表板”应用程序,该应用程序在任何给定显示器的任何边缘都始终可见,即使其他应用程序被最大化。我不一定需要它“总是在上面”(虽然我会),但我需要让它成为屏幕的一部分,作为我自己的桌面工具栏,就像Windows任务栏一样。即使应用程序最大化,窗口也位于该区域内,使该窗口始终可见(桌面区域更小)

如何使应用程序的主窗体与屏幕边缘对齐


PS-我不需要回答所有额外的处理,如屏幕分辨率的变化。。。我只需要知道如何首先将其作为“屏幕的一部分”对齐。

如果没有其他内容,您可以手动确定此信息。查看
表单
单元中的全局
屏幕
对象,了解当前分辨率的信息。(确保检查
监视器计数
监视器
属性。)

在这一点和一些基本算法之间,设置窗体以与监视器边缘对齐应该不会太难。

您正在寻找的,这是Windows任务栏内部使用的。它涉及到创建具有特定样式的窗口,正确设置它,然后使用进行通信

它可能会变得相当复杂,但有些源代码(一个at或另一个at)提供的免费组件具有基本的shell,可以让您开始使用

第二个链接的
AppBar.pas
单元中的一个示例(根据链接的文本,它是源代码免费软件-我用它创建了一个应用程序启动程序任务栏,包括带有应用程序图标的按钮和从
.lnk
文件读取的说明):


阅读工作区,找到屏幕边缘,然后填写表格there@David我要问的是如何把它当作Windows任务栏,而不仅仅是如何把它放在那里。这是最简单的部分。困难的部分是让它成为“屏幕的一部分”,就像我说的两次。谢谢,但这是我不需要帮助的简单部分。参考Ken的答案。谢谢,这非常容易使用,并且避免了很多头痛!不幸的是,它不能让我把它拖到另一个显示器上:(它仍然能发挥作用,尽管很抱歉。)-(这一部分我无能为力。我们改用Win2K8作为服务器操作系统,并且组策略允许我们推出一个文件夹,其中包含添加到
开始
菜单的应用程序的链接,因此我没有做任何关于支持多个监视器的事情-当时只有编码人员拥有它们,我们没有使用应用程序启动器。:-)我仍然可以使用源代码并找出它:D
type
  TAppBarMessage = (abmNew, abmRemove, abmQueryPos, abmSetPos, abmGetState, 
                    abmGetTaskBarPos, abmActivate, abmGetAutoHideBar, 
                    abmSetAutoHideBar, abmWindowPosChanged);

  TAppBarEdge = (abeLeft, abeTop, abeRight, abeBottom, abeUnknown, abeFloat);

...

function TAppBar.AppBarMessage(abMessage: TAppBarMessage; 
  abEdge: TAppBarEdge; lParam: LPARAM; bRect: Boolean; var rc: TRect): UINT;
var
  abd: TAppBarData;
begin
  // Initialize an APPBARDATA structure
  abd.cbSize := sizeof(abd);
  abd.hWnd := Handle;
  abd.uCallbackMessage := WM_APPBARNOTIFY;
  abd.uEdge := Ord(abEdge);

  if bRect then
    abd.rc := rc
  else
    abd.rc := Rect(0, 0, 0, 0);

  abd.lParam := lParam;
  Result := SHAppBarMessage(Ord(abMessage), abd);

  // If the caller passed a rectangle, return the updated rectangle
  if bRect then
    rc := abd.rc;
end;