接上
骚操作,妈妈再也不用担心我看英文文献了 - 1.功能介绍
整个项目其实很简单,原理就是:
选中英文,复制到剪切板,通过百度翻译接口转换成中文,找到软件窗体句柄,发送中文,激活朗读功能。
- 选中(4声)英文,需要手动选中。
- 复制到剪切板,用的是pynput模块,它可以模拟键盘输入和鼠标点击,很强。所以只需要执行Ctrl+C键就可以完成。关于pynput不需要太深入,看 Python控制键盘鼠标pynput的详细用法 就可以了。
- 通过百度翻译接口转换成中文,直接调接口,放到下一节里面讲。
- 找到软件窗体句柄。这个需要用到spy++,可以看 Spy++ —— 窗口、消息查看分析利器 ,用python找到对应窗口句柄,可以看 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx,他这一系列的都还不错。 其中有一点要注意,找到主窗口后再找子窗口,首先你要知道子窗口(里面有文本内容的)的句柄,然后通过
my_hwnd = kids[224] #第x个是我要找的窗口
找到,每个电脑可能不一样,这需要你改动。理解了原理相信很简单。 - 发送中文到文本框。
win32api.SendMessage(my_hwnd, win32con.WM_SETTEXT, None, mystr)
可以完成。 - 激活朗读功能。相当于又按一次f1,当然你首先要设置朗读时就是f1热键激活,把其他设置全关了。有个小点要注意,先点击一下左键再按f1取消选中,这样就可以朗读文本框内容,否则会直接朗读选中的英文。(而英文读起来比较怪,听不懂)
# -*- coding: utf-8 -*-
import time
import win32gui
import win32con
import win32api
from pynput import keyboard
import pynput.mouse
import pyperclip #剪切板
from baidu_translate import translateToChinese
# mystr = "你好啊,世界!"
def sendMessageToWindow(mystr):
kids = []
count = 0
def all_ok(hwnd, param):
# global count
# print("%x "%hwnd, count, end='。');count+=1
kids.append(hwnd)
return True
parent_hwnd = win32gui.FindWindow(None,u"朗读女 8.992")
#print("parent:%x"%parent_hwnd)
win32gui.EnumChildWindows(parent_hwnd, all_ok, None)
my_hwnd = kids[224] #第x个是我要找的窗口
#print("my_hwnd:%x "%my_hwnd)
win32api.SendMessage(my_hwnd, win32con.WM_SETTEXT, None, mystr)
# print("send message,finish!")
print("译文:",mystr)
kbd = keyboard.Controller()
mouse = pynput.mouse.Controller()
def _control_C():
#control + C 复制
kbd.press(keyboard.Key.ctrl_l)
kbd.press('c')
time.sleep(0.1)
kbd.release('c')
kbd.release(keyboard.Key.ctrl_l)
def _f1():
#按下f1
kbd.press(keyboard.Key.f1)
time.sleep(0.1)
kbd.release(keyboard.Key.f1)
def on_press(key):
if key==keyboard.Key.f2:
execute()
def on_release(key):
pass
def execute():
#print("hello")
# 复制
_control_C()
#粘贴
mystr = pyperclip.paste()
print('English:', mystr)
# 翻译
chinese_str = translateToChinese(mystr)
sendMessageToWindow(chinese_str)
#点击一下防止直接念英文
mouse.click(pynput.mouse.Button.left)
#朗读
_f1()
print('==='*30,'\n')
if __name__=="__main__":
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
看英文系列【全】:
骚操作,妈妈再也不用担心我看英文文献了 - 1.功能介绍
骚操作,妈妈再也不用担心我看英文文献了 - 2.逻辑+代码
骚操作,妈妈再也不用担心我看英文文献了 - 3.翻译接口+打包执行
源码连接:
https://github.com/JizhiXiang/bestEngToChiSpeaker
【感觉有意思,点个赞呗,算对我分享东西的肯定,thx】