2014-10-31 56 views
0

我们有一个自定义的屏幕键盘(OSK)窗体作为我们的.NET Windows窗体应用程序的一部分。此键盘用于将数据输入到DataGridView和其他一些文本框中。我们希望能够使用它将文件名输入到OpenFileDialogSaveFileDialog使用OpenFileDialog和SaveFileDialog自定义屏幕键盘窗体

但是,当任一对话框出现时,包含OSK的表单将停止响应输入。我尝试创建一个新的Form作为OSK的所有者。我使用新表格并致电keyboard.Show(owner)。这仍然不能防止当OpenFileDialogSaveFileDialog处于ShowDialog方法中时无法使用键盘。

我们如何在OpenFileDialogSaveFileDialog的顶部使用屏幕键盘形式,而不必将键盘托管在单独的进程中?

回答

2

那么,在另一个进程中运行OSK窗口的一个好主意。您可以通过运行由Windows提供的osk.exe免费获得。你可以在技术上运行它的另一个STA线程,但这是一个相当先进的技术,在很多方面SystemEvents类可以严重破坏你的生活。

但是,您可以用一条代码解决问题,您只需在显示对话框后立即重新启用OSK窗口即可。用的BeginInvoke()方法做优雅:

private void OpenButton_Click(object sender, EventArgs e) { 
     this.BeginInvoke(new Action(() => EnableWindow(osk.Handle, true))); 
     if (openFileDialog1.ShowDialog(this) == DialogResult.OK) { 
      // etc... 
     } 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern bool EnableWindow(IntPtr hWnd, bool enable); 

随着假设osk变量存储到您的OSK形式的参考。

+0

谢谢,汉斯!这工作完美!是!!! – 2014-10-31 19:42:07