【问题标题】:pywin32 SetFocus resulting in 'Access is denied' errorpywin32 SetFocus 导致“访问被拒绝”错误
【发布时间】:2020-06-30 01:46:31
【问题描述】:

我正在创建一个将鼠标输入发送到特定窗口的脚本。我发现这样做的唯一方法是将焦点设置到窗口。如果有其他方法请解释一下。 无论如何,这是行不通的代码。

from win32gui import *
us_ip = input('Version of Minecraft: ')

minecraft_handle = FindWindow(None, f'Minecraft {us_ip}')
SetFocus(minecraft_handle)

我可以检索 HWND,但是当我运行程序时出现此错误。

Traceback (most recent call last):
  File "c:\Users\Jacob Daniels\Desktop\python\autoclicker\windows api experimentation\py.py", line 5, in <module>
    SetFocus(minecraft_handle)
pywintypes.error: (5, 'SetFocus', 'Access is denied.')

任何帮助将不胜感激。 图书馆的文档: http://timgolden.me.uk/pywin32-docs/win32_modules.html 编辑:发布错误的错误信息

【问题讨论】:

  • 在设置焦点之前尝试print(minecraft_handle)
  • @CristiFati 感谢您的回复。我这样做了,手柄按预期匹配。抱歉,我出差了,刚回来。这个问题仍然悬而未决。

标签: python windows pywin32


【解决方案1】:

根据[MS.Docs]: SetFocus function强调是我的):

将键盘焦点设置到指定窗口。 窗口必须附加到调用线程的消息队列中

...

通过使用AttachThreadInput function,线程可以将其输入处理附加到另一个线程。 这允许线程调用 SetFocus 将键盘焦点设置到附加到另一个线程的消息队列的窗口

显然,“远程”窗口没有附加到 Python 脚本(主)线程,因此需要注意(需要做一些额外的工作)。

code00.py

#!/usr/bin/env python

import sys
import win32gui as wgui
import win32process as wproc
import win32api as wapi


def main(*argv):
    if not argv:
        window_name = input("Enter window name: ")
    else:
        window_name = argv[0]

    handle = wgui.FindWindow(None, window_name)
    print("Window `{0:s}` handle: 0x{1:016X}".format(window_name, handle))
    if not handle:
        print("Invalid window handle")
        return
    remote_thread, _ = wproc.GetWindowThreadProcessId(handle)
    wproc.AttachThreadInput(wapi.GetCurrentThreadId(), remote_thread, True)
    prev_handle = wgui.SetFocus(handle)


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

输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q062649124]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py "Untitled - Notepad"
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32

Window `Untitled - Notepad` handle: 0x0000000004A520AA

Done.

不用说,记事本窗口在Cmd终端前弹出。
请注意,对于某些窗口,它可能不起作用。

【讨论】:

  • @firebanner64:这回答了你的问题吗?如果是,请接受答案,以便其他人也能够承认([SO]: What should I do when someone answers my question?)。如果没有,请告诉我如何改进它,以便它确实回答它。
  • 感谢您的回答,我是看网站才收到通知的。
  • 不幸的是,我一直在做功课,还没有机会尝试一下。但是,在查看 API 之后,我意识到我的错误。即使您的特定解决方案不起作用,我也可以自己解决。 (但我相信它会:))
  • 请注意,只有在解决了您的问题后,您才应该接受答案。我并不是想用我的评论给你施加压力,但有时在他们的问题解决后,人们会忘记这一步(这不是你的情况)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2017-06-16
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
相关资源
最近更新 更多