Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/75: Рейтинг темы: голосов - 75, средняя оценка - 4.55
72 / 17 / 2
Регистрация: 29.12.2010
Сообщений: 339

Блокировать флажок на клавиатуре

02.03.2011, 23:45. Показов 16026. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надо блокировать флажок нажатый на клавиатуре)Как это сделать?

Добавлено через 1 час 59 минут
Никто не знает. чтоли?!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2011, 23:45
Ответы с готовыми решениями:

Флажок
Добрый день! У меня есть такая процедура Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) ...

флажок
Private Sub Флажок_AfterUpdate() Dim strReport As String strReport = "Отчет1" If...

Флажок
Доброго времени суток У меня есть форма со списком в котором присутствует логическое поле Подтверждение Суть какова, если пользователь...

13
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.03.2011, 00:14
Как вариант ставить глобальный хук на клавиатуру (WH_KEYBOARD_LL), пример во вложении блокирует "флажок".

UPD: Двумя сообщениями ниже исправление.
1
72 / 17 / 2
Регистрация: 29.12.2010
Сообщений: 339
03.03.2011, 01:58  [ТС]
Спасибо большое)Но есть одна проблемка(
Этот хук на 2005 студии не работает(студия ругается на using Hooks)
Как на 2005 подключить эту библиотеку?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.03.2011, 02:23
Лучший ответ Сообщение было отмечено как решение

Решение

Смирняга, там нет библиотеки. Перенеси файл Hooks.cs в свой проект и должно заработать, но 100% гарантий не даю, т.к. 2005 студии нет. После переноса подключаешь 'using Hooks;', либо используешь Hooks.KBDHook.*

Добавлено через 11 минут
Блин, я в классе KBDHook события перепутал, вот верный вариант:
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
 
namespace Hooks
{
    public static class KBDHook
    {
        #region Declarations
        public delegate void HookKeyPress ( LLKHEventArgs e );
        public static event HookKeyPress KeyUp;
        public static event HookKeyPress KeyDown;
 
        [StructLayout(LayoutKind.Sequential)]
        struct KBDLLHOOKSTRUCT
        {
            public uint vkCode;
            public uint scanCode;
            public KBDLLHOOKSTRUCTFlags flags;
            public uint time;
            public IntPtr dwExtraInfo;
        }
 
        [Flags]
        enum KBDLLHOOKSTRUCTFlags : int
        {
            LLKHF_EXTENDED = 0x01,
            LLKHF_INJECTED = 0x10,
            LLKHF_ALTDOWN = 0x20,
            LLKHF_UP = 0x80,
        }
 
        static IntPtr hHook = IntPtr.Zero;
        static IntPtr hModule = IntPtr.Zero;
        static bool hookInstall = false;
        static bool localHook = true;
        static API.HookProc hookDel;
        #endregion
 
        /// <summary>
        /// Hook install method.
        /// </summary>
        public static void InstallHook()
        {
            if (IsHookInstalled) return;
 
            hModule = Marshal.GetHINSTANCE(AppDomain.CurrentDomain.GetAssemblies()[0].GetModules()[0]);
            hookDel = new API.HookProc(HookProcFunction);
 
            if (localHook)
                hHook = API.SetWindowsHookEx(API.HookType.WH_KEYBOARD,
                    hookDel, IntPtr.Zero, AppDomain.GetCurrentThreadId());
            else
                hHook = API.SetWindowsHookEx(API.HookType.WH_KEYBOARD_LL,
                    hookDel, hModule, 0);
 
            if (hHook != IntPtr.Zero)
                hookInstall = true;
            else
                throw new Win32Exception("Can't install low level keyboard hook!");
        }
        /// <summary>
        /// If hook installed return true, either false.
        /// </summary>
        public static bool IsHookInstalled
        {
            get { return hookInstall && hHook != IntPtr.Zero; }
        }
        /// <summary>
        /// Module handle in which hook was installed.
        /// </summary>
        public static IntPtr ModuleHandle
        {
            get { return hModule; }
        }
        /// <summary>
        /// If true local hook will installed, either global.
        /// </summary>
        public static bool LocalHook
        {
            get { return localHook; }
            set
            {
                if (value != localHook)
                {
                    if (IsHookInstalled)
                        throw new Win32Exception("Can't change type of hook than it install!");
                    localHook = value;
                }
            }
        }
        /// <summary>
        /// Uninstall hook method.
        /// </summary>
        public static void UnInstallHook()
        {
            if (IsHookInstalled)
            {
                if (!API.UnhookWindowsHookEx(hHook))
                    throw new Win32Exception("Can't uninstall low level keyboard hook!");
                hHook = IntPtr.Zero;
                hModule = IntPtr.Zero;
                hookInstall = false;
            }
        }
        /// <summary>
        /// Hook process messages.
        /// </summary>
        /// <param name="nCode"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        static IntPtr HookProcFunction ( int nCode, IntPtr wParam, [In] IntPtr lParam ) {
            if (nCode == 0) {
                LLKHEventArgs args = null;
                if (localHook) {
                    bool pressed = false;
                    if (lParam.ToInt32() >> 31 == 0)
                        pressed = true;
 
                    Keys keys = (Keys)wParam.ToInt32();
                    args = new LLKHEventArgs(keys, pressed, 0U, 0U);
 
                    if (pressed) {
                        if (KeyDown != null)
                            KeyDown(args);
                    } else {
                        if (KeyUp != null)
                            KeyUp(args);
                    }
                } else {
                    KBDLLHOOKSTRUCT kbd = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
 
                    bool pressed = false;
                    if (wParam.ToInt32() == 0x100 || wParam.ToInt32() == 0x104)
                        pressed = true;
 
                    Keys keys = (Keys)kbd.vkCode;
                    args = new LLKHEventArgs(keys, pressed, kbd.time, kbd.scanCode);
 
                    if (pressed) {
                        if (KeyDown != null)
                            KeyDown(args);
                    } else {
                        if (KeyUp != null)
                            KeyUp(args);
                    }
                }
 
                if (args != null && args.Hooked)
                    return (IntPtr)1;
            }
            return API.CallNextHookEx(hHook, nCode, wParam, lParam);
        }
    }
 
    public class LLKHEventArgs
    {
        Keys keys;
        bool pressed;
        uint time;
        uint scCode;
 
        public LLKHEventArgs(Keys keys, bool pressed, uint time, uint scanCode)
        {
            this.keys = keys;
            this.pressed = pressed;
            this.time = time;
            this.scCode = scanCode;
        }
 
        /// <summary>
        /// Key.
        /// </summary>
        public Keys Keys
        { get { return keys; } }
        /// <summary>
        /// Is key pressed or no.
        /// </summary>
        public bool IsPressed
        { get { return pressed; } }
        /// <summary>
        /// The time stamp for this message, equivalent to what GetMessageTime would return for this message.
        /// </summary>
        public uint Time
        { get { return time; } }
        /// <summary>
        /// A hardware scan code for the key.
        /// </summary>
        public uint ScanCode
        { get { return scCode; } }
        /// <summary>
        /// Is user hook key.
        /// </summary>
        public bool Hooked { get; set; }
    }
 
    static class API
    {
        public delegate IntPtr HookProc(int nCode, IntPtr wParam, [In] IntPtr lParam);
 
        [DllImport("user32.dll")]
        public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, [In] IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn,
        IntPtr hMod, int dwThreadId);
 
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
 
        public enum HookType : int
        {
            WH_JOURNALRECORD = 0,
            WH_JOURNALPLAYBACK = 1,
            WH_KEYBOARD = 2,
            WH_GETMESSAGE = 3,
            WH_CALLWNDPROC = 4,
            WH_CBT = 5,
            WH_SYSMSGFILTER = 6,
            WH_MOUSE = 7,
            WH_HARDWARE = 8,
            WH_DEBUG = 9,
            WH_SHELL = 10,
            WH_FOREGROUNDIDLE = 11,
            WH_CALLWNDPROCRET = 12,
            WH_KEYBOARD_LL = 13,
            WH_MOUSE_LL = 14
        }
    }
}
14
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
03.09.2011, 18:00
Щас стал разбираться в коде и наткнулся на проблему.
Если допустим нажать сразу 2 клавиши то он не видит ту клавишу которая была нажата второй например CTRL+D отлавливается только CTRL если её 1 нажать.
А само сочетание нет

Уже мин 80 вожусь не чего не выходит...
C#
1
2
3
4
5
6
            if (e.ScanCode == 29
                   &&
                e.Keys == Keys.D)
                {
                    MessageBox.Show("ДА");
                }
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.09.2011, 18:08
Kill100, код и не предназначен для отлова сочетаний, он ловит только текущую нажатую клавишу. Для отлова сочетаний надо использовать что-то вроде стека (списка или битовых полей), где будут храниться предыдущие нажатия (которые были до текущего).
0
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
03.09.2011, 18:18
Цитата Сообщение от SSTREGG Посмотреть сообщение
Kill100, код и не предназначен для отлова сочетаний, он ловит только текущую нажатую клавишу. Для отлова сочетаний надо использовать что-то вроде стека (списка или битовых полей), где будут храниться предыдущие нажатия (которые были до текущего).
Это ясно но проблема в том что он не видит что было нажато после если уже 1 клавиша держится.
А а нажимать по очереди клавиши как то не очень....
PS а это ведь единственный пример из 5 просмотренных который работает на 64x приложении
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.09.2011, 18:31
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Kill100 Посмотреть сообщение
Это ясно но проблема в том что он не видит что было нажато после если уже 1 клавиша держится.
Ясное дело, ведь кнопка нажата до сих пор. Как Вы думаете для чего там 2 события, KeyDown и KeyUp?
При KeyDown заносите кнопку в список, при KeyUp удаляете, таким образом в списке будут находится все нажатые на текущий момент клавиши.

Добавлено через 5 минут
Вот примитивнейшая реализация:
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
        List<Keys> _pressedKeys;
 
        public Form1 ( ) {
            InitializeComponent();
            _pressedKeys = new List<Keys>();
 
            Hooks.KBDHook.KeyDown += new Hooks.KBDHook.HookKeyPress( KBDHook_KeyDown );
            Hooks.KBDHook.KeyUp += new Hooks.KBDHook.HookKeyPress( KBDHook_KeyUp );
            Hooks.KBDHook.LocalHook = false;
            Hooks.KBDHook.InstallHook();
            this.FormClosed += ( s, e ) => {
                Hooks.KBDHook.UnInstallHook();
            };
        }
 
        void KBDHook_KeyUp ( Hooks.LLKHEventArgs e ) {
            _pressedKeys.Remove( e.Keys );
        }
 
        void KBDHook_KeyDown ( Hooks.LLKHEventArgs e ) {
            if ( !_pressedKeys.Contains( e.Keys ) )
                _pressedKeys.Add( e.Keys );
            listView1.Items.Add( string.Join<Keys>( " + ", _pressedKeys ) );
        }
С нужным допиливанием будет то что нужно.
Изображения
 
6
12 / 12 / 2
Регистрация: 06.06.2012
Сообщений: 97
09.06.2012, 09:59
SSTREGG, не подскажите вы перехватываете так же флаг LLKHF_INJECTED = 0x10,
а есть ли возможность после перехвата передать нажатие уже без этого флага?
Что бы не видно было, эмуляция это или нет.
0
09.06.2012, 10:28

Не по теме:

speed5.Mexanik, "некрофил" на дату последнего сообщение взгляните.

1
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 4
25.05.2015, 16:59
А смысл создавать новое событие для клавиш LLKHEventArgs ???
что бы добавить этот пресловутый bool Hooked ???
по моему можно было сделать наследование от базового класса и добавить ниже этот Hooked
0
25.05.2015, 17:16

Не по теме:

Adlib Beats, дык, кто мешает? Вперёд и с песней )

0
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 4
25.05.2015, 17:24
А вообще, огромнейшее спасибо тебе и низкий поклон) правда) реально выручил
0
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330
01.10.2019, 20:41
Цитата Сообщение от NickoTin Посмотреть сообщение
C#
1
2
3
if (localHook)
        hHook = API.SetWindowsHookEx(API.HookType.WH_KEYBOARD,
           hookDel, IntPtr.Zero, AppDomain.GetCurrentThreadId());
Прошу прощения за некропостинг, вы не подскажите как использовать WH_KEYBOARD как глобальный хук?
Мне нужно отлавливать сообщения после того как они встали в очередь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2019, 20:41
Помогаю со студенческими работами здесь

флажок в mfc
Ребят всем привет, вот хочу сделать такую штуку: у меня есть данные и флажок, без перевода флажка в состояние true данные не обновляются ...

Флажок на дату
Необходимо добавить флажок &quot;На дату&quot;. Если этот флажок установлен, то должны отображаться плановые отгрузки только на выбранную дату, без...

Не видит флажок
Помогите пожалуйста: При проверке значения флажка вылетает ошибка: &quot;run-time error '424' object required&quot; как правильно к нему...

Переключатель(флажок)
Составить программу запрашивающую ваш пол с помощью переключателя или флажка и выдающую приветствие вида: &lt;Я люблю мальчиков&gt; или...

Не работает флажок
Есть флажок, который отвечает за доступ к БД. Доступ выражается в следующем. При выборе флажка, выводится MessageBox(Ввдите пароль);...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru