Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Отключить управлячющие комбинации клавиш


Автор: szz 1.2.2007, 04:07
Да, знаю, подобные вопросы задавались не раз, но все они разрозненные. Тут я хочу все свести воедино.
Итак, задача:
Отключить управляющие клавиши на клавиатуре, а именно:
ctrl, alt, del, esc, windows
И не важно какая программа в фокусе - кнопки должны быть отключены.

Это нужно для киоск-программ (когда на полный экран какой-то интерфейс).

Отключено должно быть на самом нижайшем уровне, чтобы сигналы от ник в виндоус не поступали.
Просто отклюбчить таск менеджер не пойдет, ибо при ctrl-alt-del выскакивает алерт "Запрещено администраротом". Это недопустимо.

Каким образом это сделать?

Автор: _hunter 1.2.2007, 11:50
Цитата(szz @  1.2.2007,  04:07 Найти цитируемый пост)
Да, знаю, подобные вопросы задавались не раз

вот именно.
Цитата(szz @  1.2.2007,  04:07 Найти цитируемый пост)
но все они разрозненные

но вполне завершенные.
Цитата(szz @  1.2.2007,  04:07 Найти цитируемый пост)
Тут я хочу все свести воедино.

не нужно этого делать -- к куче уже имеющихся тем (из которых только твоих штуки три одинаковых) прибавится еще одна...
Цитата(szz @  1.2.2007,  04:07 Найти цитируемый пост)
Итак, задача:Отключить управляющие клавиши на клавиатуре, а именно:

пользуемся поиском:
http://forum.vingrad.ru/index.php?showtopic=94684&view=findpost&p=723721
http://forum.vingrad.ru/topic-40533.html
http://forum.vingrad.ru/topic-41584.html
http://forum.vingrad.ru/topic-73002.html

Автор: _pussbb 1.2.2007, 12:15
лучше вего как для для меня это поставить хуки(перехват) на клаву.  дам пример со своей программы чтобы долго не лазил ппо  всяким ссылкам
DLL project
Код

#pragma data_seg (".mydata")
HHOOK g_hHookKbdLL = NULL;
BOOL  g_bBeep = FALSE;        // beep on illegal key
#pragma data_seg ()
extern "C" int  __export  MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)
{
    KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;

    if (nCode==HC_ACTION) {
        BOOL bCtrlKeyDown =
            GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);

        if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) ||                    // Ctrl+Esc
            // (pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||   // Alt+TAB
             (pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)|| // Alt+Esc
             (pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) { // Start Menu
            if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))
                MessageBeep(0); // only beep on downstroke if requested
            return 1; // gobble it: go directly to jail, do not pass go
        }
    }
    return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);
}

 а в проге пишу
Код

int(_stdcall *MyTaskKeyHookLL1)();
HINSTANCE dllp=LoadLibrary("hook_dll.dll");
if (dllp) {
    MyTaskKeyHookLL1=(int(__stdcall *) ())
    GetProcAddress(dllp,"_MyTaskKeyHookLL1");
    if (MyTaskKeyHookLL1)
      hHook = SetWindowsHookEx(WH_KEYBOARD_LL, // тип хука
                        MyTaskKeyHookLL1, // хук-функция
                        dllp, // хендл библиотеки с хук-функцией
                        NULL);

              } else { ShowMessage("Не удалось найти компонент");}

               FreeLibrary(dllp);

потом при закритии своего приложения не забудь сбросить все хуки командой 
Код

 UnhookWindowsHookEx(hHook);

если хочеш подробно узнать проо хуки [erb то зайди на http://worldcpp.vingrad.ru/appli

Автор: szz 1.2.2007, 20:15
Вот! Вот это я и называю - цельное решение! _pussbb, спасибо! Но насколько я понял, Ctrl+Alt+Del это все-тки не отклчает?

Автор: _pussbb 2.2.2007, 01:40
я конечно не пробывал но скорее всего не отменяет но если тебе например  заблокировать клаву и мишь(особеность блокировки в том сто при нажатии Ctrl+Alt+Del блокировка снимаеться) тогда ставиш хук на нажатие любой клавиши и пишеш оброботку.
 Если у тебя получиться сделать скинь на мой e-mail.  а друг и мне пригодиться.
И мой тетбе совет если у  тебя до сих пор нет офлайн версии worldcpp то скачай немедленно. Та м очень много полезного

Автор: szz 2.2.2007, 01:41
А вот еще вопросик вдогонку маленький.
  Как выключить правую кнопку мыши? smile

Автор: _pussbb 2.2.2007, 22:17
если ты читал документацию о хуках то там написано что можна ставить ловвушки практически на все в том числе включая нажатия кнопок мишки и при нажатии правой кнопки срботает хук и при обработку действий на событие  оставиш пустым. И все при нажатии левой кнопки миши ничего не произойдет.  еще раз говорю возьми cppworld smile . http://worldcpp.vingrad.ru/b_sys/systb1.php для примера.

А да пока вспомнил  на счет    Ctrl+Alt+Del   если тебе надо скрыть диспечер задач то быстрее всего это  сделать при помощи добавления ключа в реестр.  Но есть одно но надо права администратора
Код

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=dword:00000001




Автор: szz 3.2.2007, 00:16
Не работает...
 Продебаггил, библиотека загружается, но после
Код

MyTaskKeyHookLL1=(int(__stdcall *) ())
    GetProcAddress(dllp,"_MyTaskKeyHookLL1");

MyTaskKeyHookLL1 остается NULL, поэтому не происходит выполнения внутри if(MyTaskKeyHookLL1)  smile 

Автор: Romikgy 3.2.2007, 00:27
Цитата(szz @  2.2.2007,  23:16 Найти цитируемый пост)
GetProcAddress(dllp,"_MyTaskKeyHookLL1");

а разве не так
Код

GetProcAddress(dllp,"MyTaskKeyHookLL1");

Автор: _pussbb 3.2.2007, 01:03
А ты посмотри внимательно я конечно извиняюсь но дал тебе в dll одну функцию _MyTaskKeyHookLL а вызываеш ты _MyTaskKeyHookLL1 поэтому  и значение ноль

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)