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
}
Нажатие клавиши в WinFoms С++
Возникла не обходимость при нажатии клавиши при любом активном элементе(кнопка текстбокс и тд) вызывалось событие - одно. Принципе это можно реализовать таким образом: повкладывать функцию в обработчик событий каждого элемента. Как мне кажется это не очень удобно, есть другие способы реализации таких событий?
Цитата: 1_Aposym_1
Возникла не обходимость при нажатии клавиши при любом активном элементе(кнопка текстбокс и тд) вызывалось событие - одно.
Как вариант - создать фильтр сообщений. Вот пример на C#
Код:
В Output будут писаться символы нажимаемых клавиш, но события OnKeyPress генерироваться не будут во всем приложении.
Запусти мультемидийный таймер функцией timeSetEvent, которая будет через указанные промежутки времени проверять состояние клавиатуры функцией GetKeyState.
Еще можно вставить проверку, активно ли твое окно, чтобы не было ложных вызово при работе с клавиатурой в других приложениях.
Цитата: Rusd
Можно использовать один из принципов keyloger-ов.
Запусти мультемидийный таймер функцией timeSetEvent, которая будет через указанные промежутки времени проверять состояние клавиатуры функцией GetKeyState.
Запусти мультемидийный таймер функцией timeSetEvent, которая будет через указанные промежутки времени проверять состояние клавиатуры функцией GetKeyState.
Жуть :D
Rusd эта функция способна улавливать одновременное нажатие нескольких клавиш.
Цитата: 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
}
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
}
З.Ы. Приношу извинения за примеры на C#. К C++ у меня стойкая антипатия и сходу написать тоже самое не вышло.
hardcase, спасибо буду, разбирается
У формы есть свойство. KeyPreview. События формы будут генериться при любом активном элементе.
Цитата: Camarada
Если я правильно понял, то решение проще.
У формы есть свойство. KeyPreview. События формы будут генериться при любом активном элементе.
У формы есть свойство. KeyPreview. События формы будут генериться при любом активном элементе.
Если быть точным, то PreviewKeyDown. Спасибо упустил как-то из виду :rolleyes: это событие. Правда, используя его, нельзя блокировать дальнейшие возможные события, связанные с нажатием отловленной клавиши.