Я пытаюсь создать «кейлоггер» ... ну, это не совсем кейлоггер, потому что он отображает только нажатия клавиш и не записывает их в файл. Я планировал использовать его в своих Hangouts в Google+, поэтому я могу показать свои нажатия клавиш, не используя его с программным обеспечением для записи видео.Обработка событий KeyDown и KeyPress в C#
private void OnKeyDown(object sender, KeyEventArgs e)
{
lblText.Text = "";
lblText.Visible = false;
boxSpKey.Image = null;
boxSpKey.Visible = false;
boxCtrl.Visible = e.Control;
boxAlt.Visible = e.Alt;
boxWin.Visible = false;
boxShift.Visible = e.Shift;
Keys pKey = e.KeyData;
if (btnIcons.ContainsKey(pKey))
{
boxSpKey.Visible = true;
boxSpKey.Image = btnIcons[pKey];
}
// this part I haven't figured out either, but is irrelevant to my question.
}
private void OnKeyPress(object sender, KeyPressEventArgs e)
{
lblText.Visible = true;
lblText.Text = ((char)e.KeyChar).ToString();
}
[Контекст: lblText
это метка, содержащая ключ текст, boxSpKey
является PictureBox
для специальных клавиш, таких как ESC, для которого я сделал каждый один значок. boxCtrl
, boxAlt
, boxWin
и boxShift
также PictureBox
эс вполне очевидны]
Вопросы:.
кажется, что значения
e.Control
,e.Alt
иe.Shift
всегда Ложные, поэтому соответствующиеPictureBox
es не появятся.Как я могу проверить статус ключа
Win
? Я бы предпочел не использовать низкоуровневые константыVK_*
.Когда
OnKeyPress
обрабатывает события, в основном с использованием клавиш-модификаторов, я получаю случайные символы ... Как именно я получаю исходные штрихи от них? то есть я хочу получитьCtrl+Shift+B
вместо┐
.
UPDATE: Я решил пойти низкий уровень с помощью клавиш-модификаторов, поэтому я использовал P/Invoke:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte[] lpKeyState);
public static byte code(Keys key)
{
return (byte)((int)key & 0xFF);
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
var array = new byte[256];
GetKeyboardState(array);
// ...
if ((array[code(Keys.ControlKey)] & 0x80) != 0)
boxCtrl.Visible = true;
if ((array[code(Keys.LMenu)] & 0x80) != 0 || (array[code(Keys.RMenu)] & 0x80) != 0)
boxAlt.Visible = true;
if ((array[code(Keys.LWin)] & 0x80) != 0 || (array[code(Keys.RWin)] & 0x80) != 0)
boxWin.Visible = true;
if ((array[code(Keys.ShiftKey)] & 0x80) != 0)
boxShift.Visible = true;
// ...
}
Хорошая новость заключается в том, что я получил Ctrl
, Win
и Shift
ключи рабочие, но не Alt
; если Alt
≠ LMenu
и RMenu
. Что дает?
насчет сравнения против собственности e.Modifiers с помощью клавиш, http://msdn.microsoft.com/ ан-нас/библиотека/system.windows.forms.keys.aspx? См. LWin и RWin для ключа Windows. –
Нажатие клавиши «Alt» на моей клавиатуре приводит к значению 'KeyCode'' Keys.Menu' в моем обработчике. Кажется, он не проводит различия между левым и правым. К сожалению, у меня нет другой клавиатуры для тестирования. – gowansg
@gowansg Odd ... Клавиши 'LMenu' и' RMenu' должны проверять клавиши 'Alt' с обеих сторон, но кажется, что работает только' Keys.Menu'. Благодаря ~ –