【问题标题】:Get filename after a CTRL+C on a file with Windows Explorer使用 Windows 资源管理器在文件上按 CTRL+C 后获取文件名
【发布时间】:2018-09-03 21:45:15
【问题描述】:

当您对文件执行 Copy (CTRL+C) 时,然后在某些程序中(例如:它在 Windows 资源管理器地址栏中工作,也与一切索引软件),在粘贴时(CTRL+V),文件名或目录名像文本一样粘贴,像这样:@987654322 @。

我试过了:

  • CTRL+C 在 Windows 资源管理器中的文件或文件夹上
  • 运行:

    import win32clipboard
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()
    print data
    

但我收到此错误:

TypeError: 指定的剪贴板格式不可用

问题:如何在 Windows 资源管理器中检索已“复制”(CTRL+C) 的文件的文件名?

【问题讨论】:

    标签: python windows clipboard pywin32


    【解决方案1】:

    剪贴板可能包含不止一种格式。例如,当从 MS word 复制格式化文本时,格式化文本和纯文本都将在剪贴板中,因此根据您要粘贴到的应用程序,目标应用程序可能采用一种或另一种格式,具体取决于关于它支持什么。

    来自MSDN

    一个窗口可以在剪贴板上放置多个剪贴板对象, 每个代表不同剪贴板中的相同信息 格式。在剪贴板上放置信息时,窗口应 以尽可能多的格式提供数据。想知道有多少 剪贴板上当前使用的格式,调用 CountClipboardFormats 函数。

    因此,win32clipboard.GetClipboardData 采用一个参数:format,默认为 win32clipboard.CF_TEXT

    当你不带参数调用它时,它会报错TypeError: Specified clipboard format is not available,因为剪贴板中没有文本格式。

    您可以改为要求win32clipboard.CF_HDROP 格式,即“Unicode 文件名元组”

    import win32clipboard
    win32clipboard.OpenClipboard()
    filenames = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
    win32clipboard.CloseClipboard()
    for filename in filenames:
        print(filename)
    

    另见MSDN doc for standard clipboard formats

    【讨论】:

    【解决方案2】:

    这对我有用:

    import win32clipboard
    win32clipboard.OpenClipboard()
    filename_format = win32clipboard.RegisterClipboardFormat('FileName')
    if win32clipboard.IsClipboardFormatAvailable(filename_format):
        input_filename = win32clipboard.GetClipboardData(filename_format).decode("utf-8")
        print(input_filename)
    win32clipboard.CloseClipboard()
    

    打印整个文件路径,如果你只想使用文件名:

    os.path.basename(input_filename)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2017-07-07
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      相关资源
      最近更新 更多