python - PYTHON-如何解决问题:pywintypes.error: (5, 'OpenClipboard', 'Access is denied')
问题描述
打开剪贴板时出现错误,显示“pywintypes.error: (5, 'OpenClipboard', 'Access is denied')'。我在 SO 中看到了一些答案,但它们不能满足我的要求,因为我将一些 DIB 形式的图片复制到剪贴板中,但不仅仅是一些字符串——比如许多答案提到的单词。代码如下,抄自Mr.martineau。Mr.martineau 的好答案 希望得到答案谢谢!
import ctypes
from ctypes.wintypes import *
import win32clipboard
from win32con import *
import sys,win32api,win32con
#GRAB
win32api.keybd_event(win32con.VK_SNAPSHOT, 0)
class BITMAPFILEHEADER(ctypes.Structure):
_pack_ = 1 # structure field byte alignment
_fields_ = [
('bfType', WORD), # file type ("BM")
('bfSize', DWORD), # file size in bytes
('bfReserved1', WORD), # must be zero
('bfReserved2', WORD), # must be zero
('bfOffBits', DWORD), # byte offset to the pixel array
]
SIZEOF_BITMAPFILEHEADER = ctypes.sizeof(BITMAPFILEHEADER)
class BITMAPINFOHEADER(ctypes.Structure):
_pack_ = 1 # structure field byte alignment
_fields_ = [
('biSize', DWORD),
('biWidth', LONG),
('biHeight', LONG),
('biPLanes', WORD),
('biBitCount', WORD),
('biCompression', DWORD),
('biSizeImage', DWORD),
('biXPelsPerMeter', LONG),
('biYPelsPerMeter', LONG),
('biClrUsed', DWORD),
('biClrImportant', DWORD)
]
SIZEOF_BITMAPINFOHEADER = ctypes.sizeof(BITMAPINFOHEADER)
***#GAIN AN ERROR FROM THIS LINE***
win32clipboard.OpenClipboard()
try:
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB):
data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)
else:
print('clipboard does not contain an image in DIB format')
sys.exit(1)
finally:
win32clipboard.CloseClipboard()
bmih = BITMAPINFOHEADER()
ctypes.memmove(ctypes.pointer(bmih), data, SIZEOF_BITMAPINFOHEADER)
if bmih.biCompression != BI_BITFIELDS: # RGBA?
print('insupported compression type {}'.format(bmih.biCompression))
sys.exit(1)
bmfh = BITMAPFILEHEADER()
ctypes.memset(ctypes.pointer(bmfh), 0, SIZEOF_BITMAPFILEHEADER) # zero structure
bmfh.bfType = ord('B') | (ord('M') << 8)
bmfh.bfSize = SIZEOF_BITMAPFILEHEADER + len(data) # file size
SIZEOF_COLORTABLE = 0
bmfh.bfOffBits = SIZEOF_BITMAPFILEHEADER + SIZEOF_BITMAPINFOHEADER + SIZEOF_COLORTABLE
bmp_filename = 'clipboard.bmp'
with open(bmp_filename, 'wb') as bmp_file:
bmp_file.write(bmfh)
bmp_file.write(data)
print('file "{}" created from clipboard image'.format(bmp_filename))
解决方案
我想我找到了。看起来 Windows 执行屏幕截图将其锁定。在键盘事件发送后添加一秒钟的睡眠使您的脚本可以在我的机器上运行。
编辑:以防万一您决定采用“简单但邪恶”的方式,这是进行重试的最简单代码。是的,我同意,这不是正确的方法,但它是一个快速而肮脏的修复。
def OpenClipboardWithEvilRetries(retries=10, delay=0.1):
while True:
try:
return win32clipboard.OpenClipboard()
except pywintypes.error as e:
if e.winerror!=5 or retries==0:
raise
retries = retries - 1
time.sleep(delay)
推荐阅读
- python - 如何将 Pandas 日期时间列的时间更改为午夜?
- python - 如何在 Python 中使用 if-else 语句在多个变量之间切换
- sql - 执行错误:CREATE DATABASE aNewDb。原因:org.postgresql.util.PSQLException:错误:CREATE DATABASE 不能在事务块内运行
- protobuf-net - 类型“Namespace.SomeAbstractType”只能参与一个继承层次结构(Namespace.InterfaceType)
- node.js - Express - 当 POST 请求按预期运行时,为什么 PUT 请求会返回 404 错误?
- javascript - 如何关闭间隔循环
- javascript - 为渲染器使用预定义的画布会导致麻烦
- python - ModuleNotFoundError:使用“pip install numpy”后没有名为“numpy”的模块
- javascript - 为什么 useReducer 的调度会导致重新渲染?
- java - Java:循环的 Thread.sleep() 是否总是在同一个物理内核上运行?