【发布时间】:2020-01-31 00:31:55
【问题描述】:
我需要在用户不应具有管理员权限的计算机上自动重新启动图形驱动程序。我的存档选项是使用 powershell 或从 powershell 调用的 C# 代码。
此问题中提到了重新启动图形驱动程序的最简单方法: PowerShell disable and enable a driver
$d = Get-PnpDevice| where {$_.class -like "Display*"}
$d | Disable-PnpDevice -Confirm:$false
$d | Enable-PnpDevice -Confirm:$false
但我不能使用它,因为它需要管理员权限才能执行。 第二种更好的方法是使用不需要管理员权限的 win + ctrl + shift + b 热键。 我在这个网站上找到了一个很好的例子:https://github.com/stefanstranger/PowerShell/blob/master/WinKeys.ps1
并根据我的需要构建它。
我的实际代码是这样的:
$source = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KeyboardSend
{
public class KeyboardSend
{
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
private const int KEYEVENTF_EXTENDEDKEY = 1;
private const int KEYEVENTF_KEYUP = 2;
public static void KeyDown(Keys vKey)
{
keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0);
}
public static void KeyUp(Keys vKey)
{
keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
}
}
"@
Add-Type -TypeDefinition $source -ReferencedAssemblies "System.Windows.Forms"
Function Win($Key, $Key2, $Key3)
{
[KeyboardSend.KeyboardSend]::KeyDown("LWin")
[KeyboardSend.KeyboardSend]::KeyDown("$Key")
[KeyboardSend.KeyboardSend]::KeyDown("$Key2")
[KeyboardSend.KeyboardSend]::KeyDown("$Key3")
[KeyboardSend.KeyboardSend]::KeyUp("LWin")
[KeyboardSend.KeyboardSend]::KeyUp("$Key")
[KeyboardSend.KeyboardSend]::KeyUp("$Key2")
[KeyboardSend.KeyboardSend]::KeyUp("$Key3")
}
Win 163 161 66
# 163 = ctrl key
# 161 = shift key
# 66 = b key
如果我尝试其他组合,例如 win + e 打开资源管理器,它就可以正常工作。但是如果我想输入 win + ctrl + shift + b ,它什么也不做,并且会自行关闭而不会出现错误消息。
我错过了什么吗?
【问题讨论】:
-
我复制/粘贴了您的代码并删除了额外的缩进(因为这里的字符串不喜欢
"@处的缩进)并且您的代码在 PowerShell V5 和 Powershell ISE 中都按预期工作。能不能在Powershell ISE中运行一下,运行后不会关闭,看看有没有输出。 -
@Jacob 感谢您对其进行测试。我的 PSVersion 是“5.1.17763.316”,如果我使用 Powershell ISE 运行它,它会在没有错误的情况下执行,但不要按预期重新启动我的图形驱动程序。每个快捷方式是否真的成功地重新启动了您的图形驱动程序?屏幕应该会变暗一到三秒钟。
-
是的,在 Surface Pro 3 PSVersion 5.1.18362.145 上按预期工作。虽然值得注意的是,我登录的是具有管理员权限的帐户,但我会尝试一个没有管理员权限的测试帐户,看看是否有任何变化。
标签: c# powershell