Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > подмена кода нажатой клавиши


Автор: kobra 30.5.2007, 16:40
задача такая: при нажатии на ентер номер 13 превратить в 9. т.е. чтоб программа восприняла его как таб. или вообше 0.
в делфи так делаю
Код

procedure CMDialogKey(var Msg: TWMKey);
begin
  if not (ActiveControl is TButton) then
    if Msg.Charcode = 13 then
      Msg.Charcode := 9;
  inherited;
end;


а как в шарпе?
спосибо

Автор: marcusmae 30.5.2007, 17:04
Можно перехватывать сообщение, возникающее при нажатии кнопки. Для этого следующие обработчики событий KeyDown и KeyPress следует добавить в класс формы (или иного контрола) :

(в примере рассматривается предотвращение нажатия нецифровых символов)

Код

// Логический флаг, используемый для выявления был ли нажат символ, отличный от цифрового.
private bool nonNumberEntered = false;

// Обработчик события KeyDown, который определяет тип символа, нажатого на контроле.
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Изначально определить ложью.
    nonNumberEntered = false;

    // Проверить, является ли нажатия клавиша спецклавишей из верхнего ряда.
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
    {
        // Проверить, является ли нажатая клавиша клавишей из цифрового набора справа.
        if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
        {
            // Проверить, является ли нажатая клавиша бекспейсом.
            if(e.KeyCode != Keys.Back)
            {
                // Нажата нецифровая клавиша.
                // Установить флаг в истину.
                nonNumberEntered = true;
            }
        }
    }
}

// Это событие происходит после события KeyDown и может быть использовано для предотвращения нажатий нецифровых символов на контроле.
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    // Проверить состояние флага, которое до этого установил обработчик события the KeyDown.
    if (nonNumberEntered == true)
    {
        // Предотвратить тажатие клавиши на контроле, поскольку она не является цифрой.
        e.Handled = true;
    }
}


http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.onkeypress.aspx

Пример несколько более общий, может это лучше? = В Вашем случае будет достаточно одной проверки на (e.KeyCode == Keys.Enter).

Автор: kobra 30.5.2007, 19:45
marcusmae спосибо.
этот метод мне известен. но он не решает задачу замены кода клавиши.
правда, если нечего лущего не наиду, восползуюс им

Автор: marcusmae 30.5.2007, 20:05
Ой, самого главного не рассказал! Сорри. Да, я показал, как решается задача отлова и нейтрализации клавиши, которую Вы хотите заменять. Остаётся в одном из обработчиков сгенерить новую клавишу. Делается с помощью метода класса http://msdn2.microsoft.com/en-us/library/system.windows.forms.sendkeys(vs.80).aspx. Например, сгенерить TAB будет так :

Код

using System.Windows.Forms;

...

SendKeys.Send("{TAB");


Я правильно понял, что Вы хотите эмулировать нажатие другой клавиши по нажатию заданной?

Существует ещё один способ, основывающийся на работе с WndProc, то есть напрямую с оконными сообщениями - описан, например http://forum.vingrad.ru/topic-110147/view-findpost/p-839920.html. Но он вряд ли понадобится, если только Вы не захотите эмулировать специальные команды типа закрытия/минимизации/максимизации окон и тд.

Автор: kobra 30.5.2007, 21:44
SendKeys явно не подходит, он посилает строку и эта строка пишется в елементе.
хук ставить не хотел, но видать придется.
спосибо

Автор: marcusmae 30.5.2007, 21:49
Прям так и пишет что ли "{TAB"? - Это странно. Вы не забыли ведущий спецсимвол?

Цитата

To specify characters that aren't displayed when you press a key, such as ENTER or TAB, and keys that represent actions rather than characters, use the codes in the following table.

Автор: Retro 30.5.2007, 22:09
Если нужно поменять Enter на Tab, например в textBox(или еще где), я делаю так:

Код


        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == char.Parse("\r"))
                e.KeyChar = char.Parse("\t");
        }


Или я неправильно понял САБЖ?

Автор: marcusmae 30.5.2007, 22:26
Цитата(Retro @  30.5.2007,  22:09 Найти цитируемый пост)
Или я неправильно понял САБЖ?


Кажется, нет, kobra хочет подменять нажатие клавиш...

Хотя я и сам перестал понимать. Если в контроле активизирована область заполнения, то что жми enter, что эмулируй - всё-равно он будет "отображаться".


Автор: kobra 31.5.2007, 08:20
Цитата(marcusmae @  30.5.2007,  22:26 Найти цитируемый пост)
Хотя я и сам перестал понимать.

в этом конкретном случае, подмена нужна для следуишего:
представим себе форму ввода данних. на нем много едитов, комбо и т.д. и т.п.
для перехода между контролами стандартно используется Tab и Shift+Tab. код показанный в первом посте, перехватывает Enter превращая его в Tab, при этом нажимая на Enter происходит передача курсора с одного контрола на другои.
тоже самое собираюс сделать на шарпе.
как понял, и тут придется воспользоватся WndProc-ом, правда кое что там не понял.
начну разбиратся.

Автор: kobra 31.5.2007, 11:08
нашел всеже, и тут тотже метод что и в делфи, а я сколько мучался smile 
Код
protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Return)
            {
                keyData = Keys.Tab;
            }
            return base.ProcessDialogKey(keyData);
        } 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)