Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Maus Position ändern?? (https://www.delphipraxis.net/153090-maus-position-aendern.html)

TitanNano 20. Jul 2010 15:23

Maus Position ändern??
 
Hallo,
ich möchte ein kleines Programm schreiben, das beim druck auf W, A, S oder D die Maus verschiebt. Ich habe mit der Taste W angefangen. Um die Maus zu verschiebe habe ich die aktuelle Maus Position abgespeichert, 5 dazu addiert und mit setCursorPos die Position neu gesetzt. Das klappt auch denn wenn ich die Position abfrage ändert diese sich doch auf dem Bildschirm ändert sich nichts wieso??

Delphi-Quellcode:
 m.X:= Mouse.cursorPos.X;
 m.y:= Mouse.cursorpos.Y;
 m.Y:= m.y+100;
 Windows.SetCursorPos(m.X, m.Y);

blackfin 20. Jul 2010 15:33

AW: Maus Position ändern??
 
Bei mir klappt das einwandfrei.
Was für ein System hast du?

TitanNano 20. Jul 2010 15:37

AW: Maus Position ändern??
 
das Programm läuft zurzeit auf
win 2000

blackfin 20. Jul 2010 15:44

AW: Maus Position ändern??
 
Mhm, wenns auf XP geht, müsste es auf W2000 auch gehen.
Wie hast du denn den Keypress eingebunden?

Das hier funktioniert z.B. bei mir im FormKeyDown:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  m: TPoint ;
begin
 m.X:= Mouse.cursorPos.X;
 m.y:= Mouse.cursorpos.Y;

 case Key of
    Ord('W') : m.Y:= m.Y-5;
    Ord('A') : m.X:= m.X-5;
    Ord('S') : m.Y:= m.Y+5;
    Ord('D') : m.X:= m.X+5;
 end;

 Windows.SetCursorPos(m.X, m.Y);

end;

TitanNano 20. Jul 2010 15:55

AW: Maus Position ändern??
 
ich habe es auch in Form.KeyDown!!
Delphi-Quellcode:
procedure TForm1.keyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
//showmessage(IntToStr(Mouse.cursorpos.x));
if (char(key) = 'W') then
begin
 m.X:= Mouse.cursorPos.X;
 m.y:= Mouse.cursorpos.Y;
 up.Enabled:= true;
 end else
 begin
  end;
end;

procedure TForm1.UpTimer(Sender: TObject);
begin
//Mouse.CursorPos:= Point(Mouse.CursorPos.X, Mouse.CursorPos.Y+100);
m.Y:= m.y+5;
Windows.SetCursorPos(m.X, m.Y);
end;

blackfin 20. Jul 2010 16:04

AW: Maus Position ändern??
 
Ä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.

TitanNano 20. Jul 2010 16:07

AW: Maus Position ändern??
 
nein, es muss nicht unbedingt ein Timer sein ich wusste nur nicht dass es auch ohne geht.

DeddyH 20. Jul 2010 16:07

AW: Maus Position ändern??
 
Wenn der Timer nur eine Verlegenheitslösung war, würde ich das ähnlich wie blackfin weiter oben machen. Evtl. musst Du aber noch die KeyPreview-Eigenschaft der Form auf true stellen.
Delphi-Quellcode:
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const Offset = 5;
var OldPos: TPoint;
begin
  OldPos := Mouse.CursorPos;
  case Key of
    Ord('W'): OldPos.Y := OldPos.Y - Offset;
    Ord('S'): OldPos.Y := OldPos.Y + Offset;
    Ord('A'): OldPos.X := OldPos.X - Offset;
    Ord('D'): OldPos.X := OldPos.X + Offset;
  end;
  SetCursorPos(OldPos.X,OldPos.Y);
end;

TitanNano 20. Jul 2010 16:14

AW: Maus Position ändern??
 
so ich habe jetzt folgenden Code:
Delphi-Quellcode:
procedure TForm1.keyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if start then
begin
 m.X:= Mouse.cursorPos.X;
 m.y:= Mouse.cursorpos.Y;
 case Key of
    Ord('W') : m.Y:= m.Y-5;
    Ord('A') : m.X:= m.X-5;
    Ord('S') : m.Y:= m.Y+5;
    Ord('D') : m.X:= m.X+5;
    end;
 Windows.SetCursorPos(m.X, m.Y);
 end else
 begin
  if char(key) = 'J' then
   begin
    start:= true;;
    showmessage('Steureung gestartet!!');
    end;
  end;
end;
Doch bewegen tut die Maus sich immer noch nicht.

DeddyH 20. Jul 2010 16:16

AW: Maus Position ändern??
 
Bist Du mal durchgesteppt? Wird der Code überhaupt ausgeführt?

TitanNano 20. Jul 2010 16:21

AW: Maus Position ändern??
 
ja der Code wird ausgeführt

Edit: ich habe es, es geht au 2000 einfach nicht denn auf meinem XP geht es!!

blackfin 20. Jul 2010 16:26

AW: Maus Position ändern??
 
Also dein Code funktioniert bei mir, wenn auch etwas hakelig, aber die Maus bewegt sich...
Kann es sein, dass du eine spezielle Maus hast, bei der dein Maustreiber irgendwie zwischenpfuscht?
Anders kann ich mir das nicht erklären, laut Microsoft funktioniert SetCursorPos auch ab W2000 Professional. Welches W2000 hast du? Kein Pro?

TitanNano 20. Jul 2010 16:34

AW: Maus Position ändern??
 
win 2000 Professional auf Virtual Box.

Noch ne Frage wie bekomme ich es hin das mein Programm den Tastendruck auch mit bekommt wenn es minimiert ist??

mkinzler 20. Jul 2010 16:37

AW: Maus Position ändern??
 
Funktioniert es bei anderen Windowsversionen in der selben VM?

TitanNano 20. Jul 2010 16:37

AW: Maus Position ändern??
 
noch nicht ausprobiert

mkinzler 20. Jul 2010 16:38

AW: Maus Position ändern??
 
Könnte auch durchaus an VirtualBox liegen.
Btw. Warum W2k?

TitanNano 20. Jul 2010 16:42

AW: Maus Position ändern??
 
ein fach ich wollte mal mit 2000 rumprobieren.

aber nochmal wie kann ich mit meinem Programm einem tasten druck feststellen auch wenn es minimiert ist??

mkinzler 20. Jul 2010 16:43

AW: Maus Position ändern??
 
Dafür müsstest du einen Hook installieren

TitanNano 20. Jul 2010 16:44

AW: Maus Position ändern??
 
ähm was ist das??

blackfin 20. Jul 2010 16:45

AW: Maus Position ändern??
 
Zitat:

Noch ne Frage wie bekomme ich es hin das mein Programm den Tastendruck auch mit bekommt wenn es minimiert ist??
Ein FormKeyDown wird nur ausgelöst, wenn die Form auch das aktive Element ist.
Willst du es global machen, brauchst du einen globalen Hook, oder du machst es eben simpel mit der Timer-Geschichte:


Edit: Bin ich blöd, Timer geht natürlich nicht wenns minimiert ist. Dafür brauchst du dann einen Hook (du musst die Key-Events systemweit abfangen).

mkinzler 20. Jul 2010 16:45

AW: Maus Position ändern??
 
Hier im Forum suchenTastaturhook

DeddyH 20. Jul 2010 16:47

AW: Maus Position ändern??
 
Oder HotKeys registrieren, dazu brauchst Du aber dann noch weitere Tasten.

TitanNano 20. Jul 2010 16:49

AW: Maus Position ändern??
 
okay und woher bekomme ich diesen Hook??

mkinzler 20. Jul 2010 16:50

AW: Maus Position ändern??
 
Aber ich fände es echt blöd, wenn ich in Word eine der genannten tasten (WASD) drücken würde, statt der Buchstaben die Maus sich verschieben würde

mkinzler 20. Jul 2010 16:50

AW: Maus Position ändern??
 
Zitat:

Zitat von TitanNano (Beitrag 1036434)
okay und woher bekomme ich diesen Hook??

Selber schreiben :stupid:

blackfin 20. Jul 2010 16:51

AW: Maus Position ändern??
 
Vollkommene Zustimmung, das wäre nervig ohne Ende.

Was hast du damit eigentlich genau vor?
Warum reicht es nicht, dass du die Tasten abfrägst, wenn deine Applikation auch gerade die aktive ist?
WASD klingt doch irgendwie nach Spiel-Steuerung und die muss definitiv nur dann aktiv sein, wenn ich das Spiel auch gerade aktiv habe..

himitsu 20. Jul 2010 16:53

AW: Maus Position ändern??
 
  • wo ist m deklariert?
  • warum ist m keine lokale Variable?
    (bestifft Beitrag #5 und #9)
  • SetCursorPos hat Rückgabewerte
    Zitat:

    Return Value

    BOOL

    Returns nonzero if successful or zero otherwise. To get extended error information, call GetLastError.
    sowas könnte/sollte man mal auswerten (vorallem wenn es Probleme gibt)

TitanNano 20. Jul 2010 17:09

AW: Maus Position ändern??
 
also wenn ich nun meine Maus auf einen Ordner lenke und dann klick, dann ist die Steuerung weg und das ist doof!!

Edit:
ich habe mir folgenden Tastatur hook aus dem Internet geholt:

Delphi-Quellcode:
library KeyboardHook;

uses
  Windows,
  Messages;

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
//Erstmal Hook installieren
//First install the hook
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc,
    HInstance, 0);
//Uebergebenes Fensterhandle sichern
//Save the given window handle
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook;
end.
doch bei,
Delphi-Quellcode:
HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc,
    HInstance, 0);
Kommt immer "[Error] Window.pas(129): Variable required" habe ich irgend was falsch kopiert oder Stimmt der Hook nicht??


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz