代码之家  ›  专栏  ›  技术社区  ›  gehho

process.closeMainWindow()不工作

c#
  •  2
  • gehho  · 技术社区  · 14 年前

    我像这样启动屏幕上的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内置屏幕键盘,它自动适应所选的键盘布局,为我节省了大量的工作。

    2 回复  |  直到 8 年前
        1
  •  2
  •   gehho    14 年前

    我自己找到了解决方案:

    当我成功取回 MainWindowHandle 进程启动后,调用 CloseMainWindow() 稍后也是成功的。我不明白这是为什么,但重要的是:它起作用了!

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

    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) { }
    }
    

    在这段代码中,我不断地得到 主窗口句柄 每50毫秒,只要它仍然等于 IntPtr.Zero . 如果在2秒后无法检索句柄,我将退出循环以避免出现错误时出现无休止的循环。

        2
  •  2
  •   Kirill    12 年前

    您需要等待直到进程完成初始化,运行 Process.WaitForInputIdle Method 为了做到这一点。