python - win32gui.FindWindow 找不到窗口

标签 python windows winapi pywin32 teraterm

我正在尝试使用 Pywin32 将击键发送到不活动的 TeraTerm 窗口。

This回答让我写了这段代码:

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)

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

如果我将 "Tera Term VT" 更改为 "Notepad",我就可以整天愉快地将击键发送到事件的记事本窗口。那么,为什么我无法获得 TeraTerm 窗口?

根据ActiveState documentation :

PyHANDLE = FindWindow(ClassName, WindowName)

ClassName : PyResourceId Name or atom of window class to find, can be None
WindowName : string Title of window to find, can be None

那么我怎样才能使用正确的类名呢?

我已经尝试了 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 VT")
shell.SendKeys("\%i", 0)

工作正常,但将窗口带到前台,这是我不希望的。 Tera Term VT 字符串在此实例中工作正常。

最佳答案

线

shell.AppActivate("Tera Term VT")

适用于窗口标题,因此它有效。
你应该能够与

hwndMain = win32gui.FindWindow(None, "Tera Term VT")  

也就是说,交换参数以便它也基于窗口标题工作

如果你想基于窗口类名工作,你可以使用像 Spy++ 这样的工具及其 Finder Tool以 Tera Term 窗口为目标并从属性中获取其窗口类名称

关于python - win32gui.FindWindow 找不到窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970354/

相关文章:

python - OCR 阿拉伯语的 Tensorflow 模型

python - Matplotlib 和 Seaborn : Legend too long for line style

python - 当我打印 id 时,它与 "inspect element"中的 id 不匹配

windows - 批处理文件 : List all files in a directory with relative paths

java - 线程突然终止

windows - 将文件添加到文件夹时运行 .bat 文件的 Powershell 脚本

c++ - 有没有更好的方法来创建这个游戏循环? (C++/Windows )

python - 如何在 python 中正确解析 xml 注释

c++ - 如何在winapi中创建字符串数组

delphi - GetTitleBarInfo 函数不返回值