Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отключение сочетаний клавиш <ctrl>+<alt>+<del>


Автор: Nblin 23.1.2005, 16:40
Отключение сочетаний клавиш <ctrl>+<alt>+<del> в ОС Windows 2k or XP smile

Автор: En_t_end 23.1.2005, 16:46
smile
Попробуй зарегестрировать RegisterHotKey'ем такую комбинацию, хотя я и сумневаюсь, что вынды разрешатЪ. - поищи в %%%.h обзор битовых масок на кнопки.
Тут надо глубже копать smile допустим если юзать CHotKeyCtrl, то там явно запрещена данная комбинация... значит mfc явно не подойдет - копай в сторону winapi и создание dll-перехватчика!!!

Автор: Nblin 23.1.2005, 16:49
Что есть dll перехватчик?

Автор: En_t_end 23.1.2005, 16:56
MyHookDll.h
Код

#define MYHOOKDLL_API __declspec(dllexport)

#include <windows.h>

extern "C"
{
MYHOOKDLL_API int  SetHook( HWND,UINT );
MYHOOKDLL_API int  UnSetHook();
}


MyHookDll.cpp
Код


#include "MyHookDll.h"

// Глобальные переменные
HINSTANCE hInstance = NULL; // The instance of the DLL

// Описание нашей хук-функци
LRESULT CALLBACK KeyboardMsgProc ( int, WPARAM, LPARAM );

#pragma data_seg(".SData")
HHOOK hMsgHook = NULL; // Handle нашего хука
UINT KBoardMessage = NULL; // Сообщение, которое мы будем посылать
                          // родительскому приложению
HWND hParentWnd = NULL; // Окно родительского приложения
#pragma data_seg( )

//Директива линкеру создать разделяемую(shared) секцию с атрибутами RWS
#pragma comment(linker,"/SECTION:.SData,RWS")

// Далее, обычная DllMain
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
 hInstance = (HINSTANCE)hModule;

return TRUE;
}

// Две функции SetHook и UnsetHook

MYHOOKDLL_API int SetHook (HWND hWnd, // window which
                   // should receive notification messages
 UINT UpdateMsg) // notification message
{
if (hWnd == NULL) return -1;

// Save received parameters
hParentWnd = hWnd;
KBoardMessage = UpdateMsg;

// Set hook
hMsgHook= ::SetWindowsHookEx (WH_GETMESSAGE, KeyboardMsgProc, hInstance, 0);

// If we are failed...
if (hMsgHook == NULL)
 return -1;
 
return 0;
};

MYHOOKDLL_API int UnSetHook()
{
UnhookWindowsHookEx (hMsgHook);

hMsgHook = NULL;

return 0;
};


LRESULT CALLBACK KeyboardMsgProc (int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
 MSG * msg = (MSG * )lParam;

 if ((lParam)
  &&(msg->message == WM_CHAR)
  &&(wParam == PM_REMOVE))

  PostMessage (hParentWnd, KBoardMessage, msg->wParam, 0 );
}

return CallNextHookEx (hMsgHook, code ,wParam , lParam);
};

ИЗИНЯЮСЬ, что не дал ссылку, статья у меня на компе, она с сайта http://www.uinc.ru/

Только тут идёт только перехват символов, изменяй на WM_KEYDOWN, а вообще найди статью на www.uinc.ru - там это подробно описанно, может поможет

Автор: Nblin 23.1.2005, 17:00
Спасибочки!!!!!!!!!!!!!!!!!!!!!!!

Автор: Alexandr87 28.1.2005, 18:23
сомневаюсь что вышеизложенным способом не удастся отключить комбинацию.

Автор: En_t_end 28.1.2005, 18:26
"сомневаюсь что вышеизложенным способом не удастся отключить комбинацию. "
Наверно имелось ввиду "...что вышеизложенным способом удастся отключить комбинацию"
Я сразу сказал - что пример не для данной ситуации, но вопрос был задан относительно dll-перехватчика, я представил его пример, а человек, пусть сам копает в нужную сторону.

Автор: En_t_end 30.1.2005, 11:39
Кстати...раз эта комбинация зарезервированна менеджером задач, можно попробывать внедриться к нему и блокировать сообщение о нажатии данной комбинации.

Автор: En_t_end 30.1.2005, 18:25
http://forum.vingrad.ru/index.php?showtopic=980 - сюда глянь smile аналог, я думаю можно сделать и для ctr alt del , добавь только туда вот так : MOD_CONTROL, MOD_ALT, VK_DEL - ну или приблизительно так smile короче по ходу вынды настолько тупа, что разрешает юзать свои горчие клавиши !

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