• Offizieller Beitrag

    Na gut, es scheint die Zeit für virtuelle Tastaturen zu sein. :D
    Hab mir gedacht, dass das doch auch kürzer gehen muss. Hier also meine Version:

    Screenshot:
    autoit.de/wcf/attachment/6608/

    Script:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)
    Opt('TrayMenuMode', 1)
    Global $bShift = False, $bLock = False, $bOld = False, $ahKeys[57], $wHWND, $cHWND
    Global $sTitle = 'Mouse-Keyboard v1.3 by Oscar (http://www.autoit.de)'
    Global $aKeys[57][6] = [ _
    ['^', '°', 010, 060, 32, 32],['1', '!', 044, 060, 32, 32],['2', '"', 078, 060, 32, 32],['3', '§', 112, 060, 32, 32], _
    ['4', '$', 146, 060, 32, 32],['5', '%', 180, 060, 32, 32],['6', '&&', 214, 060, 32, 32],['7', '/', 248, 060, 32, 32], _
    ['8', '(', 282, 060, 32, 32],['9', ')', 316, 060, 32, 32],['0', '=', 350, 060, 32, 32],['ß', '?', 384, 060, 32, 32], _
    ['´', '`', 418, 060, 32, 32],['<-', '<-', 452, 060, 66, 32], _
    ['q', 'Q', 010, 100, 32, 32],['w', 'W', 044, 100, 32, 32],['e', 'E', 078, 100, 32, 32],['r', 'R', 112, 100, 32, 32], _
    ['t', 'T', 146, 100, 32, 32],['z', 'Z', 180, 100, 32, 32],['u', 'U', 214, 100, 32, 32],['i', 'I', 248, 100, 32, 32], _
    ['o', 'O', 282, 100, 32, 32],['p', 'P', 316, 100, 32, 32],['ü', 'Ü', 350, 100, 32, 32],['*', '+', 384, 100, 32, 32], _
    ['@', '|', 418, 100, 32, 32],['[', '\', 452, 100, 32, 32],[']', '~', 486, 100, 32, 32], _
    ['a', 'A', 010, 140, 32, 32],['s', 'S', 044, 140, 32, 32],['d', 'D', 078, 140, 32, 32],['f', 'F', 112, 140, 32, 32], _
    ['g', 'G', 146, 140, 32, 32],['h', 'H', 180, 140, 32, 32],['j', 'J', 214, 140, 32, 32],['k', 'K', 248, 140, 32, 32], _
    ['l', 'L', 282, 140, 32, 32],['ö', 'Ö', 316, 140, 32, 32],['ä', 'Ä', 350, 140, 32, 32],['#', "'", 384, 140, 32, 32], _
    ['LOCK', 'LOCK', 418, 140, 100, 32], _
    ['y', 'Y', 010, 180, 32, 32],['x', 'X', 044, 180, 32, 32],['c', 'C', 078, 180, 32, 32],['v', 'V', 112, 180, 32, 32], _
    ['b', 'B', 146, 180, 32, 32],['n', 'N', 180, 180, 32, 32],['m', 'M', 214, 180, 32, 32],[',', ';', 248, 180, 32, 32], _
    ['.', ':', 282, 180, 32, 32],['-', '_', 316, 180, 32, 32],['<', '>', 350, 180, 32, 32],['€', 'µ', 384, 180, 32, 32], _
    ['SHIFT', 'SHIFT', 418, 180, 100, 32], _
    ['SPACE', 'SPACE', 10, 220, 406, 32],['ENTER', 'ENTER', 418, 220, 100, 32] _
    ]
    $hGui = GUICreate($sTitle, 530, 280)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetIcon('shell32.dll', -174, $hGui)
    GUISetBkColor(0xCCCCCC)
    GUICtrlCreateLabel('Send input to (Window-Title):', 10, 10, 500, 16)
    $hSendWindow = GUICtrlCreateLabel('', 10, 30, 508, 18, $SS_SUNKEN)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')

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

    For $i = 0 To UBound($aKeys) - 1
    $ahKeys[$i] = GUICtrlCreateButton($aKeys[$i][0], $aKeys[$i][2], $aKeys[$i][3], $aKeys[$i][4], $aKeys[$i][5])
    GUICtrlSetFont(-1, 14, 400, 0, 'Courier New')
    GUICtrlSetOnEvent(-1, '_Key')
    Next
    $hStatus = GUICtrlCreateLabel(' Status: NORMAL', -2, 264, 534, 16, Default, $WS_EX_STATICEDGE)
    GUICtrlSetBkColor(-1, 0xBBBBBB)
    TraySetIcon('shell32.dll', -174)
    TraySetClick(16)
    TrayCreateItem($sTitle)
    TrayItemSetState(-1, $TRAY_DISABLE)
    TrayCreateItem('')
    TrayCreateItem('Exit')
    TrayItemSetOnEvent(-1, '_End')

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

    GUISetState()
    WinSetOnTop($hGui, '', 1)

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

    While True
    If $wHWND <> WinGetHandle('') And WinGetHandle('') <> $hGui Then
    $wHWND = WinGetHandle('')
    $cHWND = ControlGetFocus($wHWND)
    GUICtrlSetData($hSendWindow, WinGetTitle($wHWND))
    Else
    Sleep(100)
    EndIf
    WEnd

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

    Func _End()
    Exit
    EndFunc ;==>_End

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

    Func _Key()
    Local $sKey = GUICtrlRead(@GUI_CtrlId)
    Switch $sKey
    Case '<-'
    ControlSend($wHWND, '', $cHWND, '{BACKSPACE}')
    Case 'LOCK'
    $bShift = False
    $bLock = True
    GUICtrlSetData($hStatus, ' Status: CAPS LOCK')
    _Shift()
    Case 'SHIFT'
    GUICtrlSetData($hStatus, ' Status: SHIFT')
    _Shift()
    $bLock = False
    Case 'SPACE'
    ControlSend($wHWND, '', $cHWND, '{SPACE}')
    Case 'ENTER'
    ControlSend($wHWND, '', $cHWND, '{ENTER}')
    Case '&&'
    ControlSend($wHWND, '', $cHWND, '{&}')
    If $bShift And Not $bLock Then _Shift()
    Case Else
    ControlSend($wHWND, '', $cHWND, $sKey)
    If $bShift And Not $bLock Then _Shift()
    EndSwitch
    EndFunc ;==>_Key

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

    Func _Shift()
    $bShift = Not $bShift
    If Not $bShift Then GUICtrlSetData($hStatus, ' Status: NORMAL')
    If $bShift = $bOld Then Return
    $bOld = $bShift
    For $i = 0 To UBound($aKeys) - 1
    GUICtrlSetData($ahKeys[$i], $aKeys[$i][$bShift])
    Next
    EndFunc ;==>_Shift

    [/autoit]

    Edit: Version 1.3
    Jetzt neue/geänderte Tasten:
    [Del] löscht das Eingabefeld, [<-] löscht das letzte Zeichen, [SHIFT] aktiviert Großschreibung für die nächste Taste und mit [LOCK] wird die Großschreibung dauerhaft aktiviert.

    • Offizieller Beitrag

    Sehr schönes Script. :thumbup:
    Eweiterungsvorschlag: Bau eine Option ein, die mit Send arbeitet. Dann kann man es auch gleich als Tastaturersatz benutzen.
    Würde ich sogar selbst machen, aber irgendwie weiß ich nicht wie ich es anstellen soll. Wenn deine Tastatur aktiv ist, würde ja Send an das Tastaturprogramm selbst senden.

    Irgendwie beißt sich dann aber der Hund selbst in den Schwanz. Gibt es ein aktives nichtaktives Fenster?

    • Offizieller Beitrag

    Raupi : Habe versucht eine Eingabefenster-Erkennung zu machen, aber das war nicht sehr erfolgreich. Ich denke, es wird bei der ClipPut-Version bleiben müssen. :S

    Es gibt jetzt aber eine zusätzliche [LOCK]-Taste, mit der man dauerhaft auf Großschreibung umschalten kann. Die [SHIFT]-Taste hat nun nämlich die Funktion, um nur die nächste Taste in Groß zu schreiben und schaltet danach automatisch wieder auf Kleinschreibung.
    Ich finde das so praktischer.

  • Eweiterungsvorschlag: Bau eine Option ein, die mit Send arbeitet. Dann kann man es auch gleich als Tastaturersatz benutzen.
    Würde ich sogar selbst machen, aber irgendwie weiß ich nicht wie ich es anstellen soll. Wenn deine Tastatur aktiv ist, würde ja Send an das Tastaturprogramm selbst senden.

    Hi,
    Damit der Tastenanschlag nicht an das Programm selbst gesendet wird kann man ControlSend benutzen.
    Wenn z.B. die Taste t gedrückt werden soll:

    [autoit]

    ControlSend("","","","t")

    [/autoit]


    Jetzt wird immer an das aktive Control gesendet und der Anschlag wird von deinem Programm nicht erkannt.


  • Hi,
    Damit der Tastenanschlag nicht an das Programm selbst gesendet wird kann man ControlSend benutzen.
    Wenn z.B. die Taste t gedrückt werden soll:

    [autoit]


    ControlSend("","","","t")

    [/autoit]


    Jetzt wird immer an das aktive Control gesendet und der Anschlag wird von deinem Programm nicht erkannt.

    Klappt aber auch nicht ganz, da beim drücken des Buttons das MausKeyboard das aktive Fenster, und der gedrückte Button die aktive Control ist.
    Ich hab mir mal die Dreistigkeit erlaubt, diese Idde allerdings aufzugreifen.

    guckstu hier

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)
    Global $bShift = False, $bLock = False, $bOld = False, $ahKeys[57], $wHWND, $cHWND
    Global $aKeys[57][6] = [ _
    ['^', '°', 010, 060, 32, 32],['1', '!', 044, 060, 32, 32],['2', '"', 078, 060, 32, 32],['3', '§', 112, 060, 32, 32], _
    ['4', '$', 146, 060, 32, 32],['5', '%', 180, 060, 32, 32],['6', '&&', 214, 060, 32, 32],['7', '/', 248, 060, 32, 32], _
    ['8', '(', 282, 060, 32, 32],['9', ')', 316, 060, 32, 32],['0', '=', 350, 060, 32, 32],['ß', '?', 384, 060, 32, 32], _
    ['´', '`', 418, 060, 32, 32],['<-', 'Del', 452, 060, 66, 32], _
    ['q', 'Q', 010, 100, 32, 32],['w', 'W', 044, 100, 32, 32],['e', 'E', 078, 100, 32, 32],['r', 'R', 112, 100, 32, 32], _
    ['t', 'T', 146, 100, 32, 32],['z', 'Z', 180, 100, 32, 32],['u', 'U', 214, 100, 32, 32],['i', 'I', 248, 100, 32, 32], _
    ['o', 'O', 282, 100, 32, 32],['p', 'P', 316, 100, 32, 32],['ü', 'Ü', 350, 100, 32, 32],['*', '+', 384, 100, 32, 32], _
    ['@', '|', 418, 100, 32, 32],['[', '\', 452, 100, 32, 32],[']', '~', 486, 100, 32, 32], _
    ['a', 'A', 010, 140, 32, 32],['s', 'S', 044, 140, 32, 32],['d', 'D', 078, 140, 32, 32],['f', 'F', 112, 140, 32, 32], _
    ['g', 'G', 146, 140, 32, 32],['h', 'H', 180, 140, 32, 32],['j', 'J', 214, 140, 32, 32],['k', 'K', 248, 140, 32, 32], _
    ['l', 'L', 282, 140, 32, 32],['ö', 'Ö', 316, 140, 32, 32],['ä', 'Ä', 350, 140, 32, 32],['#', "'", 384, 140, 32, 32], _
    ['LOCK', 'LOCK', 418, 140, 100, 32], _
    ['y', 'Y', 010, 180, 32, 32],['x', 'X', 044, 180, 32, 32],['c', 'C', 078, 180, 32, 32],['v', 'V', 112, 180, 32, 32], _
    ['b', 'B', 146, 180, 32, 32],['n', 'N', 180, 180, 32, 32],['m', 'M', 214, 180, 32, 32],[',', ';', 248, 180, 32, 32], _
    ['.', ':', 282, 180, 32, 32],['-', '_', 316, 180, 32, 32],['<', '>', 350, 180, 32, 32],['€', 'µ', 384, 180, 32, 32], _
    ['SHIFT', 'SHIFT', 418, 180, 100, 32], _
    ['SPACE', 'SPACE', 10, 220, 406, 32],['ENTER', 'ENTER', 418, 220, 100, 32] _
    ]
    $hGui = GUICreate('Mouse-Keyboard v1.1 by Oscar (http://www.autoit.de)', 530, 280)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetIcon('shell32.dll', -174, $hGui)
    GUISetBkColor(0xCCCCCC)
    $hInput = GUICtrlCreateLabel('Mouse-Keyboard v1.1 by Oscar (http://www.autoit.de)', 10, 10, 508, 28)
    GUICtrlSetFont(-1, 14.5, 400, 0, 'Courier New')
    For $i = 0 To UBound($aKeys) - 1
    $ahKeys[$i] = GUICtrlCreateButton($aKeys[$i][0], $aKeys[$i][2], $aKeys[$i][3], $aKeys[$i][4], $aKeys[$i][5])
    GUICtrlSetFont(-1, 14, 400, 0, 'Courier New')
    GUICtrlSetOnEvent(-1, '_Key')
    Next
    $hStatus = GUICtrlCreateLabel(' Status: NORMAL', -2, 264, 534, 16, Default, $WS_EX_STATICEDGE)
    GUICtrlSetBkColor(-1, 0xBBBBBB)
    GUISetState()
    WinSetOnTop($hGui, '', 1)

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

    While True
    If $wHWND <> WinGetHandle("") AND WinGetHandle("") <> $hGui Then
    $wHWND = WinGetHandle("")
    $cHWND = ControlGetFocus($wHWND)
    Else
    Sleep(100)
    EndIf
    WEnd

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

    Func _End()
    Exit
    EndFunc

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

    Func _Key()
    Local $sKey = GUICtrlRead(@GUI_CtrlId)
    Switch $sKey
    Case '<-'
    ControlSend($wHWND,"",$cHWND,"{BACKSPACE}")
    Case 'Del'
    GUICtrlSetData($hInput, '')
    Case 'LOCK'
    $bShift = False
    $bLock = True
    GUICtrlSetData($hStatus, ' Status: CAPS LOCK')
    _Shift()
    Case 'SHIFT'
    GUICtrlSetData($hStatus, ' Status: SHIFT')
    _Shift()
    $bLock = False
    Case 'SPACE'
    ControlSend($wHWND,"",$cHWND,"{SPACE}")
    Case 'ENTER'
    ControlSend($wHWND,"",$cHWND,"{ENTER}")
    Case '&&'
    ControlSend($wHWND,"",$cHWND,'{&}')
    If $bShift And Not $bLock Then _Shift()
    Case Else
    ControlSend($wHWND,"",$cHWND,$sKey)
    If $bShift And Not $bLock Then _Shift()
    EndSwitch

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

    EndFunc

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

    Func _Shift()
    $bShift = Not $bShift
    If Not $bShift Then GUICtrlSetData($hStatus, ' Status: NORMAL')
    If $bShift = $bOld Then Return
    $bOld = $bShift
    For $i = 0 To UBound($aKeys) - 1
    GUICtrlSetData($ahKeys[$i], $aKeys[$i][$bShift])
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Mir ist noch eine andere Möglichkeit eingefallen. Die ist so einfach, das ich erst gar nicht drauf gekommen bin.
    - Man startet mein Programm (neue Version siehe Post #1). Das packt sich in den Tray und aktiviert einen Hotkey [Alt] + [e].
    - Dann holt man das Programm in den Vordergrund, wohin die Eingabe gesendet werden soll (z.B. Notepad).
    - Danach öffnet man mein Eingabefenster per Hotkey. Dabei wird vor dem öffnen das aktive Fenster sowie das aktive Control-Element abgefragt. Und an das wird dann die Eingabe gesendet.

    eukalyptus: Das ist dann aber nicht in AutoIt. ;)

  • wofür eine Bildschirmtastatur mit Hotkey starten wenn man doch die Bildschirmtastatur als Tastaturersatz nutzen möchte? Wenn mir zb mal wieder die Tasse Kaffe auf der Tastatur ausläuft und ich keine Ersatztastatur vorrätig habe muss ich nen Tag lang mit Bildschirmtastatur arbeite. Da hilft mir dann der Hotkey den ich benutzen muss auch nicht viel ;)

    Warum dann nicht einfach so wie in dem Skript in Post 7? Die windows Bildschirmtastatur funktioniert ja nach dem selben Prinzip