相关疑难解决方法(0)

将击键发送到特定窗口(在后台),但同时执行其他操作

这段代码(灵感来自哪个是在 Python 上模拟键盘和鼠标的最简单方法?)打开一个记事本并每秒发送 A、B、C、D、...、Z 键:

import win32com.client, time
shell = win32com.client.Dispatch("WScript.Shell")
shell.Run('Notepad')
time.sleep(1)
shell.AppActivate("Notepad")
for i in range(65,91):
    shell.SendKeys(chr(i))
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

我想让这个操作在后台继续,继续我在计算机上的工作,并将击键发送到记事本(在后台)

问题:如果我同时打开另一个应用程序(例如:浏览器),击键将被发送到当前活动窗口,这是我不想要的!

问题:即使此应用程序不在前台,如何让 Python将击键发送到 notepad.exe ?

上下文:我正在自动化一些长期任务,要求我的 Python 脚本app.exe在大约 15 分钟内向(在后台)发送击键,但同时我想用计算机做其他事情。

注意:更一般地说,我感兴趣的用例是进程 app.exe 可能打开对话框、关闭对话框、打开其他窗口的情况,因此解决方案应该能够将击键发送到进程活动窗口. 因此,像这里这样具有固定 hWnd 的解决方案不能直接工作。

python windows user-interface winapi automation

5
推荐指数
1
解决办法
8860
查看次数

SendMessage用于将密钥直接发送到另一个窗口?

我正在尝试SendMessage将键盘输入发送到另一个窗口.我知道缺点,但我必须这样做,因为我必须发送几个键,我不能保证窗口将有焦点 - 所以当窗口没有焦点时这必须工作.

我正在通过尝试将密钥发送到记事本窗口来测试它.我尝试了以下变化,但没有一个有效:

def post_keys1(hwnd):
    win32api.SendMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_CHAR, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.SendMessage(
        hwnd, win32con.WM_KEYUP, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))

def post_keys2(hwnd):
    win32api.PostMessage(
        hwnd, win32con.WM_KEYDOWN, ord('A'),
        0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
    win32api.PostMessage(
        hwnd, …
Run Code Online (Sandbox Code Playgroud)

python winapi input pywin32

2
推荐指数
1
解决办法
1万
查看次数

win32gui.FindWindow找不到窗口

我正在尝试使用Pywin32向无效的TeraTerm窗口发送击键.

这个答案让我写了这段代码:

import win32gui
import win32con
import win32api

hwndMain = win32gui.FindWindow("Tera Term VT", None)
print hwndMain
hwndChild = win32gui.GetWindow(hwndMain, win32con.GW_CHILD)
win32api.PostMessage(hwndChild, win32con.WM_CHAR, 0x5b, 0)
Run Code Online (Sandbox Code Playgroud)

但是:
hwndMain = win32gui.FindWindow("Tera Term VT", None)返回0,它找不到窗口.

如果我换"Tera Term VT""Notepad",我很乐意整天将键击发送到活动的记事本窗口.那么,为什么我不能进入TeraTerm窗口?

根据ActiveState文档:

PyHANDLE = FindWindow(ClassName,WindowName)

ClassName:PyResourceId要查找的窗口类的名称或原子,可以是None
WindowName:string要查找的窗口的标题,可以是None

那么如何才能使用正确的ClassName呢?

我已经尝试了几乎每一个变化Tera Term VT,逃避空间:"Tera\ Term\ VT"用单引号括起整个:"'Tera Term VT'"但是没有任何作用.我甚至尝试使用进程的名称:"ttermpro.exe",并"COM11:115200baud - Tera Term VT"在绝望中将子名称包含在字符串中,但没有任何作用.

有趣的是,这个:

import win32com.client

shell = win32com.client.Dispatch("WScript.Shell")
shell.AppActivate("Tera Term …
Run Code Online (Sandbox Code Playgroud)

python windows winapi pywin32 teraterm

2
推荐指数
1
解决办法
9758
查看次数