Visual Basic:重新启动桌面 Windows 管理器 (DWM)

问题描述 投票:0回答:2

如何重新启动桌面 Windows 管理器? 我已经尝试过:

For Each Proc As Process In Process.GetProcessesByName("DWM")
Proc.Kill()
Next

但是它给了我一个错误: System.dll 中发生类型为“System.ComponentModel.Win32Exception”的未处理异常

附加信息:无权访问

如果我在记事本上使用它:

For Each Proc As Process In Process.GetProcessesByName("NOTEPAD")
Proc.Kill()
Next

效果很好。

有人知道该怎么做吗?

.net vb.net windows
2个回答
2
投票

除了 Evan L 所写的有关权限的内容之外,您还应该使用 System.ServiceProcess.ServiceController 类来优雅地重新启动,而不是仅仅杀死它。

例如,添加对

System.ServiceProcess
的引用后,以下代码将重新启动 DWM(服务名称
UXSMS
):

    Using dwmService As New System.ServiceProcess.ServiceController("UxSMS")
        dwmService.Stop()
        dwmService.WaitForStatus(ServiceProcess.ServiceControllerStatus.Stopped)
        dwmService.Start()
        dwmService.WaitForStatus(ServiceProcess.ServiceControllerStatus.Running)
    End Using

显然这省略了任何错误检查等。

例如。如果服务未运行会发生什么?

PS。出于兴趣,你为什么要搞乱系统服务?大多数 DWM 相关的东西都有实际的 API,并且在 Windows 8 上你无论如何都无法真正禁用桌面合成...


1
投票

正如您的错误所述

No Access
是因为您使用的帐户或权限级别不允许您在该进程上调用
Kill()

您需要以提升的权限运行,或者确保您的帐户是尝试运行消息的计算机上的管理员。

如任务管理器中所示 - DWM 归 SYSTEM 所有,因此只有 SYSTEM 或管理员可以终止该进程。

编辑:

如果您想提升程序本身的权限,请进入您的

app.manifest
并更改此行:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

致:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
© www.soinside.com 2019 - 2024. All rights reserved.