2014-10-31 42 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