Wenn du SetWindowsHookEx mit einem gültigen HInstance-Wert aufrufst, führt das dazu, dass, wann immer eine Anwendung eine entsprechende Nachricht empfängt, geprüft wird, ob die Hook-
DLL geladen wird, wenn nein, wird sie geladen und DllMain aufgerufen. Anschließend wird in jedem Fall die Hook-Prozedur aufgerufen.
In jeder Anwendung, die Maus-Nachrichten empfängt, gibt es also eine eigenständige Instanz der
DLL. Das ist auch der Grund, warum eine MMF nötig ist: Alle Instanzen haben einen unabhängigen Satz von globalen Variablen.
Hast du es eigentlich schon einmal mit GetAsyncKeyState versucht, um den Status der Steuerungs-Taste zu überprüfen?