Можно ли получить символ после нажатия клавиши «Shift», не нажимая Shift? - PullRequest
3 голосов
/ 06 января 2010

Возможно ли получить символ, если нажать «Shift», то есть, если я нажму «1», я получу символ «1», но если я удерживаю «Shift», он станет «!» - все без кавычек конечно. Как мне сделать что-то подобное программно?

Был метод, в котором вы могли просто добавить код ASCII. Однако этот параметр не подходит, так как он не будет работать в каждой локали.

Есть ли опция, которая будет работать в .NET и, возможно, в Silverlight, где я могу передать символ, такой как "9", и получить результат "("?

Программно нажатие «Shift» в этом случае не будет работать, равно как и любое решение на основе SendKeys из-за ограничений платформы.

Это будет для виртуальной клавиатуры, например экранной клавиатуры в Silverlight.

Ответы [ 5 ]

2 голосов
/ 06 января 2010

Не могли бы вы просто потратить несколько минут на создание собственного картографического стола?

1->!
2->@
3->#
etc. etc. etc.
0 голосов
/ 06 января 2010

найдите математику за числами каждого персонажа и работайте с ней ...

0 голосов
/ 06 января 2010

Именно для этого WPF и SilverLight предлагают событие TextInput. Введенный символ будет содержаться в свойстве TextCompositionEventArgs.Text. Событие уже учитывает локаль пользователя и раскладку клавиатуры:

private void Window_TextInput(object sender, TextCompositionEventArgs e)
{
    // e.Text contains the character that corresponds to the
    // key combination that was pressed
    Trace.WriteLine("TEXT: " + e.Text);
}

На самом деле это может не решить вашу проблему, поскольку вы специально спросили о функции преобразования. Мне неизвестна такая функция в WPF / Silverlight (есть класс KeyConverter, но его назначение другое; его можно использовать для сопоставления цифровых клавиш и цифровых клавиш на цифровой клавиатуре с одним и тем же ключом) , Однако вы, должно быть, откуда-то получаете коды клавиш, и если это клавиатура, это событие должно прекрасно подойти.

В приложениях Windows Forms (хотя здесь это не имеет значения) соответствующее событие для получения действительного символа будет Control.KeyPress.

0 голосов
/ 06 января 2010

Скорее всего, вам придется немного поработать над API.

Вы можете начать здесь: http://msdn.microsoft.com/en-us/library/aa920537.aspx

Больше хорошего чтения: http://www.microsoft.com/globaldev/handson/dev/unicode-kbdsonwindows.pdf

0 голосов
/ 06 января 2010

Я хотел бы ответить на вопрос: как узнать, какая раскладка клавиатуры используется? Т.е. на одной из моих систем число 2 имеет знак @. С другой стороны, он имеет знак "-sign (двойная кавычка). Вы говорите, что 9 имеет знак (-sign, а у моего (-sign сверху 0 и знак"-) сверху знака минус.

Windows поставляется по умолчанию с сотнями раскладок клавиатуры (т. Е. Узбекской кириллицей, США, США, по умолчанию, голландский, немецкий и немецкий IBM и т. Д.). AZERTY против QWERTY и так далее.

Реальный вопрос может быть следующим: как программно читать отображение клавиатуры в Windows. Я не знаю. Хотя это будет возможно, если вы узнаете, как вы можете взаимодействовать с файлами драйверов, вы, вероятно, будете быстрее использовать карту, основанную, например, на макетах в моей первой ссылке выше. Когда вы читаете тип клавиатуры из реестра, она охватывает большинство случаев.

В качестве альтернативы, вы можете рассмотреть возможность программной установки липких клавиш для Shift (установите липкие клавиши, отправьте сообщение клавиши Shift и все готово).

(обратите внимание, что ASCII не имеет ничего общего с кодами сканирования клавиатуры. Хотя он мог бы работать для некоторых систем, он никогда не работал бы надежно для всех.)

EDIT: попробуйте создатель раскладки клавиатуры от Microsoft. После процесса создания и небольшого реверс-инжиниринга не составит труда узнать, как пишутся раскладки клавиатуры. Тем не менее, если вам нужна только поддержка одной раскладки клавиатуры, возьмите ее в редакторе, отмените действие Shift и просто программно установите вновь созданную раскладку клавиатуры (и измените ее обратно) до и после того, как кто-то начнет печатать.

...