[offen] Aufruf externer Datei aus LUA - CMD-Window unterdrücken

    • Offizieller Beitrag

    Hi,
    da die Funktionsliste in SciTE ( aufrufbar mit Alt+L ) nur in einem recht mickrigen Control angezeigt wird, habe ich hier mal eine Variante erstellt, in der die Anzeige in einem AutoIt-Listview erfolgt und somit von jedem nach eigenem Geschmack angepaßt werden kann.
    Vorgehensweise ist identisch, wie bei der "Standard-Liste": HotKey (in meinem Bsp. Ctrl+Alt+L) aufrufen, Funktionsliste erscheint, Doppelklick auf Funktion, Cursor springt zur Zeile mit der Funktion und wird in den sichtbaren Bereich des Editors gescrollt.
    Da ich zur Zeit mich etwas mehr mit LUA beschäftige, war dies eine schöne Übung zum Datenaustausch zwischen LUA- und AutoIt-Skript. Gelöst über eine temporäre Datei.
    Funktionell ist alles prima und tut, was es soll.
    ABER, Ein Schönheitsfehler besteht: Ich rufe aus dem LUA-Skript heraus mittels "os.execute(Dateipfad)" das kompilierte AutoIt-Skript zur Anzeige der Funktionen auf. Jedoch wird mir dabei im Hintergrund das Windows-CMD Fenster angezeigt. Bisher habe ich noch keine Möglichkeit gefunden dieses zu unterdrücken.

    ShowFuncList.au3
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    ; Anzeige der Funktionsliste
    ; wird übergeben bei "Strg+Alt+L" im Skript

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

    If Not $CmdLine[0] Then Exit
    Global $sPathDataExchange = $CmdLine[1]
    Local $aFuncs = StringSplit(FileRead($sPathDataExchange), @CR)

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

    Local $gui = GUICreate('Funktionsliste', 500, 450, -1, -1, $WS_SIZEBOX, $WS_EX_TOPMOST)
    Local $ListView = GUICtrlCreateListView('Funktionsliste', 5, 5, 490, 415, BitOR($LVS_NOCOLUMNHEADER,$LVS_SHOWSELALWAYS))
    For $i = 1 To $aFuncs[0]
    GUICtrlCreateListViewItem($aFuncs[$i], $ListView)
    Next
    Local $hListView = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, $LVSCW_AUTOSIZE_USEHEADER)

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

    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _DblClck($iIndex)
    Local $sFunc = _GUICtrlListView_GetItemText($hListView, $iIndex)
    If $sFunc = '' Then Return
    Local $fh = FileOpen($sPathDataExchange, 2)
    FileWrite($fh, '$' & $sFunc)
    FileClose($fh)
    Exit
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Return _DblClck(DllStructGetData($tInfo, "Index"))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
    MyFunctionsList.lua !geändert!


    Wer es selbst testen möchte, wie folgt vorgehen:
    - ShowFuncList.au3 kompilieren und im Pfad @UserProfileDir als "..\USERNAME\ShowFuncList.exe" abspeichern "C:\ShowFuncList.exe" abspeichern
    - "MyFunctionsList.lua" im Pfad "..\SciTE\LUA" abspeichern
    - im selben Pfad die Datei "SciTEStartup.lua" öffnen
    - im Block: "-- Load all the Lua files" eine neue Zeile anfügen: 'LoadLuaFile("MyFunctionsList.lua")'
    - nun noch den Aufruf per HotKey festlegen in "SciTEUser.properties"

    Code
    # END => DO NOT CHANGE ANYTHING BEFORE THIS LINE  #-#-#-#-#-#
    #41 Zeige Funktionsliste
    command.name.41.$(au3)=MyFunctionsList
    command.41.$(au3)=MyFunctionsList
    command.subsystem.41.$(au3)=3
    command.mode.41.$(au3)=savebefore:no
    command.shortcut.41.$(au3)=Ctrl+Alt+L

    Nach Neustart von SciTE steht die Funktion zur Verfügung.
    Falls jemand eine Idee hat, wie ich das CMD-Window unterdrücken kann (oder eine andere Form des Aufrufs aus LUA kennt) - bitte melden. ;)

    Edit:
    Ich kann es zwar ausblenden - aber es popt vorher kurz auf, sieht nicht sehr gelungen aus.
    Folgender Code am Skriptanfang setzt das Fenster 'HIDE':

    [autoit]

    If Not WinExists("[Class:ConsoleWindowClass]") Then
    WinWait("[Class:ConsoleWindowClass]")
    EndIf
    Local $hWndCMD = WinGetHandle("[Class:ConsoleWindowClass]")
    WinSetState($hWndCMD, '', @SW_HIDE)

    [/autoit]
  • Hi,
    Win XP32, es erscheint folgende Fehlermeldung sowohl beim Drücken von ALT+L (die alte Funktionsliste) als auch bei CTRL+ALT+L

    Zitat

    C:\Programme\AutoIt3\SciTE\Lua\AutoItTools.lua:97: bad argument #1 to 'gmatch' (string expected, got nil)
    >Lua: error occurred while processing command


    Was hat das Script bei CTRL+ALT+L in der "normalen" functionslist zu suchen, oder verwendest du diese mit?

    Wenn ich den Shortcut auf CTRL+ALT+O setze, dann bekomme ich als Fehlermeldung

    Zitat

    > Lua: error checking global scope for command

    • Offizieller Beitrag

    Hi,
    also wenn du einen Error bekommst, der auf "AutoItTools.lua" verweist, muß die aufgerufene Funktion auch innerhalb dieser Tools deklariert sein.
    Die Standardfunktion heisst: "FunctionsList()" - dieser Name ist also vergeben, deshalb hatte ich meine Funktion auch "MyFunctionsList()" benannt. Kann es sein, dass du stattdessen den Namen "FunctionsList()" verwendet hast?
    Bei mir funktioniert es sowohl unter Win7 als auch im Virtuell_XP.
    Allerdings habe ich eine Änderung vorgenommen:
    - Pfad für die "ShowFuncList.exe" und die Austauschdatei ist jetzt hardcodiert "C:\", da unter XP Leerzeichen im Userpfad sind und dann der Aufruf der Funktion in die Hose geht (Es ist m.M. nach eine große Unzulänglichkeit im Betiebssystem, wenn Leerzeichen in Ordner- u. Dateinamen zulässig sind.)
    Die Änderungen füge ich im Startpost ein.