You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:37:32