/************************************************************************
* Hilfs-DLL für globale Hooks zum Abfangen von Mausrad-Aktionen *
* Funktion: *
* Bewegung des Mausrades sowie der mittleren Maustaste systemweit *
* abfangen und zu einer gewünschten Applikation (Motorsteuerung) *
* umleiten. *
* Die Umleitung erfolgt: *
* - bei eingerasteter SCROLL-LOCK-Funktion (Ein-Hand-Bedienung) *
* - beim Festhalten einer der beiden Windows-Tasten (Zwei-Hand-Bed.) *
* Ohne Mausaktion funktionieren die Windows-Tasten wie gehabt. *
* Verwendung: *
* Eintrittspunkt: InfoWindow(HWND) setzt Zielfenster für PostMessage() *
* Argument = 0 setzt /kein/ Zielfenster (Programm piepst) *
* PostMessage-Argumente: *
* wParam = WM_MBUTTON{DOWN|UP} oder WM_MOUSEWHEEL *
* (short)HIWORD(lParam) = Wheel-Delta (±120 für 1 Schritt) *
* Testweise kann die DLL mit llib.exe geladen werden, dann nur Pieps. *
************************************************************************
Änderungen (~=Bugfix)
100825 erstellt
*/
#define _WIN32_WINNT 0x0610
#include <windows.h>
#include "wheelcap.h"
#pragma bss_seg(".shared")
HHOOK KeyboardHook;
HHOOK MouseHook;
HWND InfoWnd;
#pragma bss_seg()
BYTE states;
// Bit 0: LWIN gedrückt
// Bit 1: RWIN gedrückt
// Bit 2: passendes Mausereignis wurde verarbeitet
// Bit 3: Weiteres Tastaturereignis wurde verarbeitet (normale Funktion)
// Bit 7: Dieser Prozess hat den KeyboardHook angelegt
void InfoWindow(HWND Wnd) {
InfoWnd=Wnd;
}
LRESULT CALLBACK LowLevelMouseProc(int code, WPARAM wParam, LPARAM lParam) {
if (code==HC_ACTION
&& (states&3 && !(states&8) || GetKeyState(VK_SCROLL)&1)
&& (wParam==WM_MBUTTONDOWN || wParam==WM_MBUTTONUP || wParam==WM_MOUSEWHEEL)) {
MSLLHOOKSTRUCT *mhs=(MSLLHOOKSTRUCT*)lParam;
if (InfoWnd) PostMessage(InfoWnd,WM_WHEELCAP,wParam,mhs->mouseData);
else Beep(1000+(short)HIWORD(mhs->mouseData),30); // Pieps wenn ohne Zielfenster
states|=4;
return 1; // Mausereignis verschlucken
}
return CallNextHookEx(MouseHook,code,wParam,lParam);
}
LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
if (code==HC_ACTION) {
KBDLLHOOKSTRUCT*khs=(KBDLLHOOKSTRUCT*)lParam;
BYTE mask=1;
switch (khs->vkCode) {
case VK_RWIN: mask=2;
case VK_LWIN: {
if (!(khs->flags&LLKHF_INJECTED)) { // Rekursion vermeiden
if (khs->flags&LLKHF_UP) { // loslassen?
states&=~mask;
if (!(states&3)) { // beide WIN-Tasten losgelassen?
if (states&4) { // Bei Rollrad-Aktion:
states&=~4; // komplett verschlucken
}else if (states&8) { // Bei Tastatur-Aktion:
states&=~8;
break; // Loslass-Ereignis durchreichen
}else{ // ohne Aktion
keybd_event((BYTE)khs->vkCode,(BYTE)khs->scanCode,khs->flags&LLKHF_EXTENDED?KEYEVENTF_EXTENDEDKEY:0,khs->dwExtraInfo); // Tastenereignisse simulieren
keybd_event((BYTE)khs->vkCode,(BYTE)khs->scanCode,khs->flags&LLKHF_EXTENDED?KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP:KEYEVENTF_KEYUP,khs->dwExtraInfo);
}
}
}else{
states|=mask;
}
return 1; // Ereignis verschlucken (unbekannt, was noch kommt)
}
}break;
default: { // sonstige Taste?
if (states&3 && !(states&8)) {
states|=8; // Mausaktion sperren
if (states&1) keybd_event(VK_LWIN,0,0,0); // Tastaturereignisse nachschieben (Reihenfolge bewahren)
if (states&2) keybd_event(VK_RWIN,0,0,0);
DWORD flags=0;
if (khs->flags&LLKHF_EXTENDED) flags|=KEYEVENTF_EXTENDEDKEY;
if (khs->flags&LLKHF_UP) flags|=KEYEVENTF_KEYUP;
keybd_event((BYTE)khs->vkCode,(BYTE)khs->scanCode,flags,khs->dwExtraInfo);
return 1;
}
}
}
}
return CallNextHookEx(KeyboardHook,code,wParam,lParam);
}
EXTERN_C BOOL CALLBACK _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID) {
switch (fdwReason) {
case DLL_PROCESS_ATTACH: {
DisableThreadLibraryCalls(hinstDLL);
if (!KeyboardHook) {
KeyboardHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,hinstDLL,0);
MouseHook=SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,hinstDLL,0);
states=0x80;
}
}break;
case DLL_PROCESS_DETACH: {
if (states&0x80) {
UnhookWindowsHookEx(KeyboardHook);
UnhookWindowsHookEx(MouseHook);
}
}
}
return TRUE;
}
Detected encoding: UTF-8 | 0
|