diff --git a/cpp/version.cmake b/cpp/version.cmake index e2d2b4a1..d92b6a01 100644 --- a/cpp/version.cmake +++ b/cpp/version.cmake @@ -1,7 +1,7 @@ set(VERSION_MAJOR 6) set(VERSION_MINOR 18) -set(VERSION_PATCH 0) +set(VERSION_PATCH 1) set(VERSION_REVISION 0) set(LUNA_VERSION "{${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_REVISION}}") add_library(VERSION_DEF ${CMAKE_CURRENT_LIST_DIR}/version_def.cpp) diff --git a/cpp/winsharedutils/CMakeLists.txt b/cpp/winsharedutils/CMakeLists.txt index 15826257..43495d95 100644 --- a/cpp/winsharedutils/CMakeLists.txt +++ b/cpp/winsharedutils/CMakeLists.txt @@ -2,7 +2,7 @@ project(winsharedutils) -add_library(winsharedutils MODULE webview2_extra.cpp AreoAcrylic.cpp screenshot.cpp ../implsapi.cpp hwnd.cpp globalmessagelistener.cpp theme.cpp version.cpp lnk.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp +add_library(winsharedutils MODULE clipboard.cpp webview2_extra.cpp AreoAcrylic.cpp screenshot.cpp ../implsapi.cpp hwnd.cpp globalmessagelistener.cpp theme.cpp version.cpp lnk.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp applicationloopbackaudio/runer.cpp applicationloopbackaudio/LoopbackCapture.cpp SimpleBrowser.cpp MWebBrowser.cpp icon.cpp ${versioninfo}) target_precompile_headers(winsharedutils REUSE_FROM pch) diff --git a/cpp/winsharedutils/clipboard.cpp b/cpp/winsharedutils/clipboard.cpp index 8104f72b..ad34dd82 100644 --- a/cpp/winsharedutils/clipboard.cpp +++ b/cpp/winsharedutils/clipboard.cpp @@ -20,9 +20,11 @@ bool tryopenclipboard(HWND hwnd = 0) std::optional clipboard_get_internal() { - std::optional data = {}; + if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) + return {}; if (tryopenclipboard() == false) return {}; + std::optional data = {}; do { HANDLE hData = GetClipboardData(CF_UNICODETEXT); @@ -80,7 +82,13 @@ DECLARE_API bool clipboard_set(HWND hwnd, wchar_t *text) CloseClipboard(); return success; } - +inline bool iscurrentowndclipboard() +{ + auto ohwnd = GetClipboardOwner(); + DWORD pid; + GetWindowThreadProcessId(ohwnd, &pid); + return pid == GetCurrentProcessId(); +} static void clipboard_callback_1(void (*callback)(const wchar_t *, bool), HANDLE hsema, HWND *hwnd) { const wchar_t CLASS_NAME[] = L"LunaClipboardListener"; @@ -91,14 +99,12 @@ static void clipboard_callback_1(void (*callback)(const wchar_t *, bool), HANDLE static auto callbackx = [](HWND hWnd) { auto data = clipboard_get_internal(); + if (!data) + return; auto callback_ = reinterpret_cast(GetWindowLongPtrW(hWnd, GWLP_USERDATA)); - if (data && callback_) - { - auto ohwnd = GetClipboardOwner(); - DWORD pid; - GetWindowThreadProcessId(ohwnd, &pid); - callback_(data.value().c_str(), pid == GetCurrentProcessId()); - } + if (!callback_) + return; + callback_(data.value().c_str(), iscurrentowndclipboard()); }; #ifndef WINXP if (WM_CLIPBOARDUPDATE == message) @@ -158,9 +164,9 @@ static void clipboard_callback_1(void (*callback)(const wchar_t *, bool), HANDLE DispatchMessage(&msg); } } -#ifndef WINXP DECLARE_API HWND clipboard_callback(void (*callback)(const wchar_t *, bool)) { +#ifndef WINXP HANDLE hsema = CreateSemaphoreW(0, 0, 10, 0); HWND hwnd; @@ -172,31 +178,26 @@ DECLARE_API HWND clipboard_callback(void (*callback)(const wchar_t *, bool)) return hwnd; else return NULL; -} #else -static int running = false; -DECLARE_API HWND clipboard_callback(void (*callback)(const wchar_t *, bool)) -{ - running = true; - std::thread([=]() + static HANDLE clipboardUpdate; + clipboardUpdate = CreateEventW(nullptr, FALSE, TRUE, NULL); + auto __ = SetWindowsHookExW(WH_GETMESSAGE, [](int statusCode, WPARAM wParam, LPARAM lParam) + { + if (statusCode == HC_ACTION && wParam == PM_REMOVE && ((MSG*)lParam)->message == WM_CLIPBOARDUPDATE) SetEvent(clipboardUpdate); + return CallNextHookEx(NULL, statusCode, wParam, lParam); }, NULL, GetCurrentThreadId()); + std::thread([=] { - std::wstring last; - while(running){ - Sleep(100); - auto data = clipboard_get_internal(); - if(data){ - if(last==data.value())continue; - last=data.value(); - auto ohwnd = GetClipboardOwner(); - DWORD pid; - GetWindowThreadProcessId(ohwnd, &pid); - callback(data.value().c_str(), pid == GetCurrentProcessId()); - } - } }) + while (WaitForSingleObject(clipboardUpdate, INFINITE) == WAIT_OBJECT_0) + { + auto data = clipboard_get_internal(); + if(data) + callback(data.value().c_str(), iscurrentowndclipboard()); + } + throw; }) .detach(); - return NULL; -} + return (HWND) new std::pair{clipboardUpdate, __}; #endif +} DECLARE_API void clipboard_callback_stop(HWND hwnd) { #ifndef WINXP @@ -205,7 +206,10 @@ DECLARE_API void clipboard_callback_stop(HWND hwnd) RemoveClipboardFormatListener(hwnd); DestroyWindow(hwnd); #else - running = false; + auto __ = (std::pair *)(hwnd); + UnhookWindowsHookEx(__->second); + CloseHandle(__->first); + delete __; #endif } diff --git a/py/LunaTranslator/LunaTranslator.py b/py/LunaTranslator/LunaTranslator.py index 01d6f1e4..94102e40 100644 --- a/py/LunaTranslator/LunaTranslator.py +++ b/py/LunaTranslator/LunaTranslator.py @@ -53,18 +53,6 @@ from gui.dynalang import LAction, LMenu from gui.setting_textinput_ocr import showocrimage -class _clipboardhelper(QObject): - setText = pyqtSignal(str) - setPixmap = pyqtSignal(QPixmap) - setImage = pyqtSignal(QImage) - - def __init__(self): - super().__init__() - self.setPixmap.connect(QApplication.clipboard().setPixmap) - self.setImage.connect(QApplication.clipboard().setImage) - self.setText.connect(QApplication.clipboard().setText) - - class MAINUI: def __init__(self) -> None: super().__init__() @@ -99,7 +87,7 @@ class MAINUI: self.autoswitchgameuid = True self.istriggertoupdate = False self.thishastranslated = True - + @threader def ttsautoforward(self): if not globalconfig["ttsautoforward"]: @@ -978,8 +966,8 @@ class MAINUI: word = word.get("origorig", word["orig"]) if globalconfig["usecopyword"]: - gobject.baseobject.clipboardhelper.setText.emit( - (QApplication.clipboard().text("plain")[0] + word) if append else word + winsharedutils.clipboard_set( + (winsharedutils.clipboard_get() + word) if append else word ) if globalconfig["usesearchword"]: self.searchwordW.search_word.emit(word, append) @@ -1156,7 +1144,6 @@ class MAINUI: # ).family() def loadui(self): - self.clipboardhelper = _clipboardhelper() self.installeventfillter() self.parsedefaultfont() self.loadmetadatas() diff --git a/py/LunaTranslator/gui/dialog_savedgame_setting.py b/py/LunaTranslator/gui/dialog_savedgame_setting.py index 0e6f18c1..c26cdd70 100644 --- a/py/LunaTranslator/gui/dialog_savedgame_setting.py +++ b/py/LunaTranslator/gui/dialog_savedgame_setting.py @@ -2,8 +2,8 @@ from qtsymbols import * import functools, uuid from datetime import datetime, timedelta from traceback import print_exc -import gobject from language import TransLanguages +import gobject, winsharedutils from myutils.config import ( savehook_new_data, uid2gamepath, @@ -631,7 +631,7 @@ class dialog_setting_game_internal(QWidget): try: gobject.global_dialog_savedgame_new.tagswidget.addTag(*_) except: - gobject.baseobject.clipboardhelper.setText.emit(_[0]) + winsharedutils.clipboard_set(_[0]) qw.labelclicked.connect(safeaddtags) if first: diff --git a/py/LunaTranslator/gui/dialog_savedgame_v3.py b/py/LunaTranslator/gui/dialog_savedgame_v3.py index 47385363..8b8371e7 100644 --- a/py/LunaTranslator/gui/dialog_savedgame_v3.py +++ b/py/LunaTranslator/gui/dialog_savedgame_v3.py @@ -10,6 +10,7 @@ from myutils.config import ( extradatas, globalconfig, ) +from myutils.hwnd import clipboard_set_image from myutils.utils import ( get_time_stamp, loopbackrecorder, @@ -572,9 +573,7 @@ class pixwrapper(QWidget): if action == deleteimage: self.removecurrent(False) elif copyimage == action: - gobject.baseobject.clipboardhelper.setImage.emit( - QImage(extradatas["localedpath"].get(curr, curr)) - ) + clipboard_set_image(extradatas["localedpath"].get(curr, curr)) elif action == deleteimage_x: self.removecurrent(True) elif action == pos: diff --git a/py/LunaTranslator/gui/selecthook.py b/py/LunaTranslator/gui/selecthook.py index 651b26c5..1a158116 100644 --- a/py/LunaTranslator/gui/selecthook.py +++ b/py/LunaTranslator/gui/selecthook.py @@ -2,7 +2,7 @@ from qtsymbols import * import functools, binascii from collections import OrderedDict from traceback import print_exc -import qtawesome, windows, gobject +import qtawesome, windows, winsharedutils, gobject from textsource.texthook import codepage_display, codepage_real from myutils.config import savehook_new_data, static_data, globalconfig, _TR, isascii from myutils.utils import checkchaos, get_time_stamp, dynamiclink, is_ascii_control @@ -693,7 +693,7 @@ class hookselect(closeashidewindow): except: pass elif action == copy: - gobject.baseobject.clipboardhelper.setText.emit(hc) + winsharedutils.clipboard_set(hc) def opensolvetext(self): try: diff --git a/py/LunaTranslator/gui/setting_hotkey.py b/py/LunaTranslator/gui/setting_hotkey.py index c7715639..b55469df 100644 --- a/py/LunaTranslator/gui/setting_hotkey.py +++ b/py/LunaTranslator/gui/setting_hotkey.py @@ -49,9 +49,7 @@ def registrhotkeys(self): "_1": gobject.baseobject.translation_ui.startTranslater, "_2": gobject.baseobject.translation_ui.changeTranslateMode, "_3": self.showsignal.emit, - "_4": lambda: gobject.baseobject.clipboardhelper.setText.emit( - gobject.baseobject.currenttext - ), + "_4": lambda: winsharedutils.clipboard_set(gobject.baseobject.currenttext), "_5": gobject.baseobject.translation_ui.changeshowhiderawsig.emit, "_51": gobject.baseobject.translation_ui.changeshowhidetranssig.emit, "_6": lambda: gobject.baseobject.transhis.showsignal.emit(), @@ -75,15 +73,13 @@ def registrhotkeys(self): "_25": lambda: windows.SendMessage( windows.FindWindow("WNDCLS_Magpie_Core_CLI_Message", None), windows.RegisterWindowMessage("Magpie_Core_CLI_Message_ToggleOverlay"), - None, - None, ), "_26": gobject.baseobject.translation_ui.ocr_once_signal.emit, "_26_1": lambda: gobject.baseobject.translation_ui.ocr_do_function( gobject.baseobject.translation_ui.ocr_once_follow_rect ), "_27": gobject.baseobject.translation_ui.simulate_key_enter, - "_28": lambda: gobject.baseobject.clipboardhelper.setText.emit( + "_28": lambda: winsharedutils.clipboard_set( gobject.baseobject.currenttranslate ), "_29": lambda: gobject.baseobject.searchwordW.ankiwindow.recordbtn1.click(), @@ -95,7 +91,7 @@ def registrhotkeys(self): QPoint() ), "36": lambda: gobject.baseobject.textgetmethod( - QApplication.clipboard().text("plain")[0], False + winsharedutils.clipboard_get(), False ), "37": lambda: gobject.baseobject.searchwordW.search_word.emit( winsharedutils.GetSelectedText(), False diff --git a/py/LunaTranslator/gui/showword.py b/py/LunaTranslator/gui/showword.py index 9b6a7ac3..d18140e0 100644 --- a/py/LunaTranslator/gui/showword.py +++ b/py/LunaTranslator/gui/showword.py @@ -2,7 +2,7 @@ from qtsymbols import * import json, time, functools, os, base64, uuid from urllib.parse import quote from traceback import print_exc -import qtawesome, requests, gobject, windows, hashlib +import qtawesome, requests, gobject, windows, winsharedutils import myutils.ankiconnect as anki from myutils.hwnd import grabwindow from myutils.config import globalconfig, static_data, _TR @@ -971,7 +971,7 @@ class showdiction(QWidget): if action == search: self.model.onDoubleClicked(idx) elif copy == action: - gobject.baseobject.clipboardhelper.setText.emit(item.text()) + winsharedutils.clipboard_set(item.text()) elif action == label: if not idx.data(isLabeleddWord): item.setData(True, isLabeleddWord) diff --git a/py/LunaTranslator/gui/transhist.py b/py/LunaTranslator/gui/transhist.py index 84f5725f..62693449 100644 --- a/py/LunaTranslator/gui/transhist.py +++ b/py/LunaTranslator/gui/transhist.py @@ -1,6 +1,6 @@ from qtsymbols import * import functools -import qtawesome, gobject, threading +import qtawesome, winsharedutils, threading from myutils.config import globalconfig from myutils.utils import get_time_stamp from gui.usefulwidget import closeashidewindow @@ -70,7 +70,7 @@ class transhist(closeashidewindow): if action == qingkong: tb.clear() elif action == copy: - gobject.baseobject.clipboardhelper.setText.emit(self.textOutput.textCursor().selectedText()) + winsharedutils.clipboard_set(self.textOutput.textCursor().selectedText()) elif action == baocun: ff = QFileDialog.getSaveFileName(self, directory="save.txt") if ff[0] == "": diff --git a/py/LunaTranslator/gui/translatorUI.py b/py/LunaTranslator/gui/translatorUI.py index 3eb67a18..2449e27b 100644 --- a/py/LunaTranslator/gui/translatorUI.py +++ b/py/LunaTranslator/gui/translatorUI.py @@ -566,7 +566,7 @@ class TranslatorWindow(resizableframeless): ("setting", lambda: gobject.baseobject.settin_ui.showsignal.emit()), ( "copy", - lambda: gobject.baseobject.clipboardhelper.setText.emit(gobject.baseobject.currenttext), + lambda: winsharedutils.clipboard_set(gobject.baseobject.currenttext), ), ("edit", gobject.baseobject.createedittextui), ("edittrans", lambda: edittrans(gobject.baseobject.commonstylebase)), @@ -700,7 +700,7 @@ class TranslatorWindow(resizableframeless): ( "copy_once", lambda: gobject.baseobject.textgetmethod( - QApplication.clipboard().text("plain")[0], False + winsharedutils.clipboard_get(), False ), ), ( diff --git a/py/LunaTranslator/gui/usefulwidget.py b/py/LunaTranslator/gui/usefulwidget.py index e25444fa..6de69595 100644 --- a/py/LunaTranslator/gui/usefulwidget.py +++ b/py/LunaTranslator/gui/usefulwidget.py @@ -318,13 +318,13 @@ class TableViewW(QTableView): csv_writer.writerow(row) csv_str = output.getvalue() output.close() - gobject.baseobject.clipboardhelper.setText.emit(csv_str) + winsharedutils.clipboard_set(csv_str) def pastetable(self): current = self.currentIndex() if not current.isValid(): return - string = QApplication.clipboard().text("plain")[0] + string = winsharedutils.clipboard_get() try: csv_file = io.StringIO(string) csv_reader = csv.reader(csv_file, delimiter="\t") @@ -1443,7 +1443,7 @@ class mshtmlWidget(abstractwebview): t.timeout.connect(self.__getcurrent) t.timeout.emit() t.start() - self.add_menu(0, _TR("复制"), gobject.baseobject.clipboardhelper.setText.emit) + self.add_menu(0, _TR("复制"), winsharedutils.clipboard_set) self.add_menu(0, None, lambda: 1) def __getcurrent(self): @@ -1456,9 +1456,7 @@ class mshtmlWidget(abstractwebview): winsharedutils.html_get_current_url(self.browser, cb) if winsharedutils.html_check_ctrlc(self.browser): - cb = winsharedutils.html_get_select_text_cb( - gobject.baseobject.clipboardhelper.setText.emit - ) + cb = winsharedutils.html_get_select_text_cb(winsharedutils.clipboard_set) winsharedutils.html_get_select_text(self.browser, cb) def navigate(self, url): @@ -1960,9 +1958,7 @@ class listediter(LDialog): self.hcmodel.removeRow(curr.row()) self.internalrealname.pop(curr.row()) elif action == copy: - gobject.baseobject.clipboardhelper.setText.emit( - self.hcmodel.itemFromIndex(curr).text() - ) + winsharedutils.clipboard_set(self.hcmodel.itemFromIndex(curr).text()) elif action == up: diff --git a/py/LunaTranslator/myutils/hwnd.py b/py/LunaTranslator/myutils/hwnd.py index d19cc85b..8bb9d3a4 100644 --- a/py/LunaTranslator/myutils/hwnd.py +++ b/py/LunaTranslator/myutils/hwnd.py @@ -6,6 +6,19 @@ import os, subprocess, functools import time, winrtutils, winsharedutils, hashlib from myutils.config import savehook_new_data, globalconfig from myutils.wrapper import threader +from myutils.utils import qimage2binary + + +def clipboard_set_image(p: QImage): + if not p: + return + if isinstance(p, str): + qimg = QImage() + qimg.load(p) + p = qimg + if p.isNull(): + return + winsharedutils.clipboard_set_image(qimage2binary(p)) @threader @@ -46,7 +59,7 @@ def grabwindow(app="PNG", callback_origin=None, tocliponly=False): if p.isNull(): return if tocliponly: - gobject.baseobject.clipboardhelper.setPixmap.emit(p) + clipboard_set_image(p) return p.save(fn) if callback_origin: diff --git a/py/LunaTranslator/rendertext/textbrowser.py b/py/LunaTranslator/rendertext/textbrowser.py index 5dedfdb5..a8c6e4cc 100644 --- a/py/LunaTranslator/rendertext/textbrowser.py +++ b/py/LunaTranslator/rendertext/textbrowser.py @@ -1,7 +1,7 @@ from qtsymbols import * from myutils.config import globalconfig, static_data from rendertext.somefunctions import dataget -import gobject, functools, importlib +import gobject, functools, importlib, winsharedutils from traceback import print_exc from rendertext.textbrowser_imp.base import base from gui.dynalang import LAction @@ -175,7 +175,7 @@ class TextBrowser(QWidget, dataget): if action == search: gobject.baseobject.searchwordW.search_word.emit(curr, False) elif action == copy: - gobject.baseobject.clipboardhelper.setText.emit(curr) + winsharedutils.clipboard_set(curr) elif action == tts: gobject.baseobject.read_text(curr) elif action == translate: diff --git a/py/LunaTranslator/scalemethod/magpie_builtin.py b/py/LunaTranslator/scalemethod/magpie_builtin.py index 2faaecaf..edff261c 100644 --- a/py/LunaTranslator/scalemethod/magpie_builtin.py +++ b/py/LunaTranslator/scalemethod/magpie_builtin.py @@ -37,8 +37,6 @@ class Method(scalebase): windows.SendMessage( windows.FindWindow("WNDCLS_Magpie_Core_CLI_Message", None), windows.RegisterWindowMessage("Magpie_Core_CLI_Message_Exit"), - None, - None, ) def changestatus(self, hwnd, full): @@ -58,7 +56,5 @@ class Method(scalebase): windows.SendMessage( windows.FindWindow("WNDCLS_Magpie_Core_CLI_Message", None), windows.RegisterWindowMessage("Magpie_Core_CLI_Message_Stop"), - None, - None, ) return False diff --git a/py/LunaTranslator/textoutput/clipboard.py b/py/LunaTranslator/textoutput/clipboard.py index 2dd0a6dd..b5f11034 100644 --- a/py/LunaTranslator/textoutput/clipboard.py +++ b/py/LunaTranslator/textoutput/clipboard.py @@ -1,7 +1,6 @@ from textoutput.outputerbase import Base from myutils.config import globalconfig -import gobject -from qtsymbols import * +import winsharedutils class Outputer(Base): @@ -10,4 +9,5 @@ class Outputer(Base): not globalconfig["excule_from_self"] ): return - gobject.baseobject.clipboardhelper.setText.emit(text) + + winsharedutils.clipboard_set(text) diff --git a/py/LunaTranslator/textsource/copyboard.py b/py/LunaTranslator/textsource/copyboard.py index c1760d30..20334069 100644 --- a/py/LunaTranslator/textsource/copyboard.py +++ b/py/LunaTranslator/textsource/copyboard.py @@ -1,23 +1,22 @@ from textsource.textsourcebase import basetext from myutils.config import globalconfig -import gobject -from qtsymbols import * +import winsharedutils, gobject class copyboard(basetext): def end(self): - QApplication.clipboard().disconnect() + winsharedutils.clipboard_callback_stop(self.__hwnd) - def __callback(self): - clipboard = QApplication.clipboard() - if globalconfig["excule_from_self"] and clipboard.ownsClipboard(): + def __callback(self, string, ismy): + if globalconfig["excule_from_self"] and ismy: return - self.dispatchtext(clipboard.text("plain")[0]) + self.dispatchtext(string) def init(self) -> None: self.startsql(gobject.gettranslationrecorddir("0_copy.sqlite")) - QApplication.clipboard().dataChanged.connect(self.__callback) + self.__ref = winsharedutils.clipboard_callback_type(self.__callback) + self.__hwnd = winsharedutils.clipboard_callback(self.__ref) def gettextonce(self): - return QApplication.clipboard().text("plain")[0] + return winsharedutils.clipboard_get() diff --git a/py/LunaTranslator/tts/vitsSimpleAPI.py b/py/LunaTranslator/tts/vitsSimpleAPI.py index 0b4b8f42..d8913ce1 100644 --- a/py/LunaTranslator/tts/vitsSimpleAPI.py +++ b/py/LunaTranslator/tts/vitsSimpleAPI.py @@ -15,24 +15,27 @@ class TTS(TTSbase): for modelType in modelTypes: vits_data = responseVits[modelType] for item in vits_data: - model_info = "{}_{}_{}".format(modelType, item["id"], item["name"]) + lang_str = "/".join(item["lang"]) + model_info = "{}_{}_{}_{}".format( + modelType, item["id"], item["name"], lang_str + ) voicelist.append(model_info) internal.append((modelType, item["id"], item["name"])) return internal, voicelist def speak(self, content, voice, param: SpeechParam): if param.speed > 0: - rate = 1 - param.speed / 15 + length = 1 - param.speed / 15 else: - rate = 1 - param.speed / 5 + length = 1 - param.speed / 5 encoded_content = quote(content) model, idx, _ = voice - speak = self.config["speak"].format( + speak = self.config["speak2"].format( model_lower=model.lower(), model=model, id=idx, text=encoded_content, - speed=rate, + length=length, ) response = requests.get(urlpathjoin(self.config["URL"], speak)).content diff --git a/py/LunaTranslator/windows.py b/py/LunaTranslator/windows.py index 492d5c7e..76ac8922 100644 --- a/py/LunaTranslator/windows.py +++ b/py/LunaTranslator/windows.py @@ -272,8 +272,8 @@ _OpenProcess.argtypes = c_uint, c_bool, c_uint CloseHandle = _kernel32.CloseHandle CloseHandle.argtypes = (HANDLE,) CloseHandle.restype = BOOL -SendMessage = _user32.SendMessageW -SendMessage.argtypes = c_int, c_uint, c_void_p, c_void_p +_SendMessage = _user32.SendMessageW +_SendMessage.argtypes = c_int, c_uint, c_void_p, c_void_p _keybd_event = _user32.keybd_event _keybd_event.argtypes = c_byte, c_byte, c_uint, c_void_p RegisterWindowMessage = _user32.RegisterWindowMessageW @@ -281,6 +281,8 @@ RegisterWindowMessage.argtypes = (LPCWSTR,) RegisterWindowMessage.restype = UINT _GetWindowThreadProcessId = _user32.GetWindowThreadProcessId _GetWindowThreadProcessId.argtypes = HWND, c_void_p +GetClipboardOwner = _user32.GetClipboardOwner +GetClipboardOwner.restype = HWND try: _GetModuleFileNameExW = _psapi.GetModuleFileNameExW except: @@ -497,6 +499,10 @@ def OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId): return _OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId) +def SendMessage(hwnd, message, wp=None, lp=None): + return _SendMessage(hwnd, message, wp, lp) + + def keybd_event(bVk, bScan, dwFlags, _): _keybd_event(bVk, bScan, dwFlags, _) diff --git a/py/LunaTranslator/winsharedutils.py b/py/LunaTranslator/winsharedutils.py index e2151e48..ac894ee0 100644 --- a/py/LunaTranslator/winsharedutils.py +++ b/py/LunaTranslator/winsharedutils.py @@ -54,6 +54,15 @@ mecab_parse.restype = c_bool mecab_end = utilsdll.mecab_end mecab_end.argtypes = (c_void_p,) +_clipboard_get = utilsdll.clipboard_get +_clipboard_get.argtypes = (c_void_p,) +_clipboard_get.restype = c_bool +_clipboard_set = utilsdll.clipboard_set +_clipboard_set.argtypes = (HWND, c_wchar_p) +_clipboard_set_image = utilsdll.clipboard_set_image +_clipboard_set_image.argtypes = (HWND, c_void_p, c_size_t) +_clipboard_set_image.restype = c_bool + def SAPI_List(v): ret = [] @@ -83,6 +92,26 @@ def distance_ratio(s1, s2): return levenshtein_ratio(len(s1), s1, len(s2), s2) +clphwnd = windll.user32.CreateWindowExW(0, "STATIC", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + + +def clipboard_set(text): + global clphwnd + return _clipboard_set(clphwnd, text) + + +def clipboard_set_image(bytes_): + global clphwnd + return _clipboard_set_image(clphwnd, bytes_, len(bytes_)) + + +def clipboard_get(): + ret = [] + if not _clipboard_get(CFUNCTYPE(None, c_wchar_p)(ret.append)): + return "" + return ret[0] + + html_version = utilsdll.html_version html_version.restype = DWORD html_new = utilsdll.html_new @@ -288,6 +317,12 @@ add_menu_list = utilsdll.add_menu_list add_menu_list.argtypes = (c_void_p, c_int, c_wchar_p, add_ContextMenuRequested_cb) get_root_html = utilsdll.get_root_html get_root_html.argtypes = c_void_p, c_void_p +clipboard_callback = utilsdll.clipboard_callback +clipboard_callback.argtypes = (c_void_p,) +clipboard_callback.restype = HWND +clipboard_callback_stop = utilsdll.clipboard_callback_stop +clipboard_callback_stop.argtypes = (HWND,) +clipboard_callback_type = CFUNCTYPE(None, c_wchar_p, c_bool) StartCaptureAsync_cb = CFUNCTYPE(None, c_void_p, c_size_t) StartCaptureAsync = utilsdll.StartCaptureAsync StartCaptureAsync.argtypes = (StartCaptureAsync_cb,) diff --git a/py/files/defaultconfig/config.json b/py/files/defaultconfig/config.json index 8f5a605b..1e88c545 100644 --- a/py/files/defaultconfig/config.json +++ b/py/files/defaultconfig/config.json @@ -1182,7 +1182,12 @@ "args": { "URL": "http://127.0.0.1:23456", "voices": "/voice/speakers", - "speak": "/voice/{model_lower}?text={text}&id={id}&length={speed}&lang=auto&prompt_lang=auto&format=wav&preset=default" + "speak2": "/voice/{model_lower}?text={text}&id={id}&length={length}&lang=auto&prompt_lang=auto&format=wav&preset=default" + }, + "argstype": { + "speak2": { + "name": "speak" + } }, "arg_not_sup": [ "pitch"