如何在Windows中弹出Printjobwindow时获得通知?

2024-09-28 22:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我们都熟悉打印窗口(比如按下ctrl+p或在某些软件上点击打印按钮)。在Python中,当打印窗口弹出时,有没有一种方法可以得到通知[捕获任何信号](当用户试图打印某些内容时)? 我尝试使用下面的代码来了解当前哪个窗口是acitve,但我假设打印窗口不属于活动窗口类别,因为没有发生任何事情

    def all_apps_running(self):
        """ looks throgh wind32processes to find all Foreground running apps """
        try:
            hwnd = ctypes.windll.user32.GetForegroundWindow()
            _, pid = win32process.GetWindowThreadProcessId(hwnd)
            exe = ""
            for p in self.c.query('SELECT Name FROM Win32_Process WHERE ProcessId = %s' % str(pid)):
                exe = p.Name
                break
        except:
            return None
        else:
            return exe
    ...

我找到了一些关于打印机事件的信息(如下面的代码,我尝试了更多),但在用户向打印机发送一些打印作业之后,这种方法就可以工作了,我需要向用户显示一个通知,与打印窗口的显示完全一致

if __name__ == "__main__":
    job = {}
    while True:
        printer_name = win.GetDefaultPrinter()
        hprinter = win.OpenPrinter(printer_name)
        job_tuple = win.EnumJobs(hprinter, 0, -1, 1)

        for job_info in job_tuple:
            job = win.GetJob(hprinter, job_info["JobId"], win.JOB_INFO_1)
            break

显然,我们有3种类型的打印弹出窗口分类:

  1. Microsoft Windows默认打印对话框窗口
  2. 任何软件的自定义打印对话框(如Word)
  3. 浏览器打印预览应用程序(如谷歌浏览器)

第1部分的解决方案来自以下堆栈溢出帖子: Get text from popup window。 这只需要一些修改:

import time, win32gui
while True:
    window = win32gui.GetForegroundWindow()
    title = win32gui.GetWindowText(window)
    if title == "Print":
        do stuff

对于第二部,特别是第三部,我仍然不知道


Tags: apps方法代码用户nameself软件job