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

时间:2014-01-16 17:46:42

标签: .net vb.net windows

如何重新启动桌面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

工作正常 谁知道怎么做?

2 个答案:

答案 0 :(得分: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

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

EG。如果服务没有运行会发生什么?

PS。出于兴趣,你为什么要搞乱系统服务?大多数与DWM相关的东西都有actual API,而在Windows 8上你无法真正禁用桌面组合......

答案 1 :(得分:1)

由于您的错误状态为No Access,因为您使用的帐户或权限级别不允许您在该流程上调用Kill()

您需要使用提升的权限运行,或者确保您的帐户是您尝试运行该邮件的计算机上的管理员。

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

编辑:

如果您想提升程序本身的权限,请转到app.manifest并更改此行:

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

要:

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