Mauskoordinaten per TCP oder UDP senden

  • Hi an die erfahrenen Proger und scripter,

    ich hab folgendes Problem, ich möchte mit UDPSend Mauskoordinaten verschicken und diese auf auf einen anderen Rechner auswerten und per Mousemove benutzen. Das Problem was ich nun habe ist, dass ich nur eine variable senden kann aber Mousegetpos indirekt zwei variablen beinhaltet.
    und mit $pos[0] und $pos[1] kommt eine fehlermeldung, dass die variable nicht deklariert sei....
    hat einer ein Lösungsansatz für mich?
    Oder gibts eine Möglichkeit mehrere Variablen mit einmal zu versenden?

    lg ABe

    PS: nur um missverständnisse zu vermeiden, ich möchte ein peer-to-peer script schreiben welches einen ausgeführten Klick auf dem anderen Pc auch ausführt und umgekehrt. Hintergrund, ich will ein Klick-n-Point Adventure mit nemm Kumpel zusammen spielen (über Internet/ bzw LAN --> Hamachi) und so passiert auf beiden rechnern das gleiche (is nur Theorie und es gibt noch viele Probleme die da auf uns zu kommen, ich weiß)

    2 Mal editiert, zuletzt von DaABe (7. August 2009 um 00:10)

    • Offizieller Beitrag

    Nun, zum einen könntest Du einfach zwei Pakete (mit den X- und Y-Koordinaten) senden oder Du packst beide Werte in ein Integerwert zusammen:

    [autoit]


    #include <Array.au3>
    $aMousePos = MouseGetPos()
    _ArrayDisplay($aMousePos, 'Die beiden Werte von MouseGetPos:')

    [/autoit][autoit][/autoit][autoit]

    $iSend = BitOR(BitShift(BitAND($aMousePos[0], 0x0000FFFF), -16), BitAND($aMousePos[1], 0x0000FFFF)) ; umwandeln in ein Integerwert

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,'So wird die Zahl gesendet:',Hex($iSend))

    [/autoit][autoit][/autoit][autoit]

    Dim $aReceive[2] = [BitShift(BitAND($iSend, 0xFFFF0000), 16), BitAND($iSend, 0x0000FFFF)] ; wieder zurück in ein Array
    _ArrayDisplay($aReceive, 'Wieder zwei Werte beim Empfänger:')

    [/autoit]
  • ok danke oscar,
    ok die variante ist wirklich gut aber jetzt ergibt sich das problem, dass nicht der wert ankommt der auch versendet wird, woran kann das liegen?
    wie sende ich den wert richtig?
    " $status = UDPSend($socketsend, Hex($iSend) ) " oder
    " $status = UDPSend($socketsend, $iSend ) "
    benutze ich die erste variante, dann

    MsgBox(0,'So wird die Zahl gesendet:',Hex($iSend))
    =
    MsgBox(0,'So wird die Zahl empfangen:',$data)

    nur stimmt der wert nicht mehr wenn ich ihn in ein array zurückwandle?!

    3 Mal editiert, zuletzt von DaABe (4. August 2009 um 19:32)

  • ok bin selber dahinter gestiegen, nach dem empfangen muss die hexa zahl erst wieder in eine dezimalzahl umgewandelt werden.
    nun noch eine frage, wie kann ich 3 werte in einer versenden?
    ich möchte noch eine einstellige zahl als dritte variable versenden

    mfg ABe

    Einmal editiert, zuletzt von DaABe (5. August 2009 um 13:57)

    • Offizieller Beitrag

    So geht es auch mit drei Werten, wenn man den Wertebereich eingrenzt:

    [autoit]


    #include <Array.au3>
    ; Das Array $aSend enthält die drei Werte. Die ersten beiden Werte dürfen im zwischen 0...4095 und der Dritte zwischen 0...15 liegen
    Dim $aSend[3] = [4095, 4095, 15]

    [/autoit][autoit][/autoit][autoit]

    $iSend = BitOR(BitShift(BitAND($aSend[0], 0x00000FFF), -16), BitShift(BitAND($aSend[1], 0x00000FFF), -4), BitAND($aSend[2], 0x0000000F)) ; umwandeln in ein Integerwert

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,'So wird die Zahl gesendet:',Hex($iSend))

    [/autoit][autoit][/autoit][autoit]

    Dim $aReceive[3] = [BitShift(BitAND($iSend, 0x0FFF0000), 16), BitShift(BitAND($iSend, 0x0000FFF0), 4), BitAND($iSend, 0x0000000F)] ; wieder zurück in ein Array
    _ArrayDisplay($aReceive, 'Werte beim Empfänger:')

    [/autoit]
  • geil danke, es funzt super auch wenn ich hinter die syntax noch immer nicht richtig gestoßen bin.....

    gruß andy

    • Offizieller Beitrag

    Dieser "Trick" basiert darauf, dass ein Integerwert bei AutoIt einen Wertebereich von 32 Bit darstellt.
    Das sind 4 Byte (mit je 8 Bit) oder 8 Nibble (mit je 4 Bit). Ein Nibble wird hexadezimal mit einem "F" dargestellt, also sind 32 Bit = 0xFFFFFFFF.
    Um mehrere Variablen in einem Integerwert unterzubringen muss man den Wert maskieren (BitAnd) und dann an die vorgesehene Position in der Integervariablen verschieben (BitShift).
    Aufpassen muss man mit dem höchstwertigsten Bit, denn dieses wird als Vorzeichenbit verwendet (signed Integer).

    Damals, beim programmieren auf dem C64, habe ich das Prinzip benutzt, um Speicherplatz zu sparen. Heutzutage hat man eigentlich genug davon. ;)

  • so langsam kommt das prgramm in die beta-phase, ich kann nun mit einem freund im coop diverese click-n-point adventures spielen (wie monkey island oder the dig (über scummVM und Hamachi)) macht sehr viel spaß, hoffe bald eine version posten zu können und eventuell auch andere damit glücklich machen zu können :)

    aber ein weiteres problem stellt sich dazwischen.

    wenn wir im vollbildmodus spielen holt autoit scheinbar mit MouseGetPos() falsche werte, zumindest scheint es so, denn wenn der gegenüber im Vollbild ein klick macht, kommen falsche daten bei mir an.
    woran kann das liegen?
    gibt es eine variante mit winapi?
    oder kann das problem auch an etwas anderem liegen?

    gruß ABe