D
Hallo,
ich habe hier einen globalen Hook (WH_GETMESSAGE), mit dem ich versuche bei WM_CHAR ein eingegebenes Zeichen zu ersetzen.
Scheinbar wahrlos, stuerzen alle Moeglichen Anwendungen hin und wieder ab, wenn das Programm im Hintergrund laeuft.
Hier mal der Dll-Code, mit dem ich versuche ueber eine Tastenkombination Umlaute einzufuegen.
Abgesehen von den Abstuerzen, funktioniert das auch nicht richtig. Bei einigen Anwendungen wie zB. Notepad, kommt immer noch ein zusaetzliches Zeichen mit.
HHOOK* msghook = 0; // Zeigt auf den gemeinsam genutzen Speicher
// wo die eigentlich HHOOK-Variable dann liegt.
HANDLE mapfile = 0;
HINSTANCE instance = 0;
inline bool winkey_pressed()
{
return (GetAsyncKeyState(VK_LWIN) & (1<<15)) ||
(GetAsyncKeyState(VK_RWIN) & (1<<15));
}
LRESULT CALLBACK message_hook(int code, WPARAM wp, LPARAM lp)
{
if( code >= 0 ) {
MSG* msg = (MSG*)lp;
if(msg->message==WM_CHAR && winkey_pressed()) {
if(msg->wParam=='a') msg->wParam = 'ä';
if(msg->wParam=='o') msg->wParam = 'ö';
if(msg->wParam=='u') msg->wParam = 'ü';
if(msg->wParam=='A') msg->wParam = 'Ä';
if(msg->wParam=='O') msg->wParam = 'Ö';
if(msg->wParam=='U') msg->wParam = 'Ü';
if(msg->wParam=='s') msg->wParam = 'ß';
}
}
return CallNextHookEx(*msghook, code, wp, lp);
}
void get_hook_variable()
{
mapfile = CreateFileMapping(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,
0,sizeof(HHOOK),"MsgHookFileMap");
if( GetLastError()==ERROR_ALREADY_EXISTS )
mapfile = OpenFileMapping(FILE_MAP_ALL_ACCESS,0,"MsgHookFileMap");
assert(mapfile != 0);
msghook = (HHOOK*)MapViewOfFile(mapfile,FILE_MAP_ALL_ACCESS,0,0,0);
assert(msghook != 0);
}
extern "C" _declspec(dllexport)
void install_hook()
{
*msghook = SetWindowsHookEx(WH_GETMESSAGE,message_hook,instance,0);
assert(*msghook != 0);
}
extern "C" _declspec(dllexport)
void remove_hook()
{
UnhookWindowsHookEx(*msghook);
}
extern "C" _declspec(dllexport)
bool WINAPI DllMain(HINSTANCE instance_, DWORD reason, LPVOID)
{
if(reason==DLL_PROCESS_ATTACH) {
instance = instance_;
get_hook_variable();
}
else
if(reason==DLL_PROCESS_DETACH) {
UnmapViewOfFile(msghook);
CloseHandle(mapfile);
}
return DisableThreadLibraryCalls(instance);
}
Die Anwendung sieht dann nur so aus:
install_hook();
system("pause");
remove_hook();
Unter Win98, falls das eine Rolle spielt.
Irgendwelche Ideen?