Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подмена кода нажатой клавиши, System.Windows.Forms 
V
    Опции темы
kobra
Дата 30.5.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



задача такая: при нажатии на ентер номер 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;


а как в шарпе?
спосибо
PM MAIL   Вверх
marcusmae
Дата 30.5.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Можно перехватывать сообщение, возникающее при нажатии кнопки. Для этого следующие обработчики событий 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;
    }
}


Подробнее...

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

Это сообщение отредактировал(а) marcusmae - 30.5.2007, 18:32


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
kobra
Дата 30.5.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



marcusmae спосибо.
этот метод мне известен. но он не решает задачу замены кода клавиши.
правда, если нечего лущего не наиду, восползуюс им
PM MAIL   Вверх
marcusmae
Дата 30.5.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Ой, самого главного не рассказал! Сорри. Да, я показал, как решается задача отлова и нейтрализации клавиши, которую Вы хотите заменять. Остаётся в одном из обработчиков сгенерить новую клавишу. Делается с помощью метода класса SendKeys. Например, сгенерить TAB будет так :

Код

using System.Windows.Forms;

...

SendKeys.Send("{TAB");


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

Существует ещё один способ, основывающийся на работе с WndProc, то есть напрямую с оконными сообщениями - описан, например здесь. Но он вряд ли понадобится, если только Вы не захотите эмулировать специальные команды типа закрытия/минимизации/максимизации окон и тд.

Это сообщение отредактировал(а) marcusmae - 30.5.2007, 20:18


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
kobra
Дата 30.5.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



SendKeys явно не подходит, он посилает строку и эта строка пишется в елементе.
хук ставить не хотел, но видать придется.
спосибо
PM MAIL   Вверх
marcusmae
Дата 30.5.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Прям так и пишет что ли "{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.


Это сообщение отредактировал(а) marcusmae - 30.5.2007, 21:52


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Retro
Дата 30.5.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Диалектик
***


Профиль
Группа: Участник Клуба
Сообщений: 1934
Регистрация: 28.6.2005
Где: Киев

Репутация: 9
Всего: 117



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

Код


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


Или я неправильно понял САБЖ?
PM MAIL   Вверх
marcusmae
Дата 30.5.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



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


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

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




--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
kobra
Дата 31.5.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

в этом конкретном случае, подмена нужна для следуишего:
представим себе форму ввода данних. на нем много едитов, комбо и т.д. и т.п.
для перехода между контролами стандартно используется Tab и Shift+Tab. код показанный в первом посте, перехватывает Enter превращая его в Tab, при этом нажимая на Enter происходит передача курсора с одного контрола на другои.
тоже самое собираюс сделать на шарпе.
как понял, и тут придется воспользоватся WndProc-ом, правда кое что там не понял.
начну разбиратся.
PM MAIL   Вверх
kobra
Дата 31.5.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.