我有一个问题,我不知道还能做些什么来解决它。我在Windows 10 Enterprise 2016计算机上,正在尝试使用WMI(WEKF_PedefinedKey(启用键盘快捷键筛选。
我已经创建了一个Powershell脚本,当用鼠标右键->用Powershell运行时,它正是我想要的:
$CommonParams = @{"namespace"="rootstandardcimv2embedded"}
function Disable-Predefined-Key($Id) {
$predefined = Get-WMIObject -class WEKF_PredefinedKey @CommonParams |
where {
$_.Id -eq "$Id"
};
if ($predefined) {
$predefined.Enabled = 1;
$predefined.Put() | Out-Null;
Write-Host Disabled $Id
}
else {
Write-Host $Id is not a valid predefined key
}
}
Disable-Predefined-Key "Win+E"
运行此脚本后,快捷方式"Win+E"会被禁用。
现在的问题是:我需要从C#WPF应用程序运行这个脚本。但无论我做什么,我都无法从C#中以任何方式禁用快捷方式。
我尝试过的(在以下所有情况下,以管理员身份登录并包含一个requestedExecutionLevel级别为"requireAdministrator"的清单文件,以确保我拥有正确的凭据(:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"powershell.exe";
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.Arguments = Properties.Settings.Default.DisableKey;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
和:
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript(@"C:UsersAdministratorDesktopNewfolderdisablekey.ps1", false);
Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
foreach (PSObject outputItem in PSOutput)
{
if (outputItem != null)
{
//TODO: do something with the output item
}
}
}
我还尝试将脚本的内容解析为字符串,并尝试在PowerShell对象上使用执行此操作。在上面提到的方法之间,我也尝试过几乎任何可以想象的方法,但似乎都没有效果。第一个方法打开一个Powershell窗口,眨眼间我就可以看到输出,它是"Enabled Win+E",所以脚本似乎至少已经运行了。但是Win+E仍然处于活动状态。
更让我困惑的是,以下启用/禁用UWF过滤器的代码(也是WMI,也是所需的管理员权限(运行良好:
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript(Properties.Settings.Default.EnableUWF);
// [0] = result or error
var result = PowerShellInstance.Invoke();
}
EnableUWF设置的值如下:
$COMPUTER = "localhost"
$NAMESPACE = "rootstandardcimv2embedded"
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned;
$objUWFInstance = Get-WMIObject -namespace $NAMESPACE -class UWF_Filter;
$retval = $objUWFInstance.Enable();
if ($retval.ReturnValue -eq 0) {"Unified Write Filter will be enabled after the next system restart."}
else {"Unknown Error: " + "{0:x0}" -f $retval.ReturnValue}
备注:在Keyboardfilter脚本中设置ExecutionPolicy没有任何区别(甚至没有删除(。已安装的PowerShell版本:专业5次要114393年建造修订版1944
希望有人能帮我解决这个问题。
我建议在WPF应用程序中使用C#的本机WMI库,而不是使用PowerShell。首先,通过NuGet下载System.Management
。然后为KeyboardFilter 创建一个新类
using System.Management;
namespace YourWPFApp
{
public class KeyboardFilter
{
public static void DisablePredfinedKey(string keyId)
{
ManagementScope scope = new ManagementScope
{
Path = new ManagementPath
{
NamespacePath = @"rootstandardcimv2embedded",
ClassName = "WEKF_PredefinedKey"
}
};
ManagementClass wekfPredefinedKey = new ManagementClass(scope.Path);
var output = wekfPredefinedKey.InvokeMethod("Enable", new object[] { keyId });
}
}
}
然后从ViewModel或CodeBehind调用DisablePredefinedKeys
方法。
KeyboardFilter.DisablePredfinedKey("Win+E");
注意:我还没有在Windows10上测试过这个
这已经在Windows 10 Enterprise上进行了测试。
注意:如果在64位系统上运行,请确保在关闭"首选32位"的情况下进行编译。