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

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

30.06.2011, 00:58. Показов 5092. Ответов 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
Закрытая тема Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru