Python使用win32api模拟鼠标移动并复制粘贴到磁盘文件

1 投票
1 回答
2317 浏览
提问于 2025-04-18 07:47

大家好…我正在使用win32api。这个工具的目的是在电脑屏幕上移动鼠标,选中一个区域,复制里面的内容,然后把这些内容发送到一个MS Excel电子表格里。

这是我的代码:

import xlwt
import win32api
import win32con 
import win32clipboard
import time

x,y = win32api.GetCursorPos()
win32api.SetCursorPos((36, 311))

# choose the contents, highlight area from 36,311 to 66,400
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) 
time.sleep(0.05)
win32api.SetCursorPos((66, 400))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

# copy the contents
time.sleep(0.05)
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard
aaa = win32clipboard.SetClipboardData
win32clipboard.CloseClipboard()

# write the contents into speadsheet
book = xlwt.Workbook(encoding='utf-8', style_compression = 0)
sheet = book.add_sheet('SheetOK', cell_overwrite_ok = True)
sheet.write (1, 1, aaa)
book.save("C:\\paste_write.xls")

但是它没有正常工作,返回了一个错误:“异常:意外的数据类型”。看起来复制和粘贴的部分出了问题。

你能帮我吗?谢谢。

错误信息:

Traceback (most recent call last):
  File "C:\Python27\simulate mouse click.py", line 27, in <module>
    sheet.write (0, 0, aaa)
  File "C:\Python27\lib\xlwt\Worksheet.py", line 1030, in write
    self.row(r).write(c, label, style)
  File "C:\Python27\lib\xlwt\Row.py", line 259, in write
    raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <type 'builtin_function_or_method'>

1 个回答

1

错误信息告诉你出错的代码行在哪里:

Traceback (most recent call last):
  File "C:\Python27\simulate mouse click.py", line 27, in <module>
    sheet.write (0, 0, aaa)
  ^^^ THIS YOUR FUNCTION CALL THAT FAILED

  File "C:\Python27\lib\xlwt\Worksheet.py", line 1030, in write
    self.row(r).write(c, label, style)
  File "C:\Python27\lib\xlwt\Row.py", line 259, in write
    raise Exception("Unexpected data type %r" % type(label))
  ^^^ THIS IS WHERE IT ACTUALLY FAILED IN THE LIBRARY

Exception: Unexpected data type <type 'builtin_function_or_method'>

这个错误信息说明有东西收到了一个“意外的数据类型”,这个类型是'builtin_function_or_method'。所以调用sheet.write的时候,它对你传入的数据不满意。

如果你回头看看aaa的值:

aaa = win32clipboard.SetClipboardData

哦,你本来是想调用这个函数的,但你忘记加上括号()了。所以现在aaa被赋值为这个函数本身。要调用这个函数,可以看看这个回答的详细信息 Python中的剪贴板问题

你在上面那行的函数调用中也忘记加上括号了。

win32clipboard.EmptyClipboard

你可以试试下面这个:

win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText("test data")
...
aaa = win32clipboard.GetClipboardText()

不过这里似乎还有第二个问题,你需要给SetClipbardData传递数据——它并不会对当前选中的文本执行复制操作。你可能需要使用其他的API来实现这个功能。

撰写回答