9

我正在尝试使用 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)

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

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

根据ActiveState 文档

PyHANDLE = FindWindow(类名,窗口名)

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 VT")
shell.SendKeys("\%i", 0)

工作得很好,但把窗口带到了前台,我不希望这样。不过,在这种情况下,Tera Term VT字符串可以正常工作。

4

1 回答 1

12

线

shell.AppActivate("Tera Term VT")

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

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

也就是说,交换参数,以便它也可以根据窗口标题工作

如果您想根据窗口类名工作,您可以使用像 Spy++ 这样的工具及其Finder Tool来定位 Tera Term 窗口并从属性中获取其窗口类名

于 2016-08-16T08:56:03.550 回答