AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77860832
Accepted
Danny Coleiro
Danny Coleiro
Asked: 2024-01-22 23:06:19 +0800 CST2024-01-22 23:06:19 +0800 CST 2024-01-22 23:06:19 +0800 CST

如何通过 VBA 和 PowerShell 命令清除 Windows 10 剪贴板历史记录

  • 772

我想通过VBA和PowerShell命令清除Windows 操作系统剪贴板历史记录。

我是Windows 10用户。

这是清除Windows 操作系统剪贴板历史记录的 PowerShell 命令行。

PS C:\Windows\system32> Restart-Service -Name "cbdhsvc*" -force

以下链接可能有助于理解我在说什么。

https://mspoweruser.com/clear-clipboard-windows/#:~:text=Press%20Windows%20%2B%20I%20on%20your,menu%20of%20the%20Settings%20app。

vba
  • 1 1 个回答
  • 118 Views

1 个回答

  • Voted
  1. Best Answer
    mklement0
    2024-01-23T01:03:02+08:002024-01-23T01:03:02+08:00

    先决条件:

    • 您必须至少在 Windows 10或至少安装了桌面体验选项的Windows Server 2016上运行,因为只有这样才能使用剪贴板历史记录功能。

    使用 PowerShell有两种方法清除剪贴板历史记录

    • 使用类::ClearHistory()的静态方法。Windows.ApplicationModel.DataTransfer.Clipboard

      # Windows PowerShell only (not PowerShell 7+)
      [Windows.ApplicationModel.DataTransfer.Clipboard, Windows, ContentType = WindowsRuntime]::ClearHistory()
      
      • 这样做的优点是不需要提升(以管理员身份运行)。

      • 但是,由于它是UWP类,因此它仅适用于Windows PowerShell,因为至少从当前版本 7.4.x 底层的 .NET 8 版本开始, PowerShell (Core) 7+无法访问此类类。

      • 此外,这仅适用于前台运行空间(UI 线程),因此不能用于后台作业(例如,包括基于线程的作业)。

    • 使用Restart-Servicecmdlet停止并重新启动剪贴板历史记录 Windows 服务:

      #requires -RunAsAdministrator
      Set-Clipboard $null; Restart-Service cbdhsvc_*
      
      • 不幸的是,此方法仅适用于提升的PowerShell 会话。

      • 但是,它也适用于 PowerShell 7+,并且还可以用于(提升的)非前台调用,例如来自作业的调用。

      • 该Set-Clipboard $null调用确保当前剪贴板数据也被删除(上面的 .NET API 调用会自动执行此操作),但请注意,在 PowerShell 7+ 中(与Windows PowerShell不同),这不会清除当前剪贴板,而是替换其内容带有一个空字符串,在历史记录中如此记录;但是,由于重新启动服务并因此在此调用后清除历史记录,这并不重要。

      • 如果您在较旧的系统上运行(Windows 10 之前的系统,或者可能是非常早期、早已过时的 Windows 10 版本),则通配符表达式将与现有服务名称不匹配,并且该操作将是安静的 no-op。

        • 要排除这种情况,您可以运行以下命令:

          if (-not (Get-Service cbdhsvc_*)) { throw "Clipboard history service not found." }
          
      • 需要通配符模式,因为剪贴板历史服务的全名在每次登录时都会发生变化,这是由于_后跟 5 个十六进制数字组成的(伪)随机后缀,例如cbdhsvc_5e5a8。

        • 之所以这样做,是因为它是一项针对每用户的服务,正如SuperUser 答案中所解释的那样。然而奇怪的是,停止和重新启动此类服务仍然需要提升。

    从 VBA调用剪贴板历史清除 PowerShell 命令:

    • 使用COM对象.Run()的方法WScript.Shell...

    • ... 调用powershell.exeWindows PowerShell CLI,其调用::ClearHistory()显示在顶部。

      • 注意:因此,UI 线程规定也适用于此处:必须从托管 VBA 的应用程序的 UI 线程进行调用。

    下面的代码运行 PowerShell 控制台窗口,该窗口总是通过在调用中使用窗口样式创建为 hide。 要进行故障排除,请切换到,并将其置于通话中。vbHide.Run()
    vbNormalFocus-NoExit-Commandpowershell.exe

    Dim exitCode as Integer
    
    ' Run the PowerShell command hidden (vbHide), synchronously (True)
    ' and obtain its exit code.
    exitCode = CreateObject("WScript.Shell").Run( _
     "powershell.exe -NoProfile -Command [Windows.ApplicationModel.DataTransfer.Clipboard, Windows, ContentType = WindowsRuntime]::ClearHistory()", _
     vbHide, _
     True _
    )
    
    If exitCode = 0 Then ' Command succeeded.
        ' Report success.
        MsgBox "Successfully cleared the clipboard history.", vbInformation
    Else ' Command indicated failure.
        MsgBox "An unexpected error occurred while trying to clear the clipboard history", vbExclamation
    End If
    

    如果由于某种原因,powershell.exe无法从 VBA 托管应用程序的 UI 线程进行调用,则需要使用该Restart-Service方法,并且这样做总是需要提升。

    • 然后,您必须powershell.exe以嵌套方式调用,以便内部powershell.exe调用可以通过请求提升。Start-Process -Verb RunAs

      • 重要信息:除非托管 VBA 的应用程序本身正在运行提升,否则您将看到一个UAC对话框来确认或授权提升请求。

        • 与直接使用 PowerShell 一样,这意味着非管理员用户无法运行该命令,除非管理员在场提供其凭据以授权该请求。

        • 通过考虑安全性的设计,您无法自动响应 UAC 对话框,并且从非提升进程中避免它们的唯一方法是完全禁用 UAC(部分),出于安全原因,强烈建议不要这样做,或者 - 但前提是原则上您是管理员组的成员 - 定义执行所需操作的计划任务。有关详细信息,请参阅此答案。

      • 下面的代码通过在调用中使用而不是在嵌套 PowerShell调用中使用来运行隐藏创建的 PowerShell 控制台窗口。 要进行故障排除,请切换到两个通话并在其中使用。vbHidevbNormalFocus.Run()-WindowStyle HiddenStart-Process
        vbNormalFocus-NoExitpowershell.exe

    Dim exitCode as Integer
    
    ' Run the PowerShell command with elevation, synchronously, 
    ' and obtain the exit code.
    exitCode = CreateObject("WScript.Shell").Run("powershell.exe Start-Process -Wait -Verb RunAs -WindowStyle Hidden powershell.exe 'Restart-Service cbdhsvc_*'", vbHide, True)
    
    If exitCode = 0 Then ' Command succeeded.
        ' Display the output.
        MsgBox "Successfully cleared the clipboard history.", vbInformation
    Else ' Command indicated failure.
        MsgBox "An unexpected error occurred while trying to clear the clipboard history", vbExclamation
    End If
    
    • 2

相关问题

  • 搜索括号内的文本并设置其格式

  • 使用 VBA 将形状分配给 Powerpoint 中的组

  • Word VBA,将光标移动到编号列表中下一个数字的开头

  • 使用 vba 宏为每个帐户执行 Outlook 规则

  • 从访问 OLE 对象中提取文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve