2016-08-16 11 views
1

J'essaye d'envoyer une frappe à une fenêtre TeraTerm inactive en utilisant Pywin32.win32gui.FindWindow Fenêtre ne trouvant pas

This réponse m'a amené à écrire ce code:

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) 

mais:
hwndMain = win32gui.FindWindow("Tera Term VT", None) retours 0, il ne trouve pas la fenêtre.

Si je change "Tera Term VT" en "Notepad", je peux envoyer des séquences de touches à une fenêtre de bloc-notes active toute la journée. Alors, pourquoi ne puis-je pas obtenir la fenêtre TeraTerm?

Selon le ActiveState documentation:

PyHANDLE = FindWindow (ClassName, NomFenêtre)

ClassName: PyResourceId Nom ou atome de classe de fenêtre pour trouver, peut être Aucun
NomFenêtre: string Titre de fenêtre pour trouver, peut être Aucun

Alors, comment puis-je obtenir le bon ClassName? e?

J'ai essayé à peu près toutes les variantes de Tera Term VT, en échappant aux espaces: "Tera\ Term\ VT", en entourant le tout en guillemets simples: "'Tera Term VT'", mais rien ne fonctionne. J'ai même essayé d'utiliser le nom du processus: "ttermpro.exe", et inclus le nom de l'enfant dans la chaîne "COM11:115200baud - Tera Term VT" dans mon désespoir, mais rien ne fonctionne.

Fait intéressant, ceci:

import win32com.client 

shell = win32com.client.Dispatch("WScript.Shell") 
shell.AppActivate("Tera Term VT") 
shell.SendKeys("\%i", 0) 

fonctionne très bien, mais apporte la fenêtre au premier plan, que je ne wan't. La chaîne Tera Term VT fonctionne bien dans ce cas cependant.

Répondre

3

La ligne

shell.AppActivate("Tera Term VT") 

ouvrages sur le titre de la fenêtre et donc cela fonctionne.
Vous devriez pouvoir la même chose avec

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

qui est, en échangeant les arguments pour qu'il fonctionne également sur le titre de la fenêtre

Si vous voulez travailler sur la base du nom de la classe de fenêtre pourrait utiliser un outil comme Spy ++ avec son Finder Tool pour cibler la fenêtre Tera Term et obtenir son nom de classe de fenêtre à partir des propriétés

+0

Hélas, l'échange des arguments n'aide pas. Je vais étudier l'outil Finder. bien que. Merci. – SiHa

+0

Ensuite, le titre ne correspondait pas exactement à "Tera Term VT" à ce moment-là je suppose - peut-être que vous pouvez fournir une capture d'écran de la fenêtre. Néanmoins, une solution basée sur le nom de classe de la fenêtre est préférable, car l'application peut changer le titre à tout moment. – DAXaholic

+0

Merci, j'ai appris quelque chose aujourd'hui; Les classes de fenêtres sont nouvelles pour moi! Téléchargé [WinSpy ++] (http://www.pendriveapps.com/winspy-find-window-properties/), et trouvé que la classe est, en fait 'VTWin32', et cela fonctionne parfaitement. – SiHa