Ähm, so kann das irgendwie nicht richtig funktionieren....
FormKeyDown wird immer wieder aufgerufen, während du die Taste drückst, und in der Routine setzt du m.Y dauernd auf die aktuelle Position der Maus.
Wenn dein Timer dann zuschlägt, kann es sein, dass die Routine bereits inzwischen wieder auf Mouse.cursorPos.Y zurückgesetzt hat.
Ausserdem wird der Timer gar nicht abgeschaltet, so dass die Maus dauernd nach oben fliegt.
Das ist nicht unbedingt ein guter Ansatz
Wenn du es unbedingt mit einem Timer machen willst, lass das FormKeyDown ganz weg und schreib deinen UpTimer so:
Delphi-Quellcode:
procedure TForm1.UpTimer(Sender: TObject);
var
m: TPoint ;
begin
m.X := Mouse.cursorPos.X;
m.Y := Mouse.cursorpos.Y;
if self.Active then
begin
if (GetAsyncKeyState(Ord('W')) <> 0) then m.Y := m.Y-5;
if (GetAsyncKeyState(Ord('A')) <> 0) then m.X := m.X-5;
if (GetAsyncKeyState(Ord('S')) <> 0) then m.Y := m.Y+5;
if (GetAsyncKeyState(Ord('D')) <> 0) then m.X := m.X+5;
Windows.SetCursorPos(m.X, m.Y);
end;
end;
Das hat den Vorteil, dass du auch gleichzeitiges Drücken von mehreren Tasten handelst.