Die Lösung des Problems stellt sich folgendermaßen dar:
1. Eine systemweite Hookfunktion für die Tastaturnachrichten einrichten
2. In dieser Hookfunktion werden die gewünschten Tastencodes für die zu generierenden Mauszeigerversatz (Positionierung) Nachrichten / Funktionsaufrufe ausgefiltert und zur Steuerung des Mauszeigers herangezogen. D.h. es wird mittels switch Anweisung und case Fällen die entsprechende Positionsveränderung durchgeführt. Unter Java passiert dies mit der Erzeugung eines Mausevents mittels new und dem Aufruf von translatePoint sowie dem Einreihen der Nachricht in der Ereigniswarteschlange (Event Queue) mit postEvent.
Das ganze soll sich ja auf den Desktop beziehen, im Übrigen auch auf alle Anwendungen, im übrigen auch auf alle Fenster aller Anwendungen. Insofern muß man eine systemweite Hookfunktion auf die Tastatur einrichten.
Wie geschieht das ganze in der Praxis, warum Java

? besser in einfachem C, da funktioniert es wenigstens einfach:
*) Hookfunktion einrichten
Code:
MyKeybdHookHandleNr=SetWindowsHookEx(
WH_KEYBOARD, /* es handelt sich um eine Tastaturnachrichtabfangprozedur, type of hook to install */
MyBliBlaTralalaKeybdHookFunktion, /* address of hook procedure */
NULL, /* handle of application instance, systemwide so NULL */
NULL); /* identity of thread to install hook for, systemwide so NULL, das bedeutet für alle Prozesse und Unterprozesse */
*) Hookfunktion implementieren, schreiben, kreieren, was auch immer
Code:
LRESULT CALLBACK MyBliBlaTralalaKeybdHookFunktion(
int code, /* hook code */
WPARAM wParam, /* virtual-key code */
LPARAM lParam) /* keystroke-message information */
{
POINT mauspos;
int repeat_count;
if(code<0) return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
/* CallNextHookEx wird, wenn code<0 ist, mit den jetzigen Parametern aufgerufen, ist eigentlich nicht notwendig, denn hier wird ein systemweiter Hook behandelt, das ist Programmierer Jägerlatein, oder anders ausgedrückt Ansichtssache ob es in diesem Fall gemacht werden soll, bei Fenster-/Applikations-/Threadspezifischen Hooks auf jeden Fall */
/* Variante 1 bei PeekMessage einer Applikation mit Parameter PM_NOREMOVE */
if(code == HC_NOREMOVE) return 0; /* Zielfenster hat ein PeekMessage gemacht, das ganze darf zum Zielfenster durch => return 0 */
/* bzw. auch in diesem Fall - konsequenterweise - CallNextHookEx aufrufen, insofern ... Variante 2 statt Variante 1 verwenden=codieren=hinschreiben */
/* Variante 2 bei PeekMessage einer Applikation mit Parameter PM_NOREMOVE */
if(code == HC_NOREMOVE) return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
if(code != HC_ACTION) /* tu was, z.B. CallNextHookEx */ tu_was...();
/* Hier ist sicher, daß eine Nachricht aufgetreten ist und eine Aktion ausgeführt werden soll, deswegen auch HC_ACTION in der Parametervariable code */
GetCursorPos(&mauspos); /* wo steht's jetzt das Mauserl ? */
repeat_count= (lParam & 65535);
/* Virtual Keycodes abfragen: Mausposition verändern, sofern eine der richtigen Tasten (VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN) gedrückt wurde, eventuell andere Tasten bzw. eine Kombination aus "Pfeiltaste" + Shift oder anderem abfragen, da die Pfeiltasten nur mehr die Maus steuern, einen Texteditorcursor kann man mit den Pfeiltasten sonst nicht mehr positionieren, eventuell nur bei eingeschaltetem NUMLOCK usw. */
switch(wParam)
{
case VK_LEFT:
if(mauspos.x>=repeat_count) mauspos.x-=repeat_count; else mauspos.x=0;
break;
case VK_RIGHT:
if(mauspos.x+repeat_count<max_desktopx) mauspos.x+=repeat_count; else mauspos.x = max_desktopx - 1; /* max_desktopx muß man sich vom System besorgen, ebenso max_desktopy */
break;
case VK_UP:
if(mauspos.y>=repeat_count) mauspos.y-=repeat_count; else mauspos.y=0;
break;
case VK_DOWN:
if(mauspos.y+repeat_count<max_desktopy) mauspos.y+=repeat_count; else mauspos.y = max_desktop.y - 1;
break;
default: /* kein gesuchter Tastencode gekommen, zur nächsten Hookfunktion, so vorhanden */
return CallNextHookEx(MyKeybdHookHandleNr,code,wParam,lParam);
}
SetCursorPos(mauspos.x,mauspos.y); /* Mauszeiger positionieren */
return 1; /* Tastaturnachricht wurde bearbeitet */
}
MyKeybdHookHandleNr ist vom Typ HHOOK und muß eine globale Variable sein, max_desktopx und max_desktopy sind vom Typ int und ebenso globale Variablen, beschaffbar von Windows mittels dieser zwei Aufrufe:
max_desktopx=GetSystemMetrics(SM_CXSCREEN);
max_desktopy=GetSystemMetrics(SM_CYSCREEN);