Ich hatte in einem meiner Spiele mal die Shoutbox hier in Verbindung mit der epvp Library über DirectX gezeichnet. Dafür habe ich mal mit C# gespielt und mittels der [Only registered and activated users can see links. Click Here To Register...] eine Library (DLL) in den Prozess injizieren können.
Ich hatte testweise geplant, eine Art Eingabe zu implementieren die ermöglicht, direkt im Spiel einen Shout zu senden.
Soweit so gut aber irgendwie muss die Eingabe aus dem Spiel ja auch registriert werden, ne? Shift abzufragen ob der Eingabemodus aktiv ist, war kein Problem. GetAsyncKeyState hätte da schon ausgereicht aber ich möchte ja auch die Zeichen der gedrückten Tasten abfangen und mitzeichnen.
Erst hatte ich mit [Only registered and activated users can see links. Click Here To Register...] einen Hook in die Hookchain mit dem Typ WH_KEYBOARD_LL eingereiht. Das war kein Problem, ich bekam die entsprechenden Nachrichten (WM_KEYDOWN war relevant) über den Callback und habe tatsächlich auch den Key aus der Nachricht ziehen können, der Ingame gedrückt wurde. Einziger Haken: Enthalten ist der Virtual Key Code, der mir leider nicht viel bringt weil der VK und das eigentliche Zeichen das daraus resultiert 2 verschiedene Paar Schuhe sind.
Gut, erstmal gesucht wie man den VK denn umkonvertieren kann um das Zeichen herauszubekommen. Geht nicht wirklich, weil es keine Unterscheidung zwischen Großbuchstaben und Kleinbuchstaben gibt und Sonderzeichen wohl nicht richtig interpretiert werden (also Tastenkombinationen aus ALT usw.).
Also weiter gesucht und folgende Informationen gefunden:
Schön wäre es gewesen aber:
_hHook ist nun plötzlich 0 (NULL), Aufruf zu GetLastError gibt 1428 (0x594) zurück:
Wieder in MSDN nachgeschaut und folgende Informationen erhalten:
______
Dann fällt das weg. Gibt's noch andere Möglichkeiten für mein Vorhaben?
Ich hatte testweise geplant, eine Art Eingabe zu implementieren die ermöglicht, direkt im Spiel einen Shout zu senden.
Soweit so gut aber irgendwie muss die Eingabe aus dem Spiel ja auch registriert werden, ne? Shift abzufragen ob der Eingabemodus aktiv ist, war kein Problem. GetAsyncKeyState hätte da schon ausgereicht aber ich möchte ja auch die Zeichen der gedrückten Tasten abfangen und mitzeichnen.
Erst hatte ich mit [Only registered and activated users can see links. Click Here To Register...] einen Hook in die Hookchain mit dem Typ WH_KEYBOARD_LL eingereiht. Das war kein Problem, ich bekam die entsprechenden Nachrichten (WM_KEYDOWN war relevant) über den Callback und habe tatsächlich auch den Key aus der Nachricht ziehen können, der Ingame gedrückt wurde. Einziger Haken: Enthalten ist der Virtual Key Code, der mir leider nicht viel bringt weil der VK und das eigentliche Zeichen das daraus resultiert 2 verschiedene Paar Schuhe sind.
Gut, erstmal gesucht wie man den VK denn umkonvertieren kann um das Zeichen herauszubekommen. Geht nicht wirklich, weil es keine Unterscheidung zwischen Großbuchstaben und Kleinbuchstaben gibt und Sonderzeichen wohl nicht richtig interpretiert werden (also Tastenkombinationen aus ALT usw.).
Also weiter gesucht und folgende Informationen gefunden:
"Super", hatte ich mir gedacht. "Dann wechsel ich einfach den Typ von WH_KEYBOARD_LL auf WH_GETMESSAGE und erhalte mit der selben Callback Signatur einfach alle Nachrichten die so in die Schleife geworfen werden".Quote:
Originally Posted by MSDNKey strokes are converted into characters by the TranslateMessage function, which we first saw in Module 1. This function examines key-down messages and translates them into characters. For each character that is produced, the TranslateMessage function puts a WM_CHAR or WM_SYSCHAR message on the message queue of the window. The wParam parameter of the message contains the UTF-16 character.
Schön wäre es gewesen aber:
Code:
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
// curModule.ModuleName: Diablo III.exe
_hHook = SetWindowsHookEx(WH_GETMESSAGE, proc, GetModuleHandle(curModule.ModuleName), 0);
}
Wieso? Ich habe doch hier explizit den Modulnamen angegeben und der ist auch richtig.Quote:
ERROR_HOOK_NEEDS_HMOD
1428 (0x594)
Cannot set nonlocal hook without a module handle.
Wieder in MSDN nachgeschaut und folgende Informationen erhalten:
Quote:
Originally Posted by MSDNWH_KEYBOARD_LL Global only
WH_GETMESSAGE Thread or global
Hilft mir jetzt aber nicht weiter. Wieso konnte der Hook mit WH_KEYBOARD_LL platziert werden, mit WH_GETMESSAGE aber nicht?Quote:
Originally Posted by MSDNThe global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries. Global hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove its hook procedure.
______
[Only registered and activated users can see links. Click Here To Register...]Quote:
Global hooks are not supported in the .NET Framework
Except for the WH_KEYBOARD_LL low-level hook and the WH_MOUSE_LL low-level hook, you cannot implement global hooks in the Microsoft .NET Framework. To install a global hook, a hook must have a native DLL export to inject itself in another process that requires a valid, consistent function to call into. This behavior requires a DLL export. The .NET Framework does not support DLL exports. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically.
Low-level hook procedures are called on the thread that installed the hook. Low-level hooks do not require that the hook procedure be implemented in a DLL.
Dann fällt das weg. Gibt's noch andere Möglichkeiten für mein Vorhaben?