Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
1

Отлов нажатия NumLock и управление им

28.05.2012, 11:43. Показов 4177. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте! Недавно написал программу - калькулятор. Хотел осуществить включение\выключение по нажатию NumLock. Нашел даже какой-то
способ


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern short GetAsyncKeyState(int vkey);
 
...
 
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    while (true)
    {
        short key2 = GetAsyncKeyState(0x90); // А этот клавиши NumLock 
 
        if (key2 != 0)
        {
            if (this.Visible)
            {
                this.Invoke(new MethodInvoker(() => this.Visible = false));
                this.Invoke(new MethodInvoker(() => this.TopMost = true));
            }
            else
                this.Invoke(new MethodInvoker(() => this.Visible = true));
        }
    }
}
. Однако данный способ во-первых, через раз отрывает программу, и при показе она прорисовывается несколько раз, во-вторых, при показанной программе NumLock может оказаться выключенным, и набрать что-либо в поле калькулятора использую доп. цифровую клавиатуру становиться невозможным, а именно на это программа и ореинтирована.

Подскажите как осуществить такое, или где можно почитать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2012, 11:43
Ответы с готовыми решениями:

Отлов нажатия кнопки submit и блокировка последующего нажатия
Привет всем! Нужен код, который способствует блокировке нажатия кнопки после одного нажатия на...

Управление клавишами и индикаторами CapsLock, ScrLock, NumLock
Добрый всем день. Возникла необходимость программно управлять режимами клавиатуры (имеется ввиду...

Программное управление NumLock \ CapsLock \ Sroll Lock
Проблема следующая - есть устройство которое эмитируется под клавиатуру и управляется оно с помощью...

Имитация нажатия клавиши (цифры) не работает, если включен NumLock
Всем привет, прошу помочь, необходимо чтобы программа сама имитировала нажатие клавиши 9 без...

27
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
29.05.2012, 12:51 21
Author24 — интернет-сервис помощи студентам
Вот первый рабочий вариант. Не идеальный, но работает.
Сам класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  public class Hook : IDisposable {
    #region Declare WinAPI functions
      [DllImport("kernel32.dll")]
      private static extern IntPtr LoadLibrary(string lpFileName);
 
      [DllImport("user32.dll")]
      private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc callback, IntPtr hInstance, uint threadId);
      [DllImport("user32.dll")]
      private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam);
      [DllImport("user32.dll")]
      private static extern bool   UnhookWindowsHookEx(IntPtr hInstance);
    #endregion
    #region Constants
    private const int WH_KEYBOARD_LL = 13;
    private const int WH_KEYDOWN     = 0x0100;
    #endregion
 
    // код клавиши на которую ставим хук
    private int _key;
    public event KeyPressEventHandler KeyPressed;
 
    private delegate IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam);
    private KeyboardHookProc _proc;
    private IntPtr _hHook = IntPtr.Zero;
 
    public Hook( int keyCode ) {
      _key = keyCode;
      _proc = HookProc;
    }
 
    public void SetHook() {
      var hInstance = LoadLibrary("User32");
      _hHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0);
    }
 
    public void Dispose() {
      UnHook();
    }
 
    public void UnHook() {
      UnhookWindowsHookEx(_hHook);
    }
 
    private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam) {
      if( (code >= 0 && wParam == (IntPtr)WH_KEYDOWN) && Marshal.ReadInt32(lParam) == _key ) {
 
        // бросаем событие
        if( KeyPressed != null ) {
          KeyPressed( this, new KeyPressEventArgs(Convert.ToChar(code)) );
        }
      }
 
      // пробрасываем хук дальше
      return CallNextHookEx(_hHook, code, (int)wParam, lParam);
    }
  }
Использование. Создайте экземпляр, а потом сделайте SetHook.
Например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Form1 : Form {
  private Hook _hook;
 
  public Form1() {
    // 0x90 клавиша NumLock
    _hook = new Hook(0x90);
    _hook.KeyPressed += new KeyPressEventHandler( _hook_KeyPressed );
    _hook.SetHook();
  }
 
  void _hook_KeyPressed( object sender, KeyPressEventArgs e ) {
    MessageBox.Show("Is pressed.");
  }
}
1
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:16  [ТС] 22
Спасибо! Все работает, осталось только включать NumLock после его нажатия, а то калбкулятор открылся, а клава не робит!

P.S. Так, с этим тоже разобрался)))
0
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
29.05.2012, 13:26 23
DimanRu, обращайся)
0
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:29  [ТС] 24
Цитата Сообщение от Savvy Посмотреть сообщение
DimanRu, обращайся)
Уже))) Проблема ещё одна - когда я нажимаю NumLock и выскакивает мой калькулятор - у textBox'a пропадает фокус, и что бы посчитать - нужно на него кликнуть, как сделать что бы textBox автоматом получал фокус?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void _hook_KeyPressed(object sender, KeyPressEventArgs e)
{
    switch (this.WindowState)
    {
        case FormWindowState.Normal:
            WindowState = FormWindowState.Minimized;
            break;
        case FormWindowState.Minimized:
            WindowState = FormWindowState.Normal;
            break;
    }
 
    keybd_event(0x9, 0x45, 0x1, (UIntPtr)0);
 
    //Сюда что-то нужно вставить...
}
0
Футболист
532 / 434 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
29.05.2012, 13:32 25
в моем примере фокус не пропадет.
0
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:33  [ТС] 26
Да не, фокус пропадает из за включения NumLock'a
0
Футболист
532 / 434 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
29.05.2012, 13:41 27
аа
попробуй так
к примеру
C#
1
textBox2.Focus();
1
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:43  [ТС] 28
Пробовал, не получается(

Добавлено через 49 секунд
А не, теперь получается... О_о

Не по теме:

Надо пойти отдохнуть:)

0
29.05.2012, 13:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2012, 13:43
Помогаю со студенческими работами здесь

Отлов нажатия клавиш
Доброго времени суток! Стоит задача при нажатии оперделенной клавиши выполнить действие. Код: ...

Отлов нажатия клавиш
Хочу создать класс, который будет мне говорить, какая клавиша нажата в данный момент. Как это...

Отлов нажатия кнопки
Приветствую, идея такая. Из базы данных запрашивается содержимое таблицы и выводится на экран....

Отлов нажатия кнопки
Интересует такой вопрос. На устройстве под win CE 6.0 есть кнопка, и нужно отлавливать момент,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru