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

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

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

Студворк — интернет-сервис помощи студентам
Здраствуйте! Недавно написал программу - калькулятор. Хотел осуществить включение\выключение по нажатию 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2012, 11:43
Ответы с готовыми решениями:

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

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

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

27
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
29.05.2012, 12:51
Студворк — интернет-сервис помощи студентам
Вот первый рабочий вариант. Не идеальный, но работает.
Сам класс
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
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:16  [ТС]
Спасибо! Все работает, осталось только включать NumLock после его нажатия, а то калбкулятор открылся, а клава не робит!

P.S. Так, с этим тоже разобрался)))
0
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
29.05.2012, 13:26
DimanRu, обращайся)
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:29  [ТС]
Цитата Сообщение от 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
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
29.05.2012, 13:32
в моем примере фокус не пропадет.
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:33  [ТС]
Да не, фокус пропадает из за включения NumLock'a
0
Футболист
 Аватар для Goal
533 / 435 / 142
Регистрация: 31.10.2011
Сообщений: 1,010
29.05.2012, 13:41
аа
попробуй так
к примеру
C#
1
textBox2.Focus();
1
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
29.05.2012, 13:43  [ТС]
Пробовал, не получается(

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

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.05.2012, 13:43

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru