Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
7 / 7 / 3
Регистрация: 11.01.2011
Сообщений: 73

Как перехватить нажатие комбинации клавиш?

30.06.2011, 00:58. Показов 5141. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
снова я)
помогите а то гугле немогу найти...

как сделать штобы когда запущена програма неработали клавиши
Alt+F4
Ctr+Alt+Del
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2011, 00:58
Ответы с готовыми решениями:

Как перехватить нажатие клавиш со стрелками на форме?
Приветствую всех. Вот поиском нашел такое: Однако, по нажатию клавиш "стрелки" событие не активируется, а начинает гонять...

Глобально перехватить нажатие сочитания клавиш
Вот нашол в интернете Как глобально перехватить нажатие клавиши или комбинации клавиш. Для примера, перехватим комбинацию ALT +...

Как при нажатии комбинации клавиш прекратить цикл
Здравствуйте программисты. Недавно решил написать небольшой вирус что-бы потом его разослать нескольким друзьям. Суть в том что при...

7
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
30.06.2011, 01:12
делаете "гадкую" программку ?
0
7 / 7 / 3
Регистрация: 11.01.2011
Сообщений: 73
30.06.2011, 01:14  [ТС]
ни для общево пользывання, для себя))
просто интересно)
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
30.06.2011, 01:19
У меня две новости хорошая и плохая.

Начну с хорошей:

Клавиши можно отловить с помощью хуков! :dance3:

Плохая новость:

Я не знаю как это сделать!
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
30.06.2011, 01:19
ссылки на форумы запрещены, поэтому - так:
нажми здесь...
Ctrl+Esc

VaGon
01.06.2003, 17:41
Еще глупый вопрос...
как Ctrl+Esc заблоктровать программно в W2k...
HexoGenus
02.06.2003, 09:42
Originally posted by VaGon
Еще глупый вопрос...
как Ctrl+Esc заблоктровать программно в W2k...

Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:

Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC

В некоторых случаях (например, при работе в полноэкранном режиме, показе своей презентации или экранной заставки ...) бывает полезно заблокировать перечисленные комбинации клавиш. Они блокируются при работе системы в режиме "экранная заставка" , который в свою очередь несложно включить и выключить:

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNN ING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNN ING, 0, 0, 0);
VaGon
02.06.2003, 10:49
Originally posted by HexoGenus


Способ не проверял и не знаю работает ли,
но в моем электронном справочнике написано так:

Как подавить реакцию Windows на CTRL+ALT+DEL, ALT-TAB, CTRL-ESC
[skiped]

// Включение режима
SystemParametersInfo(SPI_SCREENSAVERRUNN ING, 1, 0, 0);
// Выключение режима
SystemParametersInfo(SPI_SCREENSAVERRUNN ING, 0, 0, 0);
этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру
Vlad232ua
02.06.2003, 12:11
Originally posted by VaGon

этот случай не подходит для WinNT/W2k/WinXP так как в них скринсавер не блокирует клавиатуру
Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь)
VaGon
02.06.2003, 12:18
Originally posted by Vlad232ua

Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь)
этого хочу не я а заказчик, так что меня это не волнует, что он будет делать с питанием
Slon
03.06.2003, 10:05
Originally posted by Vlad232ua

Блокировать стандартные сочетания признак дурного тона - раздражает, а от дурака все равно не спасет (или кнопку выключения питания, ты тоже выкрутишь)

Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.
Vlad232ua
04.06.2003, 20:19
Originally posted by Slon


Иногда все-таки нужно.
Например, если идет вывод в инвы в режиме полноэкр. DirectDraw, то сочетание Ctrl-Esc приведет к сворачиванию окна.
Я предотвратил это использованием DirectInput в эксклюзивном режиме. Но если в вашем случае не используется DX, то вряд ли данный способ будет подходящим.
Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.
А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает. В MSDN все есть да и примеров по конфам валом.
Slon
05.06.2003, 12:53
Originally posted by Vlad232ua

Вот и я про то-же, проблема то была в твоем приложении, а не в винде с Ctrl-Esc.


Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.


А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает.

Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера.
Vlad232ua
05.06.2003, 13:22
Originally posted by Slon


Как раз дело в винде. То, что позволено в Win9x, не позволено в NT.
Это касается как Ctrl-Esc, так и Alt-Tab и тем более Ctrl-Alt-Del. На то она и NT, чтоб не позволять такие вещи.


А если уж действительно нужно блокировать Ctrl+Esc, используй хук, в NT и 2000 это работает.

Я сомневаюсь, что это можно реализовать без написания, скажем, драйвера.

Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.
Slon
05.06.2003, 14:14
Originally posted by Vlad232ua

Ерунда.Никакой драйвер ненужен. Сейчас занят, вечером (если не будут доставать то раньше)сброшу кусок кода и именно под 2000.

Ах да. Признаю: таки можно.
Я до этого использовал хук в dll. Но ушел от этого по причине того, что винда иногда на уши становилась (в частности, иногда отказывалась перезагружаться, но бывало и по другому). Поэтому я от хука отказался.
Привожу пример. Автор: Devnvd.
Slon
05.06.2003, 14:42
P.S. Alt-Tab и Ctrl-Alt-Del в NT так не перехватить.
Vlad232ua
05.06.2003, 19:35
Originally posted by Slon
P.S. Alt-Tab и Ctrl-Alt-Del в NT так не перехватить.
Разговор был про Сtrl-Esc, хотя и Alt-Tab не проблема
//------------------------------------------------

#include <vcl.h>
#pragma hdrstop


#include <Windows.h>
#define _WINNT 0x0400

USERES("Examples_for_BCB.res");
USEFORM("Examples.cpp", Form1);

LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
{ BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION)
{ switch (wParam)
{ case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN)!= 0)) ||
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN)!= 0)) ||
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,lParam));
}

typedef int (__stdcall * pFunc)();

//------------------------------------------------
WINAPI WinMain(HINSTANCE hinstEXE, HINSTANCE, LPSTR, int)
{ HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,(pFunc)L owLevelKey boardProc,hinstEXE,0);
MessageBox(NULL,"Alt+Esc,Ctrl+Esc & Alt+Tab are now disabled.","Disable Low-Level Keys", MB_OK);

try { Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
UnhookWindowsHookEx(hhkLowLevelKybd);
MessageBox(NULL,"Alt+Esc,Ctrl+Esc & Alt+Tab are now enabled.","Enable Low-Level Keys", MB_OK);
return 0;
}
//------------------------------------------------

Причем я ничего не изобретал, все это сделал Джефри в 2000-ом году (это все придумал Черчиль в 18-ом году). Вот с Ctrl-Alt-Del уже интереснее т.к. это твой логин и блокировка системы, поэтому занюханому приложению туда пути нет, нужно писать свою гину.
Slon
06.06.2003, 14:15
Что ж, оказалось все просто. Буду знать. Спасибо.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.
Vlad232ua
06.06.2003, 19:56
Originally posted by Slon
Что ж, оказалось все просто. Буду знать. Спасибо.
Вот только не понятно, почему это не работает в Win9x ? Вроде ничего NT-only не применяется.
Пардон, пробовал по быстрому. Естественно то там то тут ползла разная дрянь, а 98-ой у меня под рукой нет. Но возможно проблема в
#define _WINNT 0x0400
в оригинале #define _WIN32_WINNT 0x0400
но у меня чего-то поползло редекларейшен и я его рубанул (проверять времени не было).
Тут вот в плане размышления. В принципе, когда народ пытается зарубить Ctrl-Alt-Del, в большинстве случаев это запрет доступа к диспетчеру задач (за исключением админов, которые рубят рабочие станции). Но ведь диспетчер задач вызывается и по Ctrl-Shift-Esc тоже. Делать отлуп по этим клавишам в приложении глупо, т.к. юзверь доберется к нему через Ctrl-Alt-Del, а рубить и то и другое, гиморно и некрасиво.
А вот если-бы отлавливать окно "Диспетчер задач Windows" и скрывать(запрещать) его на время работы приложения, это было бы интересно. Но вот как к нему добраться из под юзера? Рабочий стол -"Default" и "Winlogon" под правами юзера просто не откроется. Будет время попробую. Если кто-то уже делал - ПОДЕЛИТЕСЬ, чтоб велосипед не изобретать.
Vlad232ua
08.06.2003, 22:23
Originally posted by Vlad232ua

А вот если-бы отлавливать окно "Диспетчер задач Windows" и скрывать(запрещать) его на время работы приложения, это было бы интересно.
... ПОДЕЛИТЕСЬ, чтоб велосипед не изобретать.
Продолжаем тему?

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1);
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd)
{ ShowWindow(hWnd,SW_HIDE);
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
nid.hWnd = hWnd;
nid.uID = 1034;
Shell_NotifyIcon(NIM_DELETE, &nid);
}

try { ... }
catch (Exception &exception)
{ ... }
CloseWindow(hWnd);
return 0;

В принципе работает. К Task Manager ни через Ctrl-Alt-Del ни через Ctrl-Shift-Esc не добраться, но уж больно некрасиво. Окно успевает блымнуть. А по-другому чтой-то никак. У кого какие мысли :???:
Slon
09.06.2003, 17:14
Originally posted by Vlad232ua

В принципе работает. К Task Manager ни через Ctrl-Alt-Del ни через Ctrl-Shift-Esc не добраться, но уж больно некрасиво. Окно успевает блымнуть. А по-другому чтой-то никак. У кого какие мысли :???:

Насчет блокирования Диспетчера задач (и тем более Ctrl-Alt-Del), то я согласен, что это признак дурного тона, т.к. почти невозможно случайно их
нажать. И я бы с подозрением отнесся к программе, которая мне бы не позволила выбросить себя из памяти.
Хотя я понимаю, что в данном случае это - спортивный интерес.
Но я не понял, как твой код должен работать и куда его помещать. И зачем пытаться скрыть окно и иконку в таскбаре? Может проще так? :
---
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd) SendMessage(hWnd, WM_CLOSE, 0, 0);
---
Vlad232ua
09.06.2003, 20:34
Originally posted by Slon

Но я не понял, как твой код должен работать и куда его помещать. И зачем пытаться скрыть окно и иконку в таскбаре? Может проще так? :
---
HWND hWnd = FindWindow(NULL,"Windows Task Manager");
if(!hWnd) hWnd = FindWindow(NULL,"Диспетчер задач Windows");
if(hWnd) SendMessage(hWnd, WM_CLOSE, 0, 0);
---
Помещать в WINAPI WinMain.
А вышеприведенная конструкция не сработает. Нужно сначала до "WinLogon" добраться, а справами юзера это зась. Поэтому и приходится
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1);
поднимать чтоб за хендел зацепиться. После чего закрывать никак нельзя - (Ctrl-Shift-Esc) опять начнет работать. А иконку нужно прибить потому, что хоть распахнуть с иконки и не получиться, но закрыть запросто => мы его отпустим. А в коде мы на него просто повисли в не зависимости от прав и т.п. и не даем до него добраться. А отпускаем перед самым выходом из WinMain
CloseWindow(hWnd);
return 0;
Все вроде нормально, но успевает распахнуться перед скрытием, раздражает.

С.Васкецов приводил пример следующей конструкции

HDESK hDeskPrev = GetThreadDesktop(GetCurrentThreadId());

HDESK hDesktop = OpenDesktop(L"Winlogon",0,0,MAXIMUM_ALLO WED);

if (!hDesktop)
wprintf(L"OpenDesktop failed\n");

if (!SetThreadDesktop(hDesktop))
wprintf(L"FindWindow failed\n");

//1
HWND h = FindWindow(L"SAS Window class",L"SAS window");
if (h)
PostMessage(h,WM_HOTKEY,0,0x002E8003);
else
wprintf(L"FindWindow failed\n");
//2

SetThreadDesktop(hDeskPrev);

CloseDesktop(hDesktop);

Можно было-бы попытаться пользу извлечь, но толку, у юзверя рабочий стол "Default", а как до Winlogon добраться незнаю.
1
7 / 7 / 3
Регистрация: 11.01.2011
Сообщений: 73
30.06.2011, 01:29  [ТС]
ого спасибо прочел..
понял што дела небудет(
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
28.07.2011, 00:31
если бы еще работал код оттуда..
0
 Аватар для SalterOk
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
28.07.2011, 01:24
Цитата Сообщение от Snayper_ua Посмотреть сообщение
неработали клавиши
Alt+F4
Ctr+Alt+Del
ну блокировать такие комбинации - плохой тон.

Добавлено через 22 минуты
Вот написано: https://cyberguru.ru/programmi... hooks.html
еще здесь (проще некуда):
https://www.cyberguru.ru/progr... hooks.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2011, 01:24
Помогаю со студенческими работами здесь

Как запретить нажатие клавиш?
Как мне в моем проекте запретить нажатие следующих клавиш Alt + tab alt + Ctrl + del Alt + F4 Ctrl + Shift + Esc

Как отследить движение мыши и нажатие клавиш?
Надо определить, сколько времени бездействует ПК. Как отследить движение мыши и нажатие клавиш?

Комбинации клавиш
Доброго времени суток! Эмулирую для DBGrid нажатия стандартных комбинаций void __fastcall TfTable_time::dbgTMKeyUp(TObject *Sender,...

комбинации клавиш
Здравствуйте. Подскажите пожалуйста ,как можно запускать команду (например Image) нажатием не одной клавиши, а комбинацией клавиш?...

Как заблокировать нажатие клавиш С++
Всем привет, заранее прошу не пинать за вопрос) Вопрос такой, сделал игру 2048 на с++ для курсача по тутору в интернете, управление такое:...


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

Или воспользуйтесь поиском по форуму:
8
Закрытая тема Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru