|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.01.2024, 14:29 | #1 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
получить событие нажатия кнопки копирования и вырезания в контекстном меню windows
Нужно получить событие нажатия кнопки копирования и вырезания в контекстном меню windows, чтобы при наступлении этого события в моей программе на python сработала функция. Как это сделать?
|
02.01.2024, 15:18 | #2 |
Старожил
Регистрация: 24.01.2011
Сообщений: 3,119
|
|
02.01.2024, 15:21 | #3 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
Я не знаю от чего отталкиваться, поэтому задаю вопрос. Я имею в виду - из любого приложения
|
02.01.2024, 15:32 | #4 |
Старожил
Регистрация: 24.01.2011
Сообщений: 3,119
|
Esprit - что в теме предыдущей вы не открыли задумку, что здесь пока не понятно
ну я меряю по себе, я - работаю во всех браузерах, ворд, либраоффис, блокнот++ это опять же работа с буфером обмена, даже пусть программа отследила что произошло нужное вам событие и что далее? ну пусть программа вам на ухо шепнёт, произошло нужное событие, что дальше? а если в это время вы работаете указанных выше программах или в той, что я не учёл и? далее то что? думаю, что нужно отталкиваться от наиболее необходимого приложения..... ну и выслушаю другие мнения |
02.01.2024, 15:46 | #5 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
import keyboard
from tkinter import Tk, Button import time import win32gui import win32api import win32clipboard as cbd sh = [] def move(event): global hwnd hwnd = win32gui.GetForegroundWindow() if hwnd and hwnd != 0: sh.append(hwnd) if len(sh) > 20: del sh[0:15] def b1(event): if hwnd != 0: win32gui.SetForegroundWindow(hwnd) else: win32gui.SetForegroundWindow(sh[-1]) def config_data(data): def config(): cbd.OpenClipboard() cbd.EmptyClipboard() for cf, val in data.items(): cbd.SetClipboardData(cf, val) cbd.CloseClipboard() keyboard.press_and_release('ctrl+v' ) return config def add_buttons(root): bt_params = { "width": 15, "height": 1, "font": ("Times New Roman", 12) } bt_count = 0 #кнопка копирования def _copy(): global bt_count if win32api.GetKeyboardLayout() == 68748313: keyboard.press_and_release("ctrl+с" ) else: keyboard.press_and_release("ctrl+c" ) time.sleep(0.1) cbd.OpenClipboard() cf = 0 data = {} while True: cf = cbd.EnumClipboardFormats(cf) if cf == 0: break if cf == cbd.CF_METAFILEPICT: # http://timgolden.me.uk/pywin32-docs/...Data_meth.html # currently broken continue if cf == cbd.CF_ENHMETAFILE: continue data[cf] = cbd.GetClipboardData(cf) cbd.CloseClipboard() if not data: return text = data.get(cbd.CF_UNICODETEXT, "non-text-data")[:15].replace("\r\n", "") Button(root, text = text, bg = "white", command = config_data(data), **bt_params).place(x = 0, y = 30 * bt_count) bt_count += 1 #кнопка очистки def _clear(): global bt_count for widget in root.winfo_children(): widget.destroy() Button(root, text = "Копировать", bg = "#556B2F", command = _copy, **bt_params).place(x = 0, y = 315) Button(root, text = "Очистить", bg = "#556B2F", command = _clear, **bt_params).place(x = 150, y = 315) bt_count = 0 cbd.OpenClipboard() cbd.EmptyClipboard() cbd.CloseClipboard() _clear() def main(): root = Tk() root.title("Advanced Сlipboard") root.geometry("296x350") root.resizable(width = False, height = False) root.attributes("-topmost", True) root.configure(bg = "lightblue") root.bind("<Motion>", move) root.bind("<Button-1>", b1) add_buttons(root) root.mainloop() main()Да, это все та же тема, в которой BDA решил проблему. Но я хочу убрать кнопку копирования из своего приложения, чтобы не обращаться к ней при копировании. А просто копировать текст с помощью CTRL+C и контекстного меню, а копии будут появляться при этом в моей программе. Думаю, если не найдется более изящное решение, то я просто сделаю прослушку на изменения в буфере обмена, чтобы при обновлении буфера в моем приложении сработала функция _copy, которая добавляет копии в мое окно |
02.01.2024, 15:47 | #6 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
Код:
|
02.01.2024, 15:56 | #7 |
Старожил
Регистрация: 24.01.2011
Сообщений: 3,119
|
вы скажите-ну поправят вам приложение и что вы в нём будете работать? верится с трудом, потому как есть более удобные инструменты
|
02.01.2024, 17:09 | #8 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,331
|
Не до конца понял, но возможно, что это то, что вы ищите:
Код:
PS: обратил внимание на то, что комбинация клавиш срабатывает и в том случае, когда активно окно другого приложения. Т.е. Запущен скрипт, активирую окно браузера и выполняю копирование в буфер. Копирование в буфер выполняется, но и функция скрипта срабатывает. Текст из буфера вставляется нормально, например, в блокнот. Т.е., событие нажатия комбинации клавиш раздаётся всем активным приложениям ОС.
Как-то так, ...
Последний раз редактировалось ViktorR; 02.01.2024 в 17:21. |
02.01.2024, 17:37 | #9 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
Да, с Ctrl+c я так и сделал: keyboard.add_hotkey('Ctrl+c', _copy). То есть если копировать через эту комбинацию, то заодно вызывается нужная мне функция в коде. Но нужно учитывать, что пользователь может скопировать текст с помощью контекстного меню. Например, в браузере выделил нужный текст, далее правая кнопка мыши, нажатие на пункт "копировать" в контекстном меню. Вот именно срабатывание функции _copy при нажатии на этот пункт мне и необходимо получить.
|
02.01.2024, 17:43 | #10 |
Пользователь
Регистрация: 14.12.2023
Сообщений: 30
|
Если я здесь не получу более красивый способ, то буду действовать примерно по такому принципу:
def buffer(): ....If keyboard.paste(): ........_copy() mouse.on_click(bufer) То есть при каждом клике левой кнопки мыши, будет срабатывать функция bufer с проверкой, есть ли в буфере обмена данные, если они есть, то срабатывает функция _copy Последний раз редактировалось Esprit; 02.01.2024 в 17:45. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Событие нажатия кнопки | kuba1981 | WordPress и другие CMS | 5 | 10.10.2013 08:24 |
Перехватить событие нажатия кнопки в браузере VB | Sparkman | Помощь студентам | 3 | 19.07.2012 16:58 |
Событие нажатия лев. кнопки мыши вне модального окна. | shprotus | Microsoft Office Excel | 5 | 28.08.2011 09:45 |
событие нажатия кнопки | CodeNOT | Общие вопросы C/C++ | 0 | 05.01.2011 00:04 |
Защита ячеек от вырезания и копирования | Freerider1972 | Microsoft Office Excel | 1 | 23.12.2008 20:57 |