gpt4 book ai didi

python - 如何选择 Windows 客户区的特定部分显示在 Python/PyQt5/PySide2/Tkinter 任务栏的窗口缩略图中?

转载 作者:行者123 更新时间:2023-12-04 03:45:58 27 4
gpt4 key购买 nike

我想将我的应用程序窗口的特定部分(如仅框架或小部件)设置为任务栏缩略图。我找到了一个窗口 API,它是 ITaskbarList3::SetThumbnailClip here但这是在 C++ 中。我想在 python 中执行此操作。但是 PyQt5 包含一个 Qt Windows Extras 类,它不包含此功能。我还找到了显示一个示例的内容 here .This链接可能会帮助您轻松解决。由于我是初学者,我不知道如何正确地做到这一点。

编辑修复我:-

我已经尝试了问题中提供的第二个链接,我已经通过PIP 安装了comptypes 模块并且我已经复制了taskbarlib.tlb 文件来自 github因为我没有安装 Windows SDK 来生成这个文件,如答案 here 中所述.

这是我的代码。

from PyQt5.QtWidgets import *
import sys
##########----IMPORTING Comtypes module
import comtypes.client as cc
cc.GetModule('taskbarlib.tlb')
import comtypes.gen.TaskbarLib as tb
taskbar=cc.CreateObject('{56FDF344-FD6D-11d0-958A-006097C9A090}',interface=tb.ITaskbarList3)
##################
class MainUiClass(QMainWindow):
def __init__(self,parent=None):
super(MainUiClass,self).__init__(parent)
self.resize(600,400)
self.frame=QFrame(self)
self.frame.setGeometry(100,100,400,200)
self.frame.setStyleSheet('background:blue')
if __name__=='__main__':
app=QApplication(sys.argv)
GUI=MainUiClass()
GUI.show()
taskbar.HrInit()
####--This is just to check its working or not by setting a tasbar progress bar value
taskbar.SetProgressValue(GUI.winId(),40,100)
##########################################
##########This is a method to get the LP_RECT instace as per Microsoft API doc.Using Ctypes and got ctypes.wintypes.RECT object
from ctypes import POINTER, WINFUNCTYPE, windll, WinError
from ctypes.wintypes import BOOL, HWND, RECT
prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))
paramflags = (1, "hwnd"), (2, "lprect")
GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags)
newrect=GetWindowRect(int(GUI.frame.winId()))
print(newrect)
taskbar.SetThumbnailClip(int(GUI.winId()),newrect)
sys.exit(app.exec_())

我得到了从 Ctypes 模块文档中找到 LP_RECT 实例的方法。 here enter image description here但我有一个问题,我想将框架(蓝色)设置到任务栏中,我得到了这个 enter image description here

看截图,我为测试设置的 taskbarprogress 值工作正常,但缩略图部分只是意外。谁能帮我解决这个问题?

最佳答案

感谢 Eliya Duskwight 帮助我解决这个问题。我已经更正了我的代码。

这适用于 PyQt5 和 PySide2 以及 Tkinter

这是我的 PyQt5/PySide2 代码

from PyQt5.QtWidgets import *          ###For PyQt5
from PySide2.QtWidgets import * ###For PySide2
import sys
###Most Important Part###
import comtypes.client as cc
cc.GetModule('taskbarlib.tlb')
import comtypes.gen.TaskbarLib as tb
taskbar=cc.CreateObject('{56FDF344-FD6D-11d0-958A-006097C9A090}',interface=tb.ITaskbarList3)
class MainUiClass(QMainWindow):
def __init__(self,parent=None):
super(MainUiClass,self).__init__(parent)
self.resize(600,400)
self.setStyleSheet('background:red')
self.frame=QFrame(self)
self.frame.setGeometry(100,100,400,200)
self.frame.setStyleSheet('background:blue')
if __name__=='__main__':
app=QApplication(sys.argv)
GUI=MainUiClass()
GUI.show()
taskbar.HrInit()
##You need to find "hwnd" of your Window and "LP_RECT" instance of Geometry you want, as per Microsoft API Doc. using Ctypes
from ctypes.wintypes import RECT,PRECT
newrect=PRECT(RECT(0,0,600,400))
taskbar.SetThumbnailClip(int(GUI.winId()),PRECT(RECT(0,0,600,400)))

您不仅可以将此 API 用于 thumbnailclip,还可以用于各种功能,例如 ThumbnailToolTip、Taskbar Progress、Taskbar Progressbar、Taskbar Overlay Icon、Adding Buttons etc。您需要阅读界面here

>>>> 对于 Tkinter

from tkinter import *
from ctypes import windll
from ctypes.wintypes import RECT,PRECT
###Most Important Part###
import comtypes.client as cc
cc.GetModule('taskbarlib.tlb')
import comtypes.gen.TaskbarLib as tb
taskbar=cc.CreateObject('{56FDF344-FD6D-11d0-958A-006097C9A090}',interface=tb.ITaskbarList3)
root=Tk()
root.geometry("400x300")
root.config(bg="red")
frame=Frame(root,bg='blue',width=200,height=100)
frame.place(x=100,y=100)

def setThumbnail():
hwnd = windll.user32.GetParent(root.winfo_id())
print(hwnd)
taskbar.HrInit()
taskbar.SetThumbnailClip(hwnd,PRECT(RECT(0,0,60,60)))#Geometry You Want To Set
root.after(1000,setThumbnail)
root.mainloop()

我发现 root.winfo_id() 没有给出正确的 hwnd。我不知道为什么?所以我使用了 hwnd = windll.user32.GetParent(root .winfo_id()) 找到正确的。

注意:这在窗口可见后起作用,所以对于PyQt5/PySide2,应该在调用window.show() & 对于Tkinter之后调用,它应该在一段时间后被调用,因为你可以使用 root.after() 或者一些事件,你应该将 taskbarlib.tlb 文件 粘贴到你的模块文件夹中或者在你的脚本文件夹中。你也可以使用 Windows SDK 或 IDL 编译器生成它。然后安装 comtypes 模块来工作。记住

S_OK 的返回,意味着 SetThumbnailClip() 的返回始终为 0。因此除 0 之外的任何内容都是错误。这可能会使应用程序崩溃。并且根据 Microsoft API,最低要求的操作系统是 Windows7。

关于python - 如何选择 Windows 客户区的特定部分显示在 Python/PyQt5/PySide2/Tkinter 任务栏的窗口缩略图中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65146103/

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