2016-08-16 6 views
1

Ich versuche, einen Tastenanschlag an ein inaktives TeraTerm-Fenster mit Pywin32 zu senden.win32gui.FindWindow Fenster nicht finden

This Antwort führte mich diesen Code zu schreiben:

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) 

aber:
hwndMain = win32gui.FindWindow("Tera Term VT", None) kehrt 0, kann es nicht das Fenster finden.

Wenn ich "Tera Term VT" zu "Notepad" ändere, kann ich Tastenanschläge glücklich den ganzen Tag zu einem aktiven Notizblockfenster senden. Warum kann ich das TeraTerm-Fenster nicht bekommen?

Nach dem ActiveState documentation:

PyHANDLE = Findwindow (Klassenname, Fenstername)

Classname: PyResourceId Name oder Atom Fensterklasse, finden Keine
Window sein: string Titel von Fenster zu finden, kann keine sein

Also wie bekomme ich den richtigen ClassName zu uns e?

Ich habe fast jede Variante von Tera Term VT versucht, die Räume zu entkommen: "Tera\ Term\ VT", das Ganze in einfache Anführungszeichen einzuschließen: , aber nichts funktioniert. Ich habe sogar versucht, den Namen des Prozesses zu verwenden: "ttermpro.exe", und enthielt den Kindnamen in der Zeichenfolge "COM11:115200baud - Tera Term VT" in meiner Verzweiflung, aber nichts funktioniert.

Interessanterweise ist diese:

import win32com.client 

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

funktioniert gut, aber bringt das Fenster in den Vordergrund, die ich nicht wan't. Der String Tera Term VT funktioniert in diesem Fall jedoch einwandfrei.

Antwort

3

Die Linie

shell.AppActivate("Tera Term VT") 

Arbeiten auf dem Fenstertitel und damit es funktioniert.
Sie sollen mit

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

bis zu derselben Lage sein, das Swapping ist, die Argumente, so dass es funktioniert auf dem Fenstertitel auch auf der Grundlage

Wenn Sie auf dem Fensterklassennamen basieren arbeiten zu können könnte ein Werkzeug wie Spy ++ mit seiner Finder Tool verwenden, um das Tera Term-Fenster zu tarnen und seinen Fensterklassennamen aus den Eigenschaften

+0

zu bekommen. Leider ist das Austauschen der Argumente nicht hilfreich. Ich werde das Finder-Tool untersuchen. obwohl. Vielen Dank. – SiHa

+0

Dann stimmt der Titel zu dieser Zeit nicht genau mit "Tera Term VT" überein - vielleicht können Sie einen Screenshot des Fensters bereitstellen. Dennoch ist eine Lösung, die auf dem Namen der Fensterklasse basiert, ohnehin besser, da die Anwendung den Titel jederzeit ändern kann. – DAXaholic

+0

Danke, ich habe heute etwas gelernt; Window Classes sind neu für mich! [WinSpy ++] heruntergeladen (http://www.pendriveapps.com/winspy-find-window-properties/), und festgestellt, dass die Klasse in der Tat 'VTWin32' ist, und das funktioniert perfekt. – SiHa