2014-10-31 5 views
0

У нас есть пользовательская форма экранной клавиатуры (OSK) как часть нашего приложения Windows Windows Forms. Эта клавиатура полезна для ввода данных в DataGridView и некоторых других текстовых окнах. Мы хотим использовать его для ввода имени файла в OpenFileDialog или SaveFileDialog.Использование пользовательской экранной клавиатуры с OpenFileDialog и SaveFileDialog

Однако, когда отображается диалоговое окно, форма, содержащая OSK, перестает отвечать на ввод. Я попытался создать новый Form, который используется как владелец OSK. Я использую новую форму и звоню keyboard.Show(owner). Это все еще не препятствует тому, чтобы клавиатура не могла использоваться, в то время как OpenFileDialog или SaveFileDialog находится в их методе ShowDialog.

Как мы можем использовать экранную форму клавиатуры поверх OpenFileDialog или SaveFileDialog без того, чтобы клавиатура была размещена в отдельном процессе?

ответ

2

Ну, запустив окно OSK в другом процессе - прекрасная идея. Вы получаете его бесплатно, запустив osk.exe, предоставленный Windows. Вы можете технически запустить еще одну ветку 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

Спасибо, Ханс! Это сработало отлично! Да!!! –