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

调用win32clipboard.OpenClipboard()出现“Access denied”错误求助

剪贴板监控程序权限错误解决

程序需求:监控剪贴板内容,将变化的内容写入文件,按下Ctrl+Shift+P停止运行(停止功能正常),但获取剪贴板内容时失效,报错权限拒绝。

原代码

import win32clipboard
import keyboard
filename = input("Filename: ")
file = open(filename, "a")
data = ""
while True:
   previousdata = data
   win32clipboard.OpenClipboard()
   data = win32clipboard.GetClipboardData()
   win32clipboard.CloseClipboard()
   print(data)
   if data != previousdata:
       file.write(data+"\n")
   else:
       print("No change")
   if keyboard.is_pressed("ctrl+shift+p"):
       break
print("Stopped")
import os
os.system("pause")

错误信息

Traceback (most recent call last):
 File "C:\Users\Juli\Desktop\python\clipboardcopy.py", line 8, in <module>
   win32clipboard.OpenClipboard()
pywintypes.error: (5, 'OpenClipboard', 'Access denied.')

问题原因

Windows剪贴板同一时间仅允许一个进程打开访问,原代码存在两个核心问题:

  • 循环无延时,高频访问剪贴板,容易和其他正在使用剪贴板的进程冲突
  • 未处理异常,若某次OpenClipboard后出现错误,剪贴板未被关闭,会导致后续访问全部失败

修复后的代码

import win32clipboard
import keyboard
import time
import pywintypes

filename = input("Filename: ")
# 指定utf-8编码避免非ASCII字符乱码
file = open(filename, "a", encoding="utf-8")
data = ""

while True:
    previousdata = data
    try:
        win32clipboard.OpenClipboard()
        # 优先读取Unicode文本,兼容更多场景
        if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_UNICODETEXT):
            data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
        else:
            data = win32clipboard.GetClipboardData()
        win32clipboard.CloseClipboard()
        
        print(data)
        if data != previousdata:
            file.write(data + "\n")
            file.flush()  # 立即写入文件,避免缓存丢失
        else:
            print("No change")
    except pywintypes.error as e:
        print(f"剪贴板访问失败: {e}")
        # 确保剪贴板被关闭,避免占用
        try:
            win32clipboard.CloseClipboard()
        except:
            pass
        data = previousdata  # 保持上一次的内容状态

    # 检测停止快捷键
    if keyboard.is_pressed("ctrl+shift+p"):
        break
    # 增加延时,降低剪贴板访问频率,减少冲突
    time.sleep(0.5)

# 关闭文件,释放资源
file.close()
print("Stopped")
import os
os.system("pause")

关键修改说明

  • 加入异常捕获:用try-except处理剪贴板操作的错误,确保即使访问失败也能尝试关闭剪贴板,避免资源占用
  • 增加循环延时:time.sleep(0.5)降低访问频率,减少和其他进程的剪贴板竞争
  • 支持多格式文本:优先读取CF_UNICODETEXT格式,兼容中文、特殊字符等场景
  • 文件写入优化:指定编码避免乱码,调用flush()确保内容立即写入文件
  • 资源释放:循环结束后主动关闭文件,避免资源泄漏

内容的提问来源于stack exchange,提问作者Juli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:35:10