Используйте пользовательскую форму экранной клавиатуры с OpenFileDialog и SaveFileDialog

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

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

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


person xofz    schedule 31.10.2014    source источник


Ответы (1)


Что ж, запустить окно 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.

person Hans Passant    schedule 31.10.2014