我像这样启动 Windows 屏幕键盘:

s_onScreenKeyboard = new Process();
s_onScreenKeyboard.StartInfo = new ProcessStartInfo("osk.exe");
s_onScreenKeyboard.EnableRaisingEvents = true;
s_onScreenKeyboard.Exited += new EventHandler(s_onScreenKeyboard_Exited);
s_onScreenKeyboard.Start();

这工作正常,但是当我尝试使用以下代码停止它时,它不起作用,即 OSK 继续运行并且该方法返回 false :
s_onScreenKeyboard.CloseMainWindow();
if (!s_onScreenKeyboard.HasExited)
{
    if (!s_onScreenKeyboard.WaitForExit(1000))
    {
        s_onScreenKeyboard.Close();
        //s_onScreenKeyboard.Kill();
    }
}

取消注释 s_onScreenKeyboard.Kill(); 时它会关闭,但问题是 osk.exe 显然使用了另一个名为“msswchx.exe”的进程,如果我只是杀死 OSK 进程,则该进程不会关闭。这样,我最终会得到数百个这样的过程,这不是我想要的。

另一个奇怪的事情是 CloseMainWindow() 调用在某个时间起作用,但后来突然不再起作用了,我不记得发生了什么变化。

有任何想法吗?

编辑: 我自己找到了解决方案。请 see my answer 了解详情。

背景:
我正在为我的应用程序实现一个屏幕键盘,因为它应该与触摸屏一起使用。键盘布局与 Windows 中配置的布局相匹配很重要,因为应用程序将被运送到许多不同的国家。因此,而不是使用约实现自定义键盘控件。 537个键盘布局(这里有点夸张……),我想利用Windows内置的屏幕键盘,它会自动适应所选的键盘布局,为我节省了很多工作。

最佳答案

我自己找到了/一个解决方案:

当我在进程启动后成功检索到 MainWindowHandle 时,稍后对 CloseMainWindow() 的调用也成功了。我不明白这样做的原因,但重要的是:它有效!

顺便说一句,对于其他有同样问题的人 :MainWindowHandle 在启动过程后无法立即使用。显然,MainWindow 启动需要几毫秒的时间,这就是为什么我使用以下代码来检索句柄:

DateTime start = DateTime.Now;
IntPtr handle = IntPtr.Zero;

while (handle == IntPtr.Zero && DateTime.Now - start <= TimeSpan.FromSeconds(2))
{
    try
    {
        // sleep a while to allow the MainWindow to open...
        System.Threading.Thread.Sleep(50);
        handle = s_onScreenKeyboard.MainWindowHandle;
    }
    catch (Exception) { }
}

在这段代码中,只要它仍然等于 MainWindowHandle ,我就会每 ~50ms 不断地获取 IntPtr.Zero 。如果在 2 秒后无法检索句柄,我将退出循环以避免出现错误时的无限循环。

关于c# - Process.CloseMainWindow() 不工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2948510/

10-12 00:28
查看更多