将变量添加到 getWindowsWithTitle 的问题

Issues Adding Variable To getWindowsWithTitle

所以我在使用 pygetwindow 的 getWindowsWithTitle 函数时遇到了问题。当我在调用 getWindowsWithTitle 之前请求输入时,出现以下错误:

Traceback (most recent call last):
  File "*****\main.py", line 79, in <module>
    handle.activate()
  File "*****\venv\lib\site-packages\pygetwindow\_pygetwindow_win.py", line 246, in activate
    _raiseWithLastError()
  File "*****\venv\lib\site-packages\pygetwindow\_pygetwindow_win.py", line 99, in _raiseWithLastError
    raise PyGetWindowException('Error code from Windows: %s - %s' % (errorCode, _formatMessage(errorCode)))
pygetwindow.PyGetWindowException: Error code from Windows: 0 - The operation completed successfully.

如果我注释掉我的 Input 调用,getWindowsWithTitle 就可以正常工作。以下是我目前的代码

import win32gui
import time
from pynput.keyboard import Key, Controller
import pygetwindow as window


target = input("** Instance Name Is The Title When You Hover Over The Application ** \nSelect Instance Name: ")
handle = window.getWindowsWithTitle('Command')[0]

keyboard = Controller()
handle.activate()
handle.maximize()
time.sleep(2)
keyboard.press('a')
keyboard.release('a')

我正在尝试获取输入以选择 window 到 select,但即使将“目标”放入 getWindowsWithTitle 也会给我同样的错误。有谁知道为什么我输入后会出现这个错误?

我简要地浏览了一下 [GitHub]: asweigart/PyGetWindow - PyGetWindow。我强烈建议不要使用它,因为它有问题(至少是当前版本):

  1. 主要的、一般的、概念上的缺陷。它使用 CTypes,但使用方式不正确。我想知道为什么没有提交很多针对它的错误。检查 了解更多详情

  2. 在您的特定情况下,会引发异常。这种行为是不正确的(你得到 错误代码 0,这意味着成功(ERROR_SUCCESS). [MS.Docs]: SetForegroundWindow function (winuser.h) 没有指定在函数失败时使用 GetLastError(不执行它应该执行的操作)。只是 window 由于上面提到的某些原因

    无法放在前面

由于您将问题标记为 PyWin32,您可以使用它。

code00.py:

#!/usr/bin/env python

import sys
import time
import pynput
import win32con as wcon
import win32gui as wgui


# Callback
def enum_windows_proc(wnd, param):
    if wgui.IsWindowVisible(wnd):
        text = wgui.GetWindowText(wnd)
        if param[0] in text.upper():
            print(wnd, text)  # Debug purposes only
            param[1].append(wnd)


def windows_containing_text(text):
    ret = []
    wgui.EnumWindows(enum_windows_proc, (text.upper(), ret))
    return ret


def send_char(wnd, char):
    kb = pynput.keyboard.Controller()
    kb.press(char)
    kb.release(char)


def main(*argv):
    txt = input("Enter text contained by window title: ")
    #txt = "notepad"
    wnds = windows_containing_text(txt)
    print(wnds)
    wnd = wnds[1]  # Notepad in my case (this example only, list might have fewer elements!!!!!)
    try:
        wgui.SetForegroundWindow(wnd)  # Activate
    except:
        print(sys.exc_info())
    wgui.ShowWindow(wnd, wcon.SW_MAXIMIZE)  # Maximize
    time.sleep(1)
    send_char(wnd, "a")


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

检查 以获取有关此 WinAPI 区域的更多详细信息。

输出:

[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q070373526]> "e:\Work\Dev\VEnvs\py_pc064_03.08.07_test0\Scripts\python.exe" code00.py
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] 064bit on win32

Enter text contained by window title: notepad
394988 e:\Work\Dev\Whosebug\q070373526\code00.py - Notepad++ [Administrator]
4264044 *Untitled - Notepad
[394988, 4264044]

Done.

并且在记事本[=49=中插入了一个“achar ] window在光标位置。