win32gui.FindWindow 找不到窗口

Posted

技术标签:

【中文标题】win32gui.FindWindow 找不到窗口【英文标题】:win32gui.FindWindow Not finding window 【发布时间】:2016-12-22 13:26:53 【问题描述】:

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

类名:PyResourceId 要查找的窗口类的名称或原子,可以是 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 字符串在这种情况下可以正常工作。

【问题讨论】:

【参考方案1】:

线

shell.AppActivate("Tera Term VT")

适用于窗口标题,因此它有效。 您应该可以使用

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

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

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

【讨论】:

唉,交换参数没有帮助。我将调查 Finder 工具。尽管。谢谢。 然后我猜当时标题与“Tera Term VT”不完全匹配-也许您可以提供窗口的屏幕截图。不过,无论如何,基于窗口类名的解决方案会更好,因为应用程序可能随时更改标题。 谢谢,我今天学到了一些东西;窗口类对我来说是新的!下载了WinSpy++,发现Class其实是VTWin32,这样就完美了。

以上是关于win32gui.FindWindow 找不到窗口的主要内容,如果未能解决你的问题,请参考以下文章

python win32gui 查找子窗口

win32gui findwindow 不工作 win7

python控制窗口显示隐藏

python控制窗口缩放

python控制窗口口字形运动

python控制窗口对角线运动