我正在尝试使我的 GUI 程序与 Windows 屏幕的右下角对齐。当任务栏没有隐藏的时候,我的程序就会站在任务栏上面!
使用Python/PyQT/Win32时,我该如何:
正如 David Heffernan 提到的,您可以使用
GetMonitorInfo
和 pywin32
来检索工作区域大小,或不包括任务栏的桌面大小。然后,您可以从桌面高度减去工作区域高度以获得任务栏大小。
获取任务栏高度:
from win32api import GetMonitorInfo, MonitorFromPoint
monitor_info = GetMonitorInfo(MonitorFromPoint((0,0)))
monitor_area = monitor_info.get("Monitor")
work_area = monitor_info.get("Work")
taskbar_height = monitor_area[3]-work_area[3]
print("The taskbar height is {}.".format(taskbar_height))
任务栏高度为40。
首先,我们需要创建一个引用主监视器的句柄。主显示器的左上角始终位于 0,0,因此我们可以使用:
primary_monitor = MonitorFromPoint((0,0))
我们使用
GetMonitorInfo()
检索有关显示器的信息。
monitor_info = GetMonitorInfo(primary_monitor)
# {'Monitor': (0, 0, 1366, 768), 'Work': (0, 0, 1366, 728), 'Flags': 1, 'Device': '\\\\.\\DISPLAY1'}
监视器信息以
dict
形式返回。前两个条目将监视器尺寸和工作区域尺寸表示为元组(x 位置、y 位置、高度、宽度)。
work_area = monitor_info.get("Monitor")
# (0, 0, 1366, 768),
work_area = monitor_info.get("Work")
# (0, 0, 1366, 728)
获取带任务栏和不带任务栏的桌面尺寸后,找出差值即可获得任务栏高度,
height = monitor_area[3]-work_area[3]
# 40
我认为您需要调用 GetMonitorInfo 来获取感兴趣的监视器。 然后,您需要从 MONITORINFO.rcWork 中读取工作区。 这将排除为任务栏保留的监视器的任何部分以及任何其他保留区域。
我认为您不需要担心自动隐藏,因为 GetMonitorInfo 应该考虑到这一点。 换句话说,当启用自动隐藏时,工作区域将等于监视器区域。
您可以使用
QDesktopWidget
检索有关系统屏幕的信息,并从总屏幕区域中减去工作区域。
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
dw = app.desktop() # dw = QDesktopWidget() also works if app is created
taskbar_height = dw.screenGeometry().height() - dw.availableGeometry().height()
但是,如果任务栏位于屏幕两侧,则这将返回零,这并不是特别有帮助。要解决此问题,请找出
screenGeometry()
和 availableGeometry()
之间的差异,以找到任务栏(以及任何其他保留空间)的大小。
当任务栏设置为自动隐藏时,可用的几何形状不知道任务栏的大小。
这就是我使用内置 ctypes 库的方法
from ctypes import windll, wintypes, byref
SPI_GETWORKAREA = 0x0030
# This var will receive the result to SystemParametersInfoW
desktopWorkingArea = wintypes.RECT()
_ = windll.user32.SystemParametersInfoW(SPI_GETWORKAREA,0,byref(desktopWorkingArea),0)
left = desktopWorkingArea.left
top = desktopWorkingArea.top
right = desktopWorkingArea.right
bottom = desktopWorkingArea.bottom
通过任务栏获取全屏值可以像这样简单
x,y = windll.user32.GetSystemMetrics(0), windll.user32.GetSystemMetrics(1)
对我来说
print(left,top,right,bottom)
print(x,y)
0 0 5120 1400
5120 1440
所以我的任务栏位于 Y 轴上,40px。