Webplugin via Joystick bedienen

  • Auf dem Screenshot sieht man, dass das via dem Internetexplorer geföffnetem ActiveX Plugin einer Netzwerkkamera.
    autoit.de/wcf/attachment/24653/

    Die Bedienung sieht wie folgt aus:

    Kamera bewegen/schwenken erreicht man, wenn man mit der rechten Maustaste
    einmal in das Livebild klickt, danach erscheint ein roten Fadenkreuz.
    Sobald man dann mit der linken Maustaste das Bild, irgendwo im Bild,
    anklickt und gedrückt hält und dann die Maus bewegt, folgt die Kamera
    nach. Je weiter man die Maus wegbewegt, von dem Punkt wo man das Bild
    gegriffen hat, desto schneller die Geschwindigkeit - wie ein Gaspedal.

    Das Zommen, und alle anderen Funktionen die daneben eingeblendet sind,
    erscheint erst als PopOver, wenn man mit dem Mauszeiger an den unteren
    Bildrand fährt. Wenn sich der Mauszeiger nicht in der Gegend aufhält,
    ist das Einblendmenü nicht sichtbar.

    Ziel ist es, dass man die
    Kamerabedienung per Joystick bedienen kann, blind, ohne
    hinzugucken (auf die Symbole des Einblendmenu).

    Angenommen, die Zoom Funktion wäre über das Mausrad (standardmäßig) verfügbar, könnte
    man damit leben, aber das "suchen" der Icons ist keine Lösung.

    Ich hab mir Jostick-to-Mouse Programme angeschaut, aber keine (mir ins Auge
    springende) Features gesehen, dass man die Schritte zum Zoomen irgendwie
    einbinden könnte.

    Mit Autoit dachte ich mir, könnte man dies realisieren.

    Grobe Zielrichtung meinerseits wäre:
    Wenn man eine Taste am Joystick betätigt (z.B. den Trigger), kann man während dessen die Kamera bewegen.
    Wenn die Z-Achse (das drehen des Griffes) das Zoomen übernehmen könnte wäre perfekt.
    Alternativ/dazu wird jedes Icon des Einblendmenüs auf eine Joysticktaste gebunden.

    Hätte ich Zeit, würde ich es selber angehen, da das nicht der Fall ist, bitte ich hier um Hilfe.

    Einer fairen Entlohnung steht nichts im Wege. Gerne auch von jemanden, der
    mir nachher eine ordentliche Rechnung mit ausgw. Mwst schreiben kann.

    Die vorhandene Hardware wäre ein Windows7 64Bit Rechner mit einem Logitech Extreme 3D Pro.

    Wer interessiert ist daran, bitte PN und/oder hier was hinterlassen zum kontaktieren.

    Wenn jemand eine ganz andere Lösung für mein Problem hat, her damit! Wirst belohnt ;)

    Einen herzlichen Gruß und gute Nacht

  • Angenommen, man schafft es mit Autoit, das wenn eine Taste oder Mausrad gedrückt wird, der Courser an den unteren Bildrand auf die Stelle zum Zoomen fährt und drückt, wäre es ein guter Anfang.

    Die Joystick-to-Mouse Software kann das ja eventuell so nachstellen dann?

    Sonst wäre es ja immerhin schon ein riesen Gewinn für den Benutzer, dass er nur eine Maustaste drücken müsste, anstatt suchen.
    Man könnte auch einen Trackball oder eine Air-Mouse benutzen.

    Das Autoit Script müsste nur nach jeder Zoom Aktion wieder den Mauszeiger zurück ins Bild setzten, um die Bewegungsfunktion wieder "im Griff" zu haben.

    Habe hier das gefunden:
    [ offen ] Send Keys ohne Pause ?

    Das müsste für die Zoomfunktion genau so funktionieren.
    Und wenn es am Ende mit Tastatur gesteuert würde, wäre auch akzeptabel... Welche Taste am Ende die Aktion auslöst, wäre doch eh zweitrangig?

    Gruß,

  • Mit Hooks kannst du sehr gut abfragen, ob eine Taste gedrückt, bzw. losgelassen wurde (ebenso maustasten, sowie mausrad):

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <array.au3>

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

    Global Const $MOUSE_MOVE_EVENT = 0x200 ;512 (WM_MOUSEMOVE) ; ==> Mouse moving.
    Global Const $MOUSE_PRIMARYDOWN_EVENT = 0x201 ;513 (WM_LBUTTONDOWN) ; ==> Primary mouse button down.
    Global Const $MOUSE_PRIMARYUP_EVENT = 0x202 ;514 (WM_LBUTTONUP) ; ==> Primary mouse button up.
    Global Const $MOUSE_PRIMARYDBLCLK_EVENT = 0x203 ;515 (WM_LBUTTONDBLCLK) ; ==> Primary mouse button double click.
    Global Const $MOUSE_SECONDARYDOWN_EVENT = 0x204 ;516 (WM_RBUTTONDOWN) ; ==> Secondary mouse button down.
    Global Const $MOUSE_SECONDARYUP_EVENT = 0x205 ;517 (WM_RBUTTONUP) ; ==> Secondary mouse button up.
    Global Const $MOUSE_SECONDARYDBLCLK_EVENT = 0x206 ;518 (WM_RBUTTONDBLCLK) ; ==> Secondary mouse button double click.
    Global Const $MOUSE_WHEELDOWN_EVENT = 0x207 ;519 (WM_MBUTTONDOWN) ; ==> Wheel mouse button pressed down.
    Global Const $MOUSE_WHEELUP_EVENT = 0x208 ;520 (WM_MBUTTONUP) ; ==> Wheel mouse button up.
    Global Const $MOUSE_WHEELDBLCLK_EVENT = 0x209 ;521 (WM_MBUTTONDBLCLK) ; ==> Wheel mouse button double click.
    Global Const $MOUSE_WHEELSCROLL_EVENT = 0x20A ;522 (WM_MOUSEWHEEL) ; ==> Wheel mouse scroll.
    Global Const $MOUSE_WHEELSCROLLDOWN_EVENT = 0x20A + 8 ;530 (WM_MOUSEWHEEL + 8) ; ==> Wheel mouse scroll Down.
    Global Const $MOUSE_WHEELSCROLLUP_EVENT = 0x20A + 16 ;538 (WM_MOUSEWHEEL + 16) ; ==> Wheel mouse scroll Up.
    Global Const $MOUSE_XBUTTONDOWN_EVENT = 0x20B ;523 (WM_XBUTTONDOWN) ; ==> Side mouse button down (usually navigating next/back buttons).
    Global Const $MOUSE_XBUTTONUP_EVENT = 0x20C ;524 (WM_XBUTTONUP) ; ==> Side mouse button up.
    Global Const $MOUSE_XBUTTONDBLCLK_EVENT = 0x20D ;525 (WM_XBUTTONDBLCLK) ; ==> Side mouse button double click.
    global $KeyCodes[205][2]=[[0,"0"] _
    ,[1,"1"] _
    ,[2,"2"] _
    ,[3,"3"] _
    ,[4,"4"] _
    ,[5,"5"] _
    ,[6,"6"] _
    ,[7,"7"] _
    ,[8,"[DELETE]"] _
    ,[9,"[TAB]"] _
    ,[10,""] _
    ,[11,""] _
    ,[12,""] _
    ,[13,"[ENTER]"] _
    ,[14,""] _
    ,[15,""] _
    ,[16,""] _
    ,[17,""] _
    ,[18,""] _
    ,[19,"[PAUSE]"] _
    ,[20,"[CAPSLOG]"] _
    ,[21,""] _
    ,[22,""] _
    ,[23,""] _
    ,[24,""] _
    ,[25,""] _
    ,[26,""] _
    ,[27,"[ESC]"] _
    ,[28,""] _
    ,[29,""] _
    ,[30,""] _
    ,[31,""] _
    ,[32,"[LEERTASTE]"] _
    ,[33,"[BILDHOCH]"] _
    ,[34,"[BILDRUNTER]"] _
    ,[35,"[ENDE]"] _
    ,[36,"[POS1]"] _
    ,[37,"[PFEILLINKS]"] _
    ,[38,"[PFEILHOCH]"] _
    ,[39,"[PFEILRECHTS]"] _
    ,[40,"[PFEILRUNTER]"] _
    ,[41,""] _
    ,[42,""] _
    ,[43,""] _
    ,[44,"[DRUCK]"] _
    ,[45,"[EINFÜGEN]"] _
    ,[46,"[ENTFERNEN]"] _
    ,[47,""] _
    ,[48,"0"] _
    ,[49,"1"] _
    ,[50,"2"] _
    ,[51,"3"] _
    ,[52,"4"] _
    ,[53,"5"] _
    ,[54,"6"] _
    ,[55,"7"] _
    ,[56,"8"] _
    ,[57,"9"] _
    ,[58,""] _
    ,[59,""] _
    ,[60,""] _
    ,[61,""] _
    ,[62,""] _
    ,[63,""] _
    ,[64,""] _
    ,[65,"a"] _
    ,[66,"b"] _
    ,[67,"c"] _
    ,[68,"d"] _
    ,[69,"e"] _
    ,[70,"f"] _
    ,[71,"g"] _
    ,[72,"h"] _
    ,[73,"i"] _
    ,[74,"j"] _
    ,[75,"k"] _
    ,[76,"l"] _
    ,[77,"m"] _
    ,[78,"n"] _
    ,[79,"o"] _
    ,[80,"p"] _
    ,[81,"q"] _
    ,[82,"r"] _
    ,[83,"s"] _
    ,[84,"t"] _
    ,[85,"u"] _
    ,[86,"v"] _
    ,[87,"w"] _
    ,[88,"x"] _
    ,[89,"y"] _
    ,[90,"z"] _
    ,[91,"[WINDOWS]"] _
    ,[92,""] _
    ,[93,"[LISTE]"] _
    ,[94,""] _
    ,[95,""] _
    ,[96,"[Block 0]"] _
    ,[97,"[Block 1]"] _
    ,[98,"[Block 2]"] _
    ,[99,"[Block 3]"] _
    ,[100,"[Block 4]"] _
    ,[101,"[Block 5]"] _
    ,[102,"[Block 6]"] _
    ,[103,"[Block 7]"] _
    ,[104,"[Block 8]"] _
    ,[105,"[Block 9]"] _
    ,[106,"[Block *]"] _
    ,[107,"[Block +]"] _
    ,[108,""] _
    ,[109,"[Block -]"] _
    ,[110,"[Block ,]"] _
    ,[111,"[Block /]"] _
    ,[112,"[F1]"] _
    ,[113,"[F2]"] _
    ,[114,"[F3]"] _
    ,[115,"[F4]"] _
    ,[116,"[F5]"] _
    ,[117,"[F6]"] _
    ,[118,"[F7]"] _
    ,[119,"[F8]"] _
    ,[120,"[F9]"] _
    ,[121,"[F10]"] _
    ,[122,"[F11]"] _
    ,[123,"[F12]"] _
    ,[124,""] _
    ,[125,""] _
    ,[126,""] _
    ,[127,""] _
    ,[128,""] _
    ,[129,""] _
    ,[130,""] _
    ,[131,""] _
    ,[132,""] _
    ,[133,""] _
    ,[134,""] _
    ,[135,""] _
    ,[136,""] _
    ,[137,""] _
    ,[138,""] _
    ,[139,""] _
    ,[140,""] _
    ,[141,""] _
    ,[142,""] _
    ,[143,""] _
    ,[144,"[NUM]"] _
    ,[145,"[ROLLEN]"] _
    ,[146,""] _
    ,[147,""] _
    ,[148,""] _
    ,[149,""] _
    ,[150,""] _
    ,[151,""] _
    ,[152,""] _
    ,[153,""] _
    ,[154,""] _
    ,[155,""] _
    ,[156,""] _
    ,[157,""] _
    ,[158,""] _
    ,[159,""] _
    ,[160,"[SHIFTLINKS]"] _
    ,[161,"[SHIFTRECHTS]"] _
    ,[162,"[STRG]"] _
    ,[163,""] _
    ,[164,"[ALT]"] _
    ,[165,"[ALT GR]"] _
    ,[166,""] _
    ,[167,""] _
    ,[168,""] _
    ,[169,""] _
    ,[170,""] _
    ,[171,""] _
    ,[172,""] _
    ,[173,""] _
    ,[174,""] _
    ,[175,""] _
    ,[176,""] _
    ,[177,""] _
    ,[178,""] _
    ,[179,""] _
    ,[180,""] _
    ,[181,""] _
    ,[182,""] _
    ,[183,""] _
    ,[184,""] _
    ,[185,""] _
    ,[186,"ü"] _
    ,[187,"+"] _
    ,[188,","] _
    ,[189,"-"] _
    ,[190,"."] _
    ,[191,"#"] _
    ,[192,"ö"] _
    ,[193,""] _
    ,[194,""] _
    ,[195,""] _
    ,[196,""] _
    ,[197,""] _
    ,[198,""] _
    ,[199,""] _
    ,[220,"^"] _
    ,[219,"ß"] _
    ,[221,"´"] _
    ,[222,"ä"] _
    ,[226,"<"] _
    ]

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

    $hmod = _WinAPI_GetModuleHandle(0)
    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
    $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
    $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)

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

    While sleep(100)
    WEnd

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

    Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
    $r=DllStructGetData($tKEYHOOKS, "vkCode")
    Local $flags = DllStructGetData($tKEYHOOKS, "flags")
    Switch $flags
    Case $LLKHF_ALTDOWN
    ConsoleWrite("[Alt]"&@crlf)
    EndSwitch
    keyDown($r)
    endif
    If $wParam = $WM_KEYUP Then
    $r=DllStructGetData($tKEYHOOKS, "vkCode")
    Local $flags = DllStructGetData($tKEYHOOKS, "flags")
    Switch $flags
    Case $LLKHF_ALTDOWN
    ConsoleWrite("([Alt] UP)"&@crlf)
    EndSwitch
    keyUP($r)
    endif
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
    Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing
    EndIf
    Local $iEvent = _WinAPI_LoWord($wParam)
    Local $iRet
    Local $iBlockDefProc_Ret
    Local $iWScrollDirection = 0
    Switch $iEvent
    Case $MOUSE_PRIMARYDOWN_EVENT
    ConsoleWrite("Linke Maustaste gedrückt"&@crlf)
    Case $MOUSE_PRIMARYUP_EVENT
    ConsoleWrite("Linke Maustaste losgelassen"&@crlf)
    Case $MOUSE_PRIMARYDBLCLK_EVENT
    ConsoleWrite("Linke Maustaste doppelklick"&@crlf)
    Case $MOUSE_SECONDARYDOWN_EVENT
    ConsoleWrite("Rechte Maustaste gedrückt"&@crlf)
    Case $MOUSE_SECONDARYUP_EVENT
    ConsoleWrite("Rechte Maustaste losgelassen"&@crlf)
    Case $MOUSE_SECONDARYDBLCLK_EVENT
    ConsoleWrite("Rechte Maustaste doppelklick"&@crlf)
    Case $MOUSE_WHEELDOWN_EVENT
    ConsoleWrite("Mausrad gedrückt"&@crlf)
    Case $MOUSE_WHEELUP_EVENT
    ConsoleWrite("Mausrad losgelassen"&@crlf)
    Case $MOUSE_WHEELSCROLLDOWN_EVENT
    ConsoleWrite("Mausrad nach unten gedreht"&@crlf)
    Case $MOUSE_WHEELSCROLLUP_EVENT
    ConsoleWrite("Mausrad nach oben gedreht"&@crlf)
    Case $MOUSE_XBUTTONDOWN_EVENT
    ConsoleWrite("Andere Maustaste gedrückt"&@crlf)
    Case $MOUSE_XBUTTONUP_EVENT
    ConsoleWrite("Andere Maustaste losgelassen"&@crlf)
    Case $MOUSE_XBUTTONDBLCLK_EVENT
    ConsoleWrite("Andere Maustaste doppelklick"&@crlf)
    EndSwitch
    Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam) ;Continue processing
    EndFunc ;==>_KeyProc

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

    Func keyDown($keycode)
    $x=_ArraySearch($KeyCodes,$keycode,0,0,0,0,1,0)
    if $x=-1 then
    ConsoleWrite("(KEY:"&$keycode&")"&@crlf)
    else
    if $KeyCodes[$x][1]="" then
    ConsoleWrite("(KEY:"&$x&")"&@crlf)
    else
    ConsoleWrite($KeyCodes[$x][1]&@crlf)
    endif
    endif
    EndFunc

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

    Func keyUp($keycode)
    $x=_ArraySearch($KeyCodes,$keycode,0,0,0,0,1,0)
    if $x=-1 then
    ConsoleWrite("(KEY UP:"&$keycode&")"&@crlf)
    else
    if $KeyCodes[$x][1]="" then
    ConsoleWrite("(KEY UP:"&$x&")"&@crlf)
    else
    ConsoleWrite("("&$KeyCodes[$x][1]&" UP)"&@crlf)
    endif
    endif
    EndFunc

    [/autoit]

    In Zeile 275-300 kannst du auf Maustasten-Events reagieren.
    In Zeile 305-316 auf (Tastatur-)taste gedrückt. ╔>Hier wird momentan geprüft, ob der Code im Array zugeordnet werden kann.
    In Zeile 318-329 auf (Tastatur-)taste losgelassen. ╚>
    (Wenn ja wird der jeweilige String statt des Codes angezeigt)


    In Bereich 318-329 könntest du zum Beispiel die Maus nach unten rechts bewegen lassen, wenn $keycode=65, also, wenn a losgelassen wird.
    (Am Anfang des Scriptes steht, welche codes die tasten von Maus und Tastatur symolisieren)