Python3.11使用win32clipboard访问剪贴板遇权限拒绝问题
剪贴板访问冲突:随机出现"拒绝访问"错误的稳定解决方法
这是我在Stack Overflow上的首个问题,表述若有不清还请见谅。我正在开发一款生产力工具,用于处理剪贴板中的数据并粘贴处理后的内容(当前功能是将文本按行拆分后逐个粘贴),但每次访问剪贴板时,始终找不到可靠方法避免与其他进程或自身进程的冲突(这是我的推测)。
相关代码
import win32clipboard import PySimpleGUI as sg import threading import keyboard import time def check_clip(): try: win32clipboard.OpenClipboard() win32clipboard.CloseClipboard() return True except Exception as e: print(f"Error access clipboard: {e}") return False def run_safe(func): if check_clip(): return func() else: #time.sleep(0.3) return run_safe(func) def get_clipboard_text(): win32clipboard.OpenClipboard() clipboard_text = win32clipboard.GetClipboardData() win32clipboard.CloseClipboard() return clipboard_text def set_clipboard_text(text): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText(text) win32clipboard.CloseClipboard() def flush_clipboard(): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.CloseClipboard() def get_next(column_list): run_safe(lambda: set_clipboard_text(column_list[0])) keyboard.wait('ctrl+v') while column_list: item = column_list.pop(0) run_safe(lambda: set_clipboard_text(item + "\n")) keyboard.wait('ctrl+v') run_safe(flush_clipboard) return True def script(): just_flushed = True while True: if program_running: keyboard.wait('ctrl+c') time.sleep(0.3) column_text = run_safe(get_clipboard_text) column_list = column_text.splitlines() get_next(column_list) just_flushed = False else: if not just_flushed: run_safe(flush_clipboard) just_flushed = True def main(): layout = [ [sg.Text('Controllo del Programma')], [sg.Button('Run/Stop', key='-STARTPAUSE-', button_color=('white','red'))], ] window = sg.Window('MemCP', layout) global program_running program_running = False program_thread = threading.Thread(target=script, daemon=True) program_thread.start() while True: event, values = window.read(timeout=100) if event == sg.WIN_CLOSED: break if event == '-STARTPAUSE-': program_running = not program_running window['-STARTPAUSE-'].update(button_color=('white', 'green' if program_running else 'red')) window.close() if __name__ == "__main__": main()
尽管我做了一些规避处理,但每次访问剪贴板数据时仍会随机触发异常,请问有没有稳定的解决方法?
尝试过的规避方案
我尝试将所有访问剪贴板的函数封装在异常检查函数中:
def check_clip(): try: win32clipboard.OpenClipboard() win32clipboard.CloseClipboard() return True except Exception as e: print(f"Error access clipboard: {e}") return False def run_safe(func): if check_clip(): return func() else: #time.sleep(0.3) return run_safe(func)
编辑补充:错误详情
捕获到的错误信息:Error access clipboard: (5, 'OpenClipboard', 'Accesso negato.')
线程异常栈信息:
Exception in thread Thread-2 (script): Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\threading.py", line 1045, in _bootstrap_inner self.run() File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\threading.py", line 982, in run self._target(*self._args, **self._kwargs) File "c:\Users\marni\Desktop\clipboard\memory copypaste.py", line 62, in script get_next(column_list) File "c:\Users\marni\Desktop\clipboard\memory copypaste.py", line 49, in get_next run_safe(lambda: set_clipboard_text(item + "\n")) File "c:\Users\marni\Desktop\clipboard\memory copypaste.py", line 19, in run_safe return func() ^^^^^^ File "c:\Users\marni\Desktop\clipboard\memory copypaste.py", line 49, in run_safe(lambda: set_clipboard_text(item + "\n")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\marni\Desktop\clipboard\memory copypaste.py", line 32, in set_clipboard_text win32clipboard.OpenClipboard() pywintypes.error: (5, 'OpenClipboard', 'Accesso negato.')
第一条是try-except捕获的错误,我知道这类写法在开发中可能不太规范,但它能部分解决问题,只是错误仍会随机出现,用于测试很有帮助。
第二次编辑:错误复现步骤
- 运行代码,等待小窗口出现
- 点击一次Run/Stop按钮(按钮变为绿色)
- 选择Excel中的一列或带有多行换行的文本并按Ctrl+C
- 在空白文档中按住Ctrl+V快速粘贴(大概率会触发错误,若未触发,使用更长文本重复操作)
内容的提问来源于stack exchange,提问作者Mario Nicolosi
相关产品推荐
相关产品推荐

