Quelltext /~heha/mb-iwp/Antriebe/Schrittmotorsteuerung/smc.zip/wheelcap.cpp

/************************************************************************
 * 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;
}
Vorgefundene Kodierung: UTF-80