如何使用Python/PyQT/Win32获取Windows任务栏的高度

问题描述 投票:0回答:4

我正在尝试使我的 GUI 程序与 Windows 屏幕的右下角对齐。当任务栏没有隐藏的时候,我的程序就会站在任务栏上面!

使用Python/PyQT/Win32时,我该如何:

  1. 检查任务栏自动隐藏功能是否开启
  2. 获取任务栏的高度
python windows winapi pyqt
4个回答
25
投票

正如 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

4
投票

我认为您需要调用 GetMonitorInfo 来获取感兴趣的监视器。 然后,您需要从 MONITORINFO.rcWork 中读取工作区。 这将排除为任务栏保留的监视器的任何部分以及任何其他保留区域。

我认为您不需要担心自动隐藏,因为 GetMonitorInfo 应该考虑到这一点。 换句话说,当启用自动隐藏时,工作区域将等于监视器区域。


4
投票

您可以使用

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()
之间的差异,以找到任务栏(以及任何其他保留空间)的大小。

当任务栏设置为自动隐藏时,可用的几何形状不知道任务栏的大小。


1
投票

这就是我使用内置 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。

© www.soinside.com 2019 - 2024. All rights reserved.