2016-08-16 783 views
1

我试图使用Pywin32将击键发送到不活动的TeraTerm窗口。win32gui.FindWindow未找到窗口

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函数(类名,WindowName)

产品类别:PyResourceId 名称或窗口类的原子发现,可以是无
WindowName:字符串 标题的窗口找到,可以是无

那么我怎样才能得到正确的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) 

作品不错,但将窗口前台,我不wan't。尽管如此,Tera Term VT字符串在这个例子中工作正常。

回答

3

线

shell.AppActivate("Tera Term VT") 

作品的窗口标题,因此它的工作原理。
,这样它也可以根据窗口标题,您应该能够在同一与

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

就是交换参数

如果要基于窗口类名你工作可以使用类似Spy ++的工具Finder Tool来定位Tera Term窗口并从属性中获取其窗口类名称

+0

唉,交换参数并没有帮助。我将调查Finder工具。虽然。谢谢。 – SiHa

+0

那么标题与当时的“Tera Term VT”完全不符 - 我想 - 也许你可以提供窗口的截图。不过,无论如何,基于窗口类名称的解决方案会更好,因为应用程序可能随时更改标题。 – DAXaholic

+0

谢谢,我今天学到了一些东西;窗口类对我来说是新的!已下载[WinSpy ++](http://www.pendriveapps.com/winspy-find-window-properties/),并发现该类实际上是'VTWin32',并且这个工作非常完美。 – SiHa