1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include "stdafx.h"
#include "Dll.h"
HINSTANCE handleInstance;
HHOOK handleHook;
HWND handleWnd = NULL;
BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
handleInstance = hInstance; // nécessaire pour l'installation du hook
return TRUE;
case DLL_PROCESS_DETACH:
// appel de la désinstallation du hook
if(handleWnd != NULL)
UninstallHook(handleWnd);
return TRUE;
}
return TRUE;
}
BOOL __stdcall InstallHook(HWND hWnd)
{
if(handleWnd != NULL)
return FALSE; // le hook est déjà installé
// tentative d'installation du hook
handleHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)MessageProc, handleInstance, 0);
// désactivation de la barre des taches (source : http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx)
HWND hwndTray = FindWindow("Shell_traywnd", NULL);
EnableWindow(hwndTray, FALSE);
if(handleHook != NULL)
{
// succès
handleWnd = hWnd;
return TRUE;
}
// échec
return FALSE;
}
BOOL __stdcall UninstallHook(HWND hWnd)
{
// probleme de HWND ou le hook n'est pas installé
if(hWnd != handleWnd || hWnd == NULL)
return FALSE;
// réactivation de la barre des taches
HWND hwndTray = FindWindow("Shell_traywnd", NULL);
EnableWindow(hwndTray, TRUE);
//SetWindowText(hwndTray,"Test");
// tentative de desinstallation du hook
BOOL unhooked = UnhookWindowsHookEx(handleHook);
// si la desinstallation a reussi
if(unhooked)
handleWnd = NULL;
return unhooked;
}
LRESULT CALLBACK MessageProc (int nCode, WPARAM wParam, LPARAM lParam)
{
/*EXTRAIT MSDN : If code is less than zero, the hook procedure must pass the message
to the CallNextHookEx function without further processing and should return the value
returned by CallNextHookEx.*/
if(nCode < 0)
return CallNextHookEx(handleHook, nCode, wParam, lParam);
if (nCode == HC_ACTION)
{
// récupération des données de lParam
PKBDLLHOOKSTRUCT params = (PKBDLLHOOKSTRUCT)lParam;
// blocage du alt+tab (donc si on recoit KEYDOWN pour tab et que flags = LLKHF_ALTDOWN : (alt appuyée))
if ( params->vkCode == VK_TAB && params->flags & LLKHF_ALTDOWN)
return TRUE; // blocage du message
// blocage du alt+echap (qui agit un peu comme alt+tab)
if ( params->vkCode == VK_ESCAPE && params->flags & LLKHF_ALTDOWN)
return TRUE; // blocage du message
// blocage des touches "Windows" : VK_LWIN et VK_RWIN
if ( params->vkCode == VK_LWIN || params->vkCode == VK_RWIN)
return TRUE; // blocage du message
// récupération de l'état de la touche ctrl
BOOL ctrlDown = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1); //(source : http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx)
// blocage de ctrl+echap (qui agit comme les touches "Windows")
if ( params->vkCode == VK_ESCAPE && ctrlDown)
return TRUE;
}
// le message n'etait pas a bloquer, on le renvoie
return CallNextHookEx(handleHook, nCode, wParam, lParam);
} |
Partager