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"と、アクティブなメモ帳ウィンドウに 1 日中喜んでキーストロークを送信できます。では、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 ツールを使用して、Tera Term ウィンドウをターゲットにし、プロパティからウィンドウ クラス名を取得できます。

于 2016-08-16T08:56:03.550 に答える