sabro
2009年11月09日 03:45
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python本体はこちらから
# http://www.python.org/download/
# Windows用拡張はこちらから
# http://sourceforge.net/projects/pywin32/
#
# エラーチェックとかしてないです
# speak.py [filename]
# 例:
# C:\Python26\python speak.py chat.txt
# 改版履歴
# クリップボード廃止後のバージョンに対応(.NET v1.69でのみ確認)
# 環境設定→その他 ENTERで再生&クリア にチェックしてください
# 無用なファイルのオープンクローズを撤廃
# アバターの通常発言のみをSoftTalkへ送る(というか 名前 苗字 な形だけ)
import os, sys, time, codecs, array, struct
import win32clipboard as w32cb
import win32con as wc
import win32gui as wg
class tail():
lmtime = None;
delay = 0.05; # Windowsのタスクスライスが50msなので
def __init__(self, filename):
self.filename = filename
f = open(self.filename)
f.seek(0, 2);
self.pos = f.tell()
def makeString(self, str):
try:
if (False): # 特定の人の発言のみSoftTalkに送る場合は True にする
# 特定の人の場合
s = str.split('Kobun Footpad: ', 1)[1]
pass
else:
# だれでも
p, s = str.split(': ', 1)
if (len(p.split(' ')) != 5):
s = None
except:
s = None
return s
def run(self):
self.file = codecs.open(self.filename, 'r', 'utf-8')
while True:
time.sleep(self.delay)
stat = os.stat(self.filename)
if stat.st_mtime != self.lmtime:
self.lmtime = stat.st_mtime
self.read()
self.file.close()
def read(self):
self.file.seek(self.pos, 0)
s = self.file.read();
self.pos = self.file.tell()
if s:
s = self.makeString(s)
if s:
if (False):
# SoftTalk v 1.47 or earlier
w32cb.OpenClipboard()
w32cb.EmptyClipboard()
w32cb.SetClipboardText(s)
w32cb.CloseClipboard()
else:
# SOfTalk v1.48 or later (tested on .NET v1.69 only)
# find SoftTalk target window
hwnd = wg.FindWindowEx(wg.FindWindow('WindowsForms10.Window.8.app.0.378734a', 'SofTalk'),
0, 'WindowsForms10.EDIT.app.0.378734a', None)
if (hwnd):
wg.SendMessage(hwnd, wc.WM_SETTEXT, 0, s.encode('cp932', 'ignore'))
wg.PostMessage(hwnd, wc.WM_KEYDOWN, wc.VK_RETURN, 0)
#<NOT USED># wg.PostMessage(hwnd, wc.WM_CHAR, wc.VK_RETURN, 0x001c0001)
#<NOT USED># wg.PostMessage(hwnd, wc.WM_KEYUP, wc.VK_RETURN, 0x001c0001)
if __name__ == "__main__":
tail(sys.argv[1]).run()