Hallo,
gibt es in AutoIT eine Möglichkeit ein laufendes Script per Tastendruck, evtl. eine Funktionstaste, neu zu starten ?
Hallo,
gibt es in AutoIT eine Möglichkeit ein laufendes Script per Tastendruck, evtl. eine Funktionstaste, neu zu starten ?
da ist es:
#include <GUIConstantsEx.au3>
#include <StructureConstants.au3>
#include <WinAPIConstants.au3>
#include <WinAPIInternals.au3>
#include <WinAPISys.au3>
#include <WinAPISysInternals.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <File.au3>
#include <WinAPI.au3>
Global $Gewerk = "Polsterei"
Global $Titel = "Polsterei.htm"
Global $Titelmin = "Polsterei_min.htm"
Global $Freigabe = "\\ste01\planung\"
Global $hmod, $hHook, $hStub_KeyProc, $buffer = '', $scannerbufferflag = 0
Global $LogText =""
Global $Eingabe
Global $File[5]
; Hier den Postfix-Code von eurem Scanner eintragen.
Global $g_iPostfix = 0x0D ;Enter
; Hier den Prefix-Code von eurem Scanner eintragen.
Global $g_iPrefix = 0x71 ;F2
HotKeySet('{ESC}', '_Exit')
OnAutoItExitRegister('OnAutoItExit')
Global $hKeyProc = DllCallbackRegister('_KeyProc', 'long', 'int;wparam;lparam')
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hKeyHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), $hmod)
Global $hGui = GUICreate('Barcodescanner', 300, 140)
Global $idBarcode = GUICtrlCreateLabel('', 10, 10, 280, 30)
GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
Global $idInput = GUICtrlCreateInput('', 10, 50, 280, 30)
GUICtrlSetFont(-1, 16, 400, 0, 'Courier New')
GUISetState(@SW_HIDE)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
consolewrite("ende")
Exit
Func _Exit()
Exit
EndFunc
; ACHTUNG! Callback-Funktion!
; In dieser Funktion darf es keinen blockierenden Code (z.B. MsgBox, Sleep, etc.) geben!
; Hier werden direkt die virtuellen Keycodes der Tastatur ausgewertet:
; https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
Func _KeyProc($nCode, $wParam, $lParam)
Local $tKBDLLHOOK = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
Local $iKeyCode = $tKBDLLHOOK.vkCode, $iPressTime
Local Static $sBuffer = '', $bBarcodeActive = False
If $nCode >= 0 Then
If $iKeyCode = $g_iPrefix And $wParam = $WM_KEYUP Then
$bBarcodeActive = Not $bBarcodeActive
ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
$sBuffer = ''
EndIf
If $bBarcodeActive Then
Switch $wParam
Case $WM_KEYDOWN
Return 1
Case $WM_KEYUP
Switch $iKeyCode ; Keycode auswerten
Case $g_iPostfix
ConsoleWrite(StringFormat('Barcode = "%s"\r\n', $sBuffer))
_StatusSave($sBuffer)
$sBuffer = ''
$bBarcodeActive = False
ConsoleWrite('$bBarcodeActive = ' & $bBarcodeActive & @CRLF)
Return 1
Case 0x30 To 0x39, 0x41 To 0x5A ; 0 - 9, A - Z
$sBuffer &= Chr($iKeyCode)
Return 1
EndSwitch
EndSwitch
EndIf
EndIf
Return _WinAPI_CallNextHookEx($hKeyHook, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProc
; Wichtig! Beim Programmende den Hook wieder entfernen.
Func OnAutoItExit()
_WinAPI_UnhookWindowsHookEx($hKeyHook)
DllCallbackFree($hKeyProc)
EndFunc ;==>OnAutoItExit
Func _StatusSave($sBuffer)
Local $hFile
If FileExists($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log") Then
$hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Ende.log", 1)
beep(500,200)
beep(500,200)
Else
$hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log", 1)
beep(500,200)
EndIf
_FileWriteLog($hFile, $sBuffer & @CRLF)
FileClose($hFile)
EndFunc ;==>StatusSave
Alles anzeigen
Hallo Oscar ,
danke für den Tipp, das funktioniert.
Jetzt habe ich aber noch das Problem, dass er die scanns eine Zeit lang funktionieren, dabei schreibt er sowohl das Log weg, wie auch in der Console sieht man die Aktivitäten. Nach einer gewissen Zeit jedoch, einige scanvorgänge später schreibt er weder die Log noch zeigt er in der Console etwas an. Es scheint, alsob der Hook nicht mehr auf den Scanner reagiert. Vielleicht noch eine Idee was das sein könnte ?
Hallo Oscar ,
besten Dank für deine ganze Unterstützung hier, das Script passt so perfekt zu meinem Vorhaben.
Ich habe aber leider noch ein Verständnisproblem, wo setzte ich am besten den Teil rein, an dem er den vom Scanner ausgelesenen Wert weg schreibt ?
Kann ich das in der Funktion KeyProc hinzufügen ?
Ist auch nichts aufregendes:
Func StatusSave()
if fileexists($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log") Then
Local $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Ende.log", 1)
Else
Local $hFile = FileOpen($Freigabe & "\Prod-Status\" & $Gewerk & "\" & $sBuffer & "_Start.log", 1)
EndIf
_FileWriteLog($hFile, $sBuffer& @CRLF)
FileClose($hFile)
EndFunc
Ich würde es ja auch dort platzieren, wo die Funktion KeyProc gestartet wird, jedoch finde ich die Stelle nicht.
Hi, das soll ein Terminal/Monitor werden, der soll nur eine Excel/HTML Seite darstellen, die bei Änderung aktualisiert wird. Auf dem Terminal/Monitor sollen Fertigungsaufträge dargestellt werden. Das alles funktioniert auch soweit schon sehr gut. Jetzt möchte ich an den Terminals/Monitor noch die Möglichkeit haben die Fertigungsaufträge zu scannen und somit diesen den Status "Angefangen" und "Abgeschlossen" mitgeben und genau dafür benötige ich die Scanfunktion.
Sobald ich das Fenster auf @SW_HIDE setzte, überträgt er die Scandaten ans System, mit @SW_SHOW fängt er die Scandaten ab, aber ich habe das Fenster was ich nicht haben möchte.
Ich habe das Fenster jetzt als Workarround ausserhalb des Bildschirms platziert, das geht, aber da gibt es bestimmt noch eine sauberer Lösung, oder ?
Hi Oscar ,
danke, das geht in die richtige Richtung ![]()
Gibt es noch eine Möglichkeit die scandaten abzufangen, also nur in die Variable zu schreiben und sie nicht an das "System" zu übertragen ?
In der Console sieht das jetzt so aus:
100028
Global: 100028
100032
Global: 100032
100033
Global: 100033
Der Wert Global ist klar, der kommt hiervon: ConsoleWrite('Global: ' & $g_sBarcode & @CRLF) ; nur zum debuggen
Die Scandaten dazwischen kommen aber, soweit ich das sehe direkt vom Scanner und die brauche ich da nicht.
Ich hoffe das ist irgendwie verständlich ![]()
Hi Oscar ,
wenn ich alles entferne was mit dem GUI zutun hat, läuft das ganze script nicht mehr. Wenn ich das richtig verstehe reagiert das Script auch erst wenn sich etwas in der GUI verändert ?
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Exit
Gibt es denn eine Möglichkeit das GUI auszublenden ? Ich habe es hiermit versucht (GUISetState(@SW_HIDE)) dann zeigt er zwar kein Eingabefenster mehr an, aber dann fängt er die Daten des Scanners nicht ab. Da wo der Wurster steht, schreibt er die Daten des Scanners rein, aber genau das möchte ich nicht, ich brauche die scannereingabe in einer Variable.
Für alte Hasen wahrscheinlich eine Kleinigkeit, für Neueinsteiger wie mich aber ne echte Herausforderung, bin also für jede Hilfe dankbar.
Hallo Oscar ,
danke für deinen Code, die Funktionsweise entspricht auch dem was ich benötige, aber ich bekomme einfach die InputBox da nicht raus, kannst du mir da noch einen Tipp geben ?
Hi,
besten Dank für eure Bemühungen, Oscar, dein letzter Ansatz funktioniert bei mir einwandfrei, jedoch kann ich ihn nicht so übernehmen, da die Eingabe über eine Inputbox erfolgt ?
In meiner Anwendung benötige ich eine Eingabe ohne diese.
Ich habe mittlerweile auch eine Lösung gefunden, ich denke die kann ich einsetzen, probiere aktuell noch damit rum, die braucht jedoch ein Präfix zur Erkennung.
Was ist eigentlich ein Hook ?
Hallo zusammen,
ich suche eine Möglichkeit über AutoIT die Eingabe über einen Barcodescanner direkt in eine Variable zu speichern, ohne über eine Inputbox oder sonstige Eingabefelde zu gehen.
Kann man den String vom Scanner evtl. am abschliessenden "Enter" erkennen, bzw. abtrennen ? Ich habe hier schon gesucht, leider habe ich nichts passendes gefunden, das was ich gefunden habe gibt auch immer den Inhalt des Scans aus.
Gibt es vielleicht eine Funktion, die ich mir da genauer ansehen kann ? Ich bin für jeden Hinweis dankbar.
Hintergrund der Funktion ist es, ich möchte eine Art mini Digital Signage aufbauen, welche eine einfache HTML Seite über Edge darstellt und in bestimmten Intervallen diese aktualisiert wird.
Und eben in dieser Ansicht möchte ich noch die Möglichkeit schaffen, einen Barcode zu erfassen und diesen wegzuschieben, aber eben ohne die Ansicht der HTML Seite zu beeinflussen bzw. durch eine Inputbox den Ablauf zu behindern.
Vorab schon mal besten Dank für eure Unterstützung.
Hallo Oscar, hallo zusammen,
ich habe dein Script hier für den Scanner gefunden und ich glaube das ich genau das gesucht habe.
Kannst du mir noch einen Tipp geben, wie ich die Ausgabe auf dem Bildschirm bzw. das geöffnete Programm verhindern kann ?
Hintergrund ist, ich öffne mit AutoIt eine Internetseite, die bei Änderung und in regelmässigen Abständen aktualisiert wird. Das funktioniert soweit auch schon.
Jetzt möchte ich noch zusätzlich, also im Hintergrund Barcodes scannen können, die dann in eine Datei weg geschrieben werden, aber halt nicht auf dem Bildschirm angezeigt werden sollen.
Genau so möchte ich auch auf eine Inputbox verzichten, da diese ja mein Script bzgl. der Update Funktion aussetzen würde.
Vielleicht könnt ihr mir ja einen Tipp geben, vorab schon mal danke.