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