Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2024, 14:29   #1
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию получить событие нажатия кнопки копирования и вырезания в контекстном меню windows

Нужно получить событие нажатия кнопки копирования и вырезания в контекстном меню windows, чтобы при наступлении этого события в моей программе на python сработала функция. Как это сделать?
Esprit вне форума Ответить с цитированием
Старый 02.01.2024, 15:18   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Esprit Посмотреть сообщение
нажатия кнопки копирования и вырезания в контекстном меню windows
контекстное меню отображается при щелчке правой кнопкой мыши на объекте
так хз о каком приложении речь, нужно ведь отталкиваться от этого, не?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 02.01.2024, 15:21   #3
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Я не знаю от чего отталкиваться, поэтому задаю вопрос. Я имею в виду - из любого приложения
Esprit вне форума Ответить с цитированием
Старый 02.01.2024, 15:32   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Esprit - что в теме предыдущей вы не открыли задумку, что здесь пока не понятно
Цитата:
Сообщение от Esprit Посмотреть сообщение
из любого приложения
ну я меряю по себе, я - работаю во всех браузерах, ворд, либраоффис, блокнот++
это опять же работа с буфером обмена, даже пусть программа отследила что произошло нужное вам событие и что далее? ну пусть программа вам на ухо шепнёт, произошло нужное событие, что дальше?
а если в это время вы работаете указанных выше программах или в той, что я не учёл и? далее то что?
думаю, что нужно отталкиваться от наиболее необходимого приложения.....
ну и выслушаю другие мнения
Ципихович Эндрю вне форума Ответить с цитированием
Старый 02.01.2024, 15:46   #5
Esprit
Пользователь
 
Регистрация: 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, которая добавляет копии в мое окно
Esprit вне форума Ответить с цитированием
Старый 02.01.2024, 15:47   #6
Esprit
Пользователь
 
Регистрация: 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()
Esprit вне форума Ответить с цитированием
Старый 02.01.2024, 15:56   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

вы скажите-ну поправят вам приложение и что вы в нём будете работать? верится с трудом, потому как есть более удобные инструменты
Ципихович Эндрю вне форума Ответить с цитированием
Старый 02.01.2024, 17:09   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Не до конца понял, но возможно, что это то, что вы ищите:
Код:
import keyboard
def prn():
    print('34')

keyboard.add_hotkey("ctrl+c", prn)
Устанавливаете модуль контроля клавиатуры и ...

PS:
обратил внимание на то, что комбинация клавиш срабатывает и в том случае, когда активно окно другого приложения.
Т.е. Запущен скрипт, активирую окно браузера и выполняю копирование в буфер.
Копирование в буфер выполняется, но и функция скрипта срабатывает. Текст из буфера вставляется нормально, например, в блокнот.
Т.е., событие нажатия комбинации клавиш раздаётся всем активным приложениям ОС.
Как-то так, ...

Последний раз редактировалось ViktorR; 02.01.2024 в 17:21.
ViktorR вне форума Ответить с цитированием
Старый 02.01.2024, 17:37   #9
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Да, с Ctrl+c я так и сделал: keyboard.add_hotkey('Ctrl+c', _copy). То есть если копировать через эту комбинацию, то заодно вызывается нужная мне функция в коде. Но нужно учитывать, что пользователь может скопировать текст с помощью контекстного меню. Например, в браузере выделил нужный текст, далее правая кнопка мыши, нажатие на пункт "копировать" в контекстном меню. Вот именно срабатывание функции _copy при нажатии на этот пункт мне и необходимо получить.
Esprit вне форума Ответить с цитированием
Старый 02.01.2024, 17:43   #10
Esprit
Пользователь
 
Регистрация: 14.12.2023
Сообщений: 30
По умолчанию

Если я здесь не получу более красивый способ, то буду действовать примерно по такому принципу:
def buffer():
....If keyboard.paste():
........_copy()
mouse.on_click(bufer)
То есть при каждом клике левой кнопки мыши, будет срабатывать функция bufer с проверкой, есть ли в буфере обмена данные, если они есть, то срабатывает функция _copy

Последний раз редактировалось Esprit; 02.01.2024 в 17:45.
Esprit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие нажатия кнопки 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