Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нажатие клавиши в WinFoms С++

9.4K
05 июля 2008 года
1_Aposym_1
68 / / 01.11.2007
Возникла не обходимость при нажатии клавиши при любом активном элементе(кнопка текстбокс и тд) вызывалось событие - одно. Принципе это можно реализовать таким образом: повкладывать функцию в обработчик событий каждого элемента. Как мне кажется это не очень удобно, есть другие способы реализации таких событий?
5
05 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: 1_Aposym_1
Возникла не обходимость при нажатии клавиши при любом активном элементе(кнопка текстбокс и тд) вызывалось событие - одно.

Как вариант - создать фильтр сообщений. Вот пример на C#

Код:
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();

        Application.AddMessageFilter(new MyMessageFilter());
    }
}

public class MyMessageFilter : IMessageFilter {

    private const int WM_CHAR = 0x0102;

    #region IMessageFilter Members

    public bool PreFilterMessage(ref Message m) {
        if (m.Msg == WM_CHAR) {
            Console.WriteLine((char)m.WParam.ToInt32());
            return true;
        }
        return false;
    }

    #endregion
}

В Output будут писаться символы нажимаемых клавиш, но события OnKeyPress генерироваться не будут во всем приложении.
7.0K
05 июля 2008 года
Rusd
88 / / 26.08.2006
Можно использовать один из принципов keyloger-ов.
Запусти мультемидийный таймер функцией timeSetEvent, которая будет через указанные промежутки времени проверять состояние клавиатуры функцией GetKeyState.
Еще можно вставить проверку, активно ли твое окно, чтобы не было ложных вызово при работе с клавиатурой в других приложениях.
5
05 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Rusd
Можно использовать один из принципов keyloger-ов.
Запусти мультемидийный таймер функцией timeSetEvent, которая будет через указанные промежутки времени проверять состояние клавиатуры функцией GetKeyState.


Жуть :D

9.4K
05 июля 2008 года
1_Aposym_1
68 / / 01.11.2007
Hardcase метод хороший, но к форме подключить не получается.
Rusd эта функция способна улавливать одновременное нажатие нескольких клавиш.
5
05 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: 1_Aposym_1
Hardcase метод хороший, но к форме подключить не получается.

Элементарно.

Код:
public partial class Form1 : Form {

        private MyMessageFilter filter;

        public Form1() {
            InitializeComponent();
            Application.AddMessageFilter(filter = new MyMessageFilter(this));

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
            Application.RemoveMessageFilter(filter);
        }

    }

    public class MyMessageFilter : IMessageFilter {

        private Form1 form;

        public MyMessageFilter(Form1 form) {
            this.form = form;
        }

        private const int WM_CHAR = 0x0102;

        #region IMessageFilter Members

        public bool PreFilterMessage(ref Message m) {
            if (m.Msg == WM_CHAR) {
                char c = (char)m.WParam.ToInt32();
                form.Text = c.ToString();  // или вызываем некоторый метод
                Console.WriteLine(c);
                return true;
            }
            return false;
        }

        #endregion
    }
Но если требуется проверить нажатие многих клавиш, нужно обрбатывать WM_KEYDOWN и WM_KEYUP сообщения. При возврате true из фильтра, дальнейшая обработка сообщения в приложении не просиходит.


З.Ы. Приношу извинения за примеры на C#. К C++ у меня стойкая антипатия и сходу написать тоже самое не вышло.
9.4K
08 июля 2008 года
1_Aposym_1
68 / / 01.11.2007
hardcase, спасибо буду, разбирается
20K
09 июля 2008 года
Camarada
44 / / 08.07.2007
Если я правильно понял, то решение проще.
У формы есть свойство. KeyPreview. События формы будут генериться при любом активном элементе.
5
09 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Camarada
Если я правильно понял, то решение проще.
У формы есть свойство. KeyPreview. События формы будут генериться при любом активном элементе.

Если быть точным, то PreviewKeyDown. Спасибо упустил как-то из виду :rolleyes: это событие. Правда, используя его, нельзя блокировать дальнейшие возможные события, связанные с нажатием отловленной клавиши.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог