Seite 1 von 2

Mouse - Controller

Verfasst: 12.11.2008 20:43
von Josef Sniatecki
In der vertieften Arbeit zwischen Hausaufgaben und Projekte habe ich mal
ein bisschen erholung gebraucht. Doch anstatt ein Nickerchen zu machen
habe ich einfach mal was leichtes und doch irgendwie cooles geproggt:

Code: Alles auswählen

#Friction=0.96
#MaximalSpeed=8
#Speed=0.18



Global X.f,Y.f
Global MoveX.f,MoveY.f
Global ScreenWidth.w,ScreenHeight.w
Global Position.POINT


GetCursorPos_(@Position)
X=Position\X
Y=Position\Y
ScreenWidth=GetSystemMetrics_(#SM_CXSCREEN)
ScreenHeight=GetSystemMetrics_(#SM_CYSCREEN)

Repeat
  If GetAsyncKeyState_(#VK_RIGHT)
    MoveX+#Speed
  ElseIf GetAsyncKeyState_(#VK_LEFT)
    MoveX-#Speed
  EndIf
  If GetAsyncKeyState_(#VK_DOWN)
    MoveY+#Speed
  ElseIf GetAsyncKeyState_(#VK_UP)
    MoveY-#Speed
  EndIf
  If GetAsyncKeyState_(#VK_SPACE)
    MoveX*0.8
    MoveY*0.8
  EndIf
  
  If MoveX<-#MaximalSpeed
    MoveX=-#MaximalSpeed
  ElseIf MoveX>#MaximalSpeed
    MoveX=#MaximalSpeed
  EndIf
  If MoveY<-#MaximalSpeed
    MoveY=-#MaximalSpeed
  ElseIf MoveY>#MaximalSpeed
    MoveY=#MaximalSpeed
  EndIf
  
  X+MoveX
  Y+MoveY
  
  If X<0
    X=ScreenWidth
  ElseIf X>ScreenWidth
    X=0
  EndIf
  If Y<0
    Y=ScreenHeight
  ElseIf Y>ScreenHeight
    Y=0
  EndIf
  
  MoveX*#Friction
  MoveY*#Friction
  
  SetCursorPos_(Int(X),Int(Y))
  
  Delay(10)
Until GetAsyncKeyState_(#VK_ESCAPE)

End
Man kann durch diesen Code die Maus mit der Tastatur steuern. Dabei
gibt es einen coolen Reibungseffekt. Außerdem taucht die Maus an der
gegenüberliegenden Wand auf, falls sie durch eine Wand fliegt.

Was ich gerade versuche, durch ENTER einen Linksklick zu simulieren.
Da habe ich die API-Struktur INPUT\mi gefunden, doch irgendwie komme
ich nicht weiter.

Probiert es einfach mal aus und fügt etwas hinzu oder gebt einfach mal
eure Kommentare.

mfg Josef

Verfasst: 12.11.2008 20:47
von memdee
Witzig! Sinnlos, aber witzig :)

Erinnert mich sehr an die roten Gummi-Nippel bei (älteren) IBM Thinkpads.

Verfasst: 12.11.2008 20:49
von Josef Sniatecki
Für mich auch witzig. Ich weiß das es sinnlos ist. Aber was solls. :wink:
Trotzdem macht es spaß damit und dem Code herumzuspielen. Was
mir halt fehlt ist die Linksklick-Simulation durch ENTER.
Vieleicht gibts hier API-Gurus. <)

Verfasst: 12.11.2008 21:28
von RSBasic
@Josef Sniatecki
Ich find das ebenfalls lustig, sehr sogar *G*
Aber gut gemacht :allright: (auch wenn das nicht so nützlich ist)
Ist halt ne schöne Spielerei <)

Verfasst: 13.11.2008 18:11
von Peace
Hallo Josef,

finde die Idee echt cool :allright:
Hier mal ein Code mit dem Du die rechte (TAB) bzw. linke Maustaste (RETURN) simulieren könntest:

Code: Alles auswählen

...
  If GetAsyncKeyState_(#VK_RETURN)
    MouseB.INPUT
    MouseB\type         = #INPUT_MOUSE
    MouseB\mi\dwFlags	= #MOUSEEVENTF_LEFTDOWN
    SendInput_(1, @MouseB, SizeOf(MouseB))
	 ZeroMemory_(@MouseB, SizeOf(MouseB))
    MouseB\type         = #INPUT_MOUSE
    MouseB\mi\dwFlags   = #MOUSEEVENTF_LEFTUP
    SendInput_(1, @MouseB, SizeOf(MouseB))
  ElseIf GetAsyncKeyState_(#VK_TAB)
    MouseB.INPUT
    MouseB\type         = #INPUT_MOUSE
    MouseB\mi\dwFlags	= #MOUSEEVENTF_RIGHTDOWN
    SendInput_(1, @MouseB, SizeOf(MouseB))
	 ZeroMemory_(@MouseB, SizeOf(MouseB))
    MouseB\type         = #INPUT_MOUSE
    MouseB\mi\dwFlags   = #MOUSEEVENTF_RIGHTUP
    SendInput_(1, @MouseB, SizeOf(MouseB))
  EndIf
...

Verfasst: 13.11.2008 18:34
von Josef Sniatecki
Danke Peace, :allright:

habe nun deinen Tipp in den Code eingebaut. Man kann nun durch
Enter (Links) und Tab (Rechts) Klicks simulieren. Doch mir sind da so
einige Probleme aufgefallen. Da viele Programme auf die Tastatur
reagieren (wie der win-explorer oder opera) kann das zu einem
durcheinander führen.

Ich glaube da brauche ich wieder einen API-Guru, da ich nicht möchte,
dass die Programme auf die benutzten Tasten reagieren.

Hier der Code:

Code: Alles auswählen

#Friction=0.96 
#MaximalSpeed=8 
#Speed=0.18 



Global X.f,Y.f 
Global MoveX.f,MoveY.f
Global Right.l,Left.l
Global ScreenWidth.w,ScreenHeight.w
Global Position.POINT,Input.INPUT


GetCursorPos_(@Position) 
X=Position\X 
Y=Position\Y 
ScreenWidth=GetSystemMetrics_(#SM_CXSCREEN) 
ScreenHeight=GetSystemMetrics_(#SM_CYSCREEN) 

Repeat 
  If GetAsyncKeyState_(#VK_RIGHT) 
    MoveX+#Speed 
  ElseIf GetAsyncKeyState_(#VK_LEFT) 
    MoveX-#Speed
  EndIf
  If GetAsyncKeyState_(#VK_DOWN)
    MoveY+#Speed
  ElseIf GetAsyncKeyState_(#VK_UP)
    MoveY-#Speed
  EndIf
  If GetAsyncKeyState_(#VK_SPACE)
    MoveX*0.8
    MoveY*0.8
  EndIf
  
  If Left=#False
    If GetAsyncKeyState_(#VK_RETURN)
      Input\type=#INPUT_MOUSE
      Input\mi\dwFlags=#MOUSEEVENTF_LEFTDOWN
      SendInput_(1,@Input,SizeOf(INPUT))
      ZeroMemory_(@Input,SizeOf(INPUT))
      Left=#True
    EndIf
  ElseIf GetAsyncKeyState_(#VK_RETURN)=#False
    Input\type=#INPUT_MOUSE
    Input\mi\dwFlags=#MOUSEEVENTF_LEFTUP
    SendInput_(1,@Input,SizeOf(INPUT))
    ZeroMemory_(@Input,SizeOf(INPUT))
    Left=#False
  EndIf
  If Right=#False
    If GetAsyncKeyState_(#VK_TAB)
      Input\type=#INPUT_MOUSE
      Input\mi\dwFlags=#MOUSEEVENTF_RIGHTDOWN
      SendInput_(1,@Input,SizeOf(INPUT))
      ZeroMemory_(@Input,SizeOf(INPUT))
      Right=#True
    EndIf
  ElseIf GetAsyncKeyState_(#VK_TAB)=#False
    Input\type=#INPUT_MOUSE
    Input\mi\dwFlags=#MOUSEEVENTF_RIGHTUP
    SendInput_(1,@Input,SizeOf(INPUT))
    ZeroMemory_(@Input,SizeOf(INPUT))
    Right=#False
  EndIf
  
  If MoveX<-#MaximalSpeed 
    MoveX=-#MaximalSpeed 
  ElseIf MoveX>#MaximalSpeed 
    MoveX=#MaximalSpeed 
  EndIf 
  If MoveY<-#MaximalSpeed 
    MoveY=-#MaximalSpeed 
  ElseIf MoveY>#MaximalSpeed 
    MoveY=#MaximalSpeed 
  EndIf 
  
  X+MoveX 
  Y+MoveY 
  
  If X<0 
    X=ScreenWidth 
  ElseIf X>ScreenWidth 
    X=0 
  EndIf 
  If Y<0 
    Y=ScreenHeight 
  ElseIf Y>ScreenHeight 
    Y=0 
  EndIf 
  
  MoveX*#Friction 
  MoveY*#Friction 
  
  SetCursorPos_(Int(X),Int(Y)) 
  
  Delay(10) 
Until GetAsyncKeyState_(#VK_ESCAPE) 

End

Verfasst: 13.11.2008 21:24
von Thalius
:mrgreen: so geil ENDLICH kann ich Moorhuhn mit der Tastatur spielen !! :lol:

funny Teil ;)

Verfasst: 14.11.2008 01:19
von Bisonte
Ich find dieses "schwammige", also das abbremsen und Gasgeben cool....

Verfasst: 14.11.2008 09:58
von dige
Bei einem einzelnen Cursor-Klick sollte die Muas aber nicht gleich wie auf Eis schlingern ... so kann man nicht besonders gut fein positionieren..

Verfasst: 14.11.2008 10:00
von gnasen
Eine Freundin hatte auf ihrer etwas betagteren Tastatur extra einen Button (wie zB der Num-Block oder Capslock) mit dem man die Maus mitm Nummernblock kontrollieren konnte. Auf den Tasten standen dann auch schöne Pfeile für die Richtung oder auch "Doppelclick" etc.
Sehr lustige Sache, nutzen... naja, es macht spass...