我正在尝试以编程方式杀死 Osk.exe 实例。
我有一个对话框,允许用户使用按钮启动 osk,如果他们自己不关闭它,我会通过关闭形式的代码将其关闭。
我的代码如下所示,用于创建和关闭。
Public Sub ClavierCommandExecute()
Dim path64 = "C:\Windows\winsxs\amd64_microsoft-windows-osk_31bf3856ad364e35_10.0.19041.1_none_60ade0eff94c37fc\osk.exe"
Dim path32 = "C:\windows\system32\osk.exe"
Dim Path = If(Environment.Is64BitOperatingSystem, path64, path32)
Me.ProcessusClavier = Process.Start(Path)
End Sub
Public Sub FermerCommandExecute()
Dim processOSK = Process.GetProcessesByName("osk")
For Each proc In processOSK
proc.Kill()
Next
Me.Close()
End Sub
问题是,如果我这样做,osk 进程会继续在后台运行。我可以这么说,因为当我锁定笔记本电脑时,它会重新打开操作系统。如果它可以帮助我仍然使用 Windows 10 64 位。
但是如果我使用关闭按钮甚至通过任务管理器手动关闭它,一切都会正常工作。
通常这不会是一个问题,但我觉得它由于没有被正确杀死而造成了内存泄漏。
好吧,问题来自于我需要成为管理员才能正确杀死 OSK.exe。
我替换了简单的processOSK.kill() 通过该代码,我可以以管理员身份通过任务杀死它。
Dim process As System.Diagnostics.Process = New System.Diagnostics.Process()
Dim startInfo As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo()
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
startInfo.FileName = "taskkill.exe"
startInfo.Arguments = "/im osk.exe"
startInfo.Verb = "runas"
process.StartInfo = startInfo
process.Start()
您可以使用以下代码关闭屏幕键盘:
public static void HideOnScreenKeyboard()
{
foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName("osk"))
{
process.Kill();
}
}