Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват нажатия клавиши Win 
V
    Опции темы
mr.Anderson
Дата 18.3.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Нужно запретить вызов панели Пуска, пока программа запущена. Т.е. до панели добраться "вручную" невозможно, об этом я уже позаботился. Остался только один метод ее вызова - это нажатие юзером кнопки Win. Как можно и этот метод убрать?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ama_kid
Дата 18.3.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



проблема стара, как мир... Его еще можно вызвать по Ctrl+Esc... smile 
Код

int __stdcall KeyboardProc(int nCode, DWORD wParam, DWORD lParam) // Блокировка системных клавиш
{
    static bool KeyStroke;
    static KBDLLHOOKSTRUCT *p;

    if (nCode < 0) return (int)CallNextHookEx(NULL, nCode, wParam, lParam);

    KeyStroke = FALSE;
    if (nCode == HC_ACTION)
    {
        switch(wParam)
        {
        case WM_KEYDOWN:
        case WM_SYSKEYDOWN:
        case WM_KEYUP:
        case WM_SYSKEYUP:
            p = (KBDLLHOOKSTRUCT *)lParam;
            KeyStroke = ((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) ||
                        ((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)) ||
                        ((p->vkCode ==VK_F4) && ((p->flags & LLKHF_ALTDOWN)!=0));
            
            break;
        default:
            break;
        }
    }
  if (KeyStroke)
    return 666;
  else    
    return (int)CallNextHookEx(0, nCode, wParam, lParam);    

}
// При загрузке программы
...
try        
    {
        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), 0);
    }
    catch(...)
    {
        ;
    }
...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
mr.Anderson
Дата 18.3.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



ama_kid, два вопроса.

1. При компиляции - ошибка "неизвестный символ hHook". Он и впрямь неизвестный, мы же его не объявляли?
2. Что значит "при запуске программы" ? В OnCreate формы? или как?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 18.3.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Сам же и отвечаю.

Ошибку hHook исправляем простым стиранием этого присваивания. То есть вместо
Код

try {
 hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), 0);
}
catch(...)
{ ; }

Пишем так:
Код

try {
 SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)&KeyboardProc, GetModuleHandle(NULL), 0);
}
catch(...)
{ ; }

А насчет, где это писать - да, надо писать в OnCreate формы. Лучше в самом начале этого обработчика, если у вас там еще какой-нить код есть, имхо.

ama_kid, браво! Код мне не очень понятен, но у него есть три неоспоримых достоинства:

1. Безо всяких DLL. А то говорят, что без них никак.
2. Работает в любой системе (ну, в Windows, по крайней мере, точно).
3. Это превосходно и безотказно работает.

Огромное вам спасибо! От меня плюс в репутацию.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ama_kid
Дата 18.3.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



mr.Anderson
hHook - это значение, возвращаемое функцией SetWindowHookEx - фактически этой указатель на предыдущую функцию в цепочке хуков... Исправить удалением, конечно, в данном случае можно, но вообще правильней это значение (типа HHOOK) использовать в строке 32 моего кода
Код

    return (int)CallNextHookEx(hHook, nCode, wParam, lParam);  

тем самым мы передаем управление другой программе в цепочке, которая, возможно, повесила хук на клавиатуру...  И еще - при выходе из программы желательно делать 
Код

   UnhookWindowsHookEx(hHook);

Этим мы снимаем с клавиатуры низкоуровневый хук, что является хорошей практикой. Здесь тоже нужен этот hHook...
Цитата(mr.Anderson @  18.3.2007,  15:13 Найти цитируемый пост)
1. Безо всяких DLL. А то говорят, что без них никак.

Вообще, для того, чтобы повесить глобальный хук в системе - это обязательно делать через Dll, но для клавиатуры был введен специальный глобальный хук WH_KEYBOARD_LL (LowLevel), который можно вешать в своем процессе. Низкоуровневые хуки можно вешать на клавиатуру и мышь (WH_MOUSE_LL).


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
MuForum
Дата 31.8.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 1
Всего: 4



#for all - Метод конечно обалденный, мне самому очень понравился, автору респект!

# for ama_kid  smile  

Это сообщение отредактировал(а) MuForum - 6.9.2007, 14:35


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.