С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/42: Рейтинг темы: голосов - 42, средняя оценка - 4.81
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
1

Как обработать событие нажатия Ctrl+key?

30.01.2011, 09:15. Показов 8243. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если точнее выразиться, не могу понять как создать такое событие, ну и конечно хэндлер как поставить. Извините если неправильно в чем-то выразился...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2011, 09:15
Ответы с готовыми решениями:

Как обработать событие нажатия кнопки в Canvas
Имеется класс наследник Канваса, в нем обработчики. Однако собтие нажатия клавиши не доходит до...

Как обработать событие ctrl + нажатие кнопки
Добрый день, перечитал все связаные темы тут, никак не могу реализовать. Как обработать...

Как обработать нажатия Ctrl,Alt,win,shift??
Пробывал через регистрацию глобальных горячих клавиш,но чет не проперло:( lmouse_button :=...

Как в <textarea> обработать событие 'нажато Ctrl+Enter'?
Как в &lt;textarea&gt; обработать событие 'нажато Ctrl+Enter'?

7
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
30.01.2011, 10:52 2
Я как-то давно нашел класс, его и использую, если нажатия надо обрабатывать не только в программе, он для реализации горячих клавиш в Windows.
Вот класс:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace VistaKeysExtender.WinApi
{
    public sealed class HotKey : IMessageFilter, IDisposable
    {
        public event KeyEventHandler HotKeyPressed;
 
        private readonly int _id;
 
        #region Native win32 API
 
        private const int WmHotKey = 0x0312;
 
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
 
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
 
        [Flags]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Control = 2,
            Shift = 4,
            Windows = 8
        }
 
        #endregion
 
        public event EventHandler KeyChanged;
        public event EventHandler KeyModifierChanged;
        private IntPtr _handle;
        public IntPtr Handle
        {
            get { return _handle; }
            set { _handle = value; }
        }
 
        private Keys _key;
        private KeyModifiers _keyModifier;
        private bool _isKeyRegisterd;
 
        public HotKey()
        {
            _id = GetHashCode();
            Application.AddMessageFilter(this);
        }
 
        ~HotKey()
        {
            Dispose();
        }
 
        public void Dispose()
        {
            Application.RemoveMessageFilter(this);
            UnregisterHotKey(_handle, _id);
        }
 
        private void RegisterHotKey()
        {
            if (_key == Keys.None)
                return;
            if (_isKeyRegisterd)
                _isKeyRegisterd = !(UnregisterHotKey(_handle, _id));
            _isKeyRegisterd = RegisterHotKey(_handle, _id, _keyModifier, _key);
            if (!_isKeyRegisterd)
                throw new ApplicationException("Hotkey allready in use");
        }
 
        [Bindable(true), Category("HotKey")]
        public Keys Key
        {
            get { return _key; }
            set
            {
                if (_key != value)
                {
                    _key = value;
                    OnKeyChanged(new EventArgs());
                }
            }
        }
 
        [Bindable(true), Category("HotKey")]
        public KeyModifiers KeyModifier
        {
            get { return _keyModifier; }
 
            set
            {
                if (_keyModifier != value)
                {
                    _keyModifier = value;
                    OnKeyModifierChanged(new EventArgs());
                }
            }
        }
 
        public bool PreFilterMessage(ref Message m)
        {
            switch (m.Msg)
            {
                case WmHotKey:
                    if ((int)(m.WParam) == _id)
                    {
                        KeyEventArgs args = new KeyEventArgs((IsButtonDown(m.LParam, KeyModifiers.Alt) ? Keys.Alt : Keys.None)
                                | (IsButtonDown(m.LParam, KeyModifiers.Control) ? Keys.Control : Keys.None)
                                | (IsButtonDown(m.LParam, KeyModifiers.Shift) ? Keys.Shift : Keys.None) | Key);
 
                        OnHotKeyPressed(args);
                        return true;
                    }
                    break;
            }
            return false;
        }
 
        public static bool IsButtonDown(IntPtr ptr, KeyModifiers keyModifiers)
        {
            return Convert.ToBoolean(((long)ptr) & (long)keyModifiers);
        }
 
        private void OnHotKeyPressed(KeyEventArgs e)
        {
            if (HotKeyPressed != null)
                HotKeyPressed(this, e);
        }
 
        private void OnKeyChanged(EventArgs e)
        {
            RegisterHotKey();
            if (KeyChanged != null)
                KeyChanged(this, e);
        }
 
        private void OnKeyModifierChanged(EventArgs e)
        {
            RegisterHotKey();
            if (KeyModifierChanged != null)
                KeyModifierChanged(this, e);
        }
    }
}
Подключаешь его пространство имен, создаешь экземпляр класса HotKey, экземпляру назначаешь KeyModifiers = контрол\шифт\вин\альт\ничего, и саму кнопку Key, назначаешь действие при событии HotKeyPressed и пользуешься, если комбинация не занята - исключения не будет.
1
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
30.01.2011, 15:55  [ТС] 3
r0fL, надо создать свой класс и вставить этот код?

Добавлено через 27 минут
А как присвоить одновременно Control и Key? через +=?

Добавлено через 18 минут
Написал такой вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
private void mainForm_Load(object sender, EventArgs e)
        {
 
            hk.KeyModifier = HotKey.KeyModifiers.Control;
            hk.KeyModifier += 'o';
            hk.HotKeyPressed += new KeyEventHandler(this.toolStripOpen_Click);
        }
         private void toolStripCreate_Click(object sender, EventArgs e)
        {
            NewTest(); 
        }
что делает NewTest() не буду писать, ничего не происходит...
0
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
30.01.2011, 16:15 4
Можно проще:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Windows.Forms;
 
namespace WindowsFormsTest {
    public sealed partial class MainForm : Form {
        public MainForm() {
            InitializeComponent();
            KeyDown += OnKeyDown;
        }
 
        private void OnKeyDown( object sender, KeyEventArgs keyEventArgs ) {
            if ( keyEventArgs.Control && keyEventArgs.KeyCode == Keys.C ) {
                MessageBox.Show( "Ctrl+C нажато." );
            }
        }
    }
}
1
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
30.01.2011, 17:53 5
Zetway, нет, надо создать экземпляр класса HotKey, и с ним работать, как вы и сделали, как я понял, но работа примерно такая:
C#
1
2
3
                hk.KeyModifier = HotKey.KeyModifiers.Control;
                hk.Key = Keys.O;
                hk.HotKeyPressed += new KeyEventHandler(button5_Click);
0
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
30.01.2011, 18:06  [ТС] 6
r0fL, компилятор ругается, Cannot implicitly convert type 'System.Windows.Forms.Keys' to 'VistaKeysExtender.WinApi.HotKey.KeyModifiers'. An explicit conversion exists (are you missing a cast?)
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
30.01.2011, 18:55 7
Zetway, код покажите, я скопировал рабочий вариант из своего проекта
0
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
31.01.2011, 13:26  [ТС] 8
r0fL, та уже не надо, сделал как посоветовал Unril, все работает, всем доволен)))
0
31.01.2011, 13:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2011, 13:26
Помогаю со студенческими работами здесь

Обработать событие нажатия на определенную ячейку StringGrid
Подскажите, как обработать событие, когда нажимаешь на определенную ячейку StringGrid-а

Как обработать событие click и событие нажития стрелки?
Допустим есть кнопка влево-вправо для горизонтального листания товаров. Как нужно кроссбраузерно...

Разработать программу, которая не реагирует на нажатия клавиш Ctrl+Break и Ctrl+C
И мне помогите пожалуйста)) На входном языке Assembler разработать программу, которая не реагирует...

Как обработать событие нажатия "Найти далее" в форме "Найти"?
Как обработать событие нажатия кнопки 'Найти далее' во встроенной форме Excel 'Найти'?


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

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