Wurden die Funktionen einer UDF mit dem selben Präfix auf mehrere Dateien aufgeteilt, so müssen diesese durch
Hier noch einer...
Wurden die Funktionen einer UDF mit dem selben Präfix auf mehrere Dateien aufgeteilt, so müssen diesese durch
Hier noch einer...
Allerdings müssen die \ im Pfad gedoppelt werden - so wie es im alten Thread stand.
Kommt ganz darauf an, in welchem Kontext du dich befindest... in einer CMD.exe oder für Run(...) ist es z.B. nicht nötig.
Aufgefallen ist mir jedoch, dass es mit meiner RAMDISK nicht immer funktioniert:
;-- TIME_STAMP 2021-11-23 22:32:01 v 0.1
; m: ist eine RAMDISK (ImDisk)
; f: ist eine interne Festplatte mit Daten
Local $sCMD = '"c:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" "-loadsession:m:\SciTE_2.session"'
;~ Local $iPID = Run($sCMD, @UserProfileDir, @SW_HIDE) ; Funktioniert!
;~ Local $iPID = Run($sCMD, @LocalAppDataDir, @SW_HIDE) ; Funktioniert!
;~ Local $iPID = Run($sCMD, 'm:\', @SW_HIDE) ; Funktioniert!
;~ Local $iPID = Run($sCMD, 'f:\Eigene Dateien\', @SW_HIDE) ; Funktioniert!
;~ DirCreate('f:\Test')
;~ Local $iPID = Run($sCMD, 'f:\Test\', @SW_HIDE) ; Funktioniert!
;~ Local $iPID = Run($sCMD, '', @SW_HIDE) ; Funktioniert nicht!
;~ Local $iPID = Run($sCMD, 'm:', @SW_HIDE) ; Funktioniert nicht!
;~ Local $iPID = Run($sCMD, 'm:\Temp\', @SW_HIDE) ; Funktioniert nicht!
;~ Local $iPID = Run($sCMD, @WorkingDir, @SW_HIDE) ; Funktioniert nicht!
DirCreate('m:\Test')
Local $iPID = Run($sCMD, 'm:\Test\', @SW_HIDE) ; Funktioniert nicht!
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : @WorkingDir = ' & @WorkingDir & @CRLF)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iPID = ' & $iPID & ' $sCMD = ' & $sCMD & @CRLF)
Alles anzeigen
@@ Debug(20) : @WorkingDir = M:\AutoIt
@@ Debug(21) : $iPID = 18952 $sCMD = "c:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" "-loadsession:m:\SciTE_2.session"
So sieht es bei mir aus:
Benchmark Result Zeilen 82/84 auskommentiert
_01 12364ns +32.1% ->| int32 bitand & bitshift
_02 10781ns +15.2% ->| int32 bitand & bitshift (array als int)
_2A 10293ns +10.0% ->| int32 bitand & bitshift (ternärer operator umgestellt, array als int)
_2B 9357ns +0.0% ->| int32 bitshift & bitand (array als int)
_2C 10195ns +9.0% ->| int32 bitshift & bitand (array als int)
_2D 9586ns +2.4% ->| int32 bitshift & bitand (array als int)
_03 14952ns +59.8% ->| int32 stringoperationen (array als int)
_04 11800ns +26.1% ->| int32 stringoperation für Alpha, rest bitoperationen (array als int)
_05 11331ns +21.1% ->| int32 struct (byte[4] access index, array als int)
_5A 13092ns +39.9% ->| int32 struct (byte;byte;byte;byte access element, array als int)
_5B 10924ns +16.7% ->| int32 struct (byte[4] access index via name, array als int)
Benchmark Result Zeilen 82/84 nicht auskommentiert
_01 12184ns +30.6% ->| int32 bitand & bitshift
_02 10858ns +16.4% ->| int32 bitand & bitshift (array als int)
_2A 10207ns +9.4% ->| int32 bitand & bitshift (ternärer operator umgestellt, array als int)
_2B 9602ns +2.9% ->| int32 bitshift & bitand (array als int)
_2C 9332ns +0.0% ->| int32 bitshift & bitand (array als int)
_2D 10208ns +9.4% ->| int32 bitshift & bitand (array als int)
_03 15597ns +67.1% ->| int32 stringoperationen (array als int)
_04 11523ns +23.5% ->| int32 stringoperation für Alpha, rest bitoperationen (array als int)
_05 11763ns +26.1% ->| int32 struct (byte[4] access index, array als int)
_5A 12719ns +36.3% ->| int32 struct (byte;byte;byte;byte access element, array als int)
_5B 11102ns +19.0% ->| int32 struct (byte[4] access index via name, array als int)
So muss das aussehen:
"c:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" -loadsession:C:\WebDriver\Entwicklung\BLPMenü.session
" sind nur nötig, wenn der Pfad Leerzeichen beinhaltet. Sind im Pfad zur Session Leerzeichen enthalten, muss er mitsamt -loadsession: in " gesetzt werden - und muss direkt hinter (also ohne Leerzeichen!) -loadsession: stehen.
Bsp.:
"c:\Program Files (x86)\AutoIt3\SciTE\SciTE.exe" "-loadsession:C:\Web Driver\Entwicklung\BLPMenü.session"
Teste mal:
;~ #include <MsgBoxConstants.au3>
;~ #include <Array.au3>
#include <File.au3>
#include <WinAPIConv.au3>
Global $g_iOutEncoding = Int(StringRegExpReplace(ControlGetText(ControlGetHandle(WinGetHandle(@ScriptFullPath), '', '[CLASS:msctls_statusbar32; INSTANCE:1]'), '', ''), '.+Encoding \(IN/OUT\): (\d+)/(\d+).+', '\2'))
Liste()
Func Liste()
Local $path1 = "G:\Videos\Filme\Neu"
Local $path2 = "G:\Videos\Filme\Gesehen"
Local $path3 = "G:\Videos\Filme" & "\Liste.txt"
Local $aFileListNeu = _FileListToArray($path1, "*", $FLTA_FILES)
Local $aFileListGesehen = _FileListToArray($path2, "*", $FLTA_FILES)
_ArrayConcatenate($aFileListNeu, $aFileListGesehen, 1) ; Counter von $aFileListGesehen nicht mit kopieren
_ArrayDelete($aFileListNeu, 0) ; Counter von $aFileListNeu löschen
_ArraySort($aFileListNeu)
For $i = 0 To UBound($aFileListNeu) -1 Step 1
$aFileListNeu[$i] = _WinAPI_WideCharToMultiByte(StringRegExpReplace($aFileListNeu[$i], '(.+)\..*$', '\1'), @Compiled ? 1 : $g_iOutEncoding, True, False) ; Extension entfernen und Umlaute korrigieren
Next
_FileWriteFromArray($path3, $aFileListNeu, 0) ; Von 0 an, weil wir ja alle Counter entfernt haben!
_ArrayDisplay($aFileListNeu, "Filmübersicht")
EndFunc
Alles anzeigen
;-- TIME_STAMP 2021-11-13 22:20:09
;~ #include <AutoItConstants.au3>
#include <WindowsConstants.au3>
;~ #include <Array.au3>
#include <GuiMenu.au3>
#include <Process.au3>
#include <SendMessage.au3>
#include <WinAPISysWin.au3>
_GUICtrlMenu_GetContextMenu_Example()
Func _GUICtrlMenu_GetContextMenu_Example()
Local $hDesktop = _WinAPI_GetDesktopWindow()
Local $hWnd, $hPopUp, $hActive, $hParent, $hRoot, $hRootOwner, $sMenuText
$hActive = WinGetHandle('[ACTIVE]')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hActive --> " & $hActive & @CRLF & @CRLF & 'Open a popup menu...' & @CRLF & @CRLF)
Do
Sleep(250)
$hWnd = WinGetHandle('[CLASS:#32768]')
Until $hWnd
$hParent = _WinAPI_GetAncestor($hWnd, $GA_PARENT)
$hRoot = _WinAPI_GetAncestor($hWnd, $GA_ROOT)
$hRootOwner = _WinAPI_GetAncestor($hWnd, $GA_ROOTOWNER)
Local $iPID = WinGetProcess($hWnd)
$sProcessName = _ProcessGetName($iPID)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iPID --> " & $iPID & @CRLF)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $sProcessName --> " & $sProcessName & @CRLF)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hWnd --> " & $hWnd & @TAB & 'Title = "' & WinGetTitle($hWnd) & '"' & @CRLF)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hParent --> " & $hParent & @TAB & 'Title = "' & WinGetTitle($hParent) & '"' & @CRLF)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hRoot --> " & $hRoot & @TAB & 'Title = "' & WinGetTitle($hRoot) & '"' & @CRLF)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hRootOwner --> " & $hRootOwner & @TAB & 'Title = "' & WinGetTitle($hRootOwner) & '"' & @CRLF)
$hPopUp = _SendMessage($hWnd, $MN_GETHMENU)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hPopUp --> " & $hPopUp & @CRLF)
Local $sItemText, $aSplit, $aRect, $iItemCount = _GUICtrlMenu_GetItemCount($hPopUp), $hSub, $iSubItemCount, $sSubItemText, $iIndent = 16
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iItemCount --> " & $iItemCount & @CRLF)
For $iItem = 0 To $iItemCount - 1 Step 1
$sItemText = _GUICtrlMenu_GetItemText($hPopUp, $iItem)
If $sItemText = '' Then $sItemText = '--------------------------------' ; Separator line
$aSplit = StringSplit($sItemText & @TAB, @TAB, $STR_NOCOUNT)
$aRect = _GUICtrlMenu_GetItemRect($hDesktop, $hPopUp, $iItem); Mit $hPopUp funktioniert es!
ConsoleWrite(StringFormat('> $sItemText #%02i: %-48s %s $aRect[%5i,%5i,%5i,%5i]\n', $iItem, $aSplit[0], $aSplit[1], $aRect[0], $aRect[1], $aRect[2], $aRect[3]))
$hSub = _GUICtrlMenu_GetItemSubMenu($hPopUp, $iItem)
If $hSub Then
$iSubItemCount = _GUICtrlMenu_GetItemCount($hSub)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hSub --> " & $hSub & @CRLF)
For $iSubItem = 0 To $iSubItemCount - 1 Step 1
$sSubItemText = _GUICtrlMenu_GetItemText($hSub, $iSubItem)
$aSplit = StringSplit($sSubItemText & @TAB, @TAB, $STR_NOCOUNT)
$aRect = _GUICtrlMenu_GetItemRect($hDesktop, $hSub, $iSubItem) ; Mit $hSub funktioniert es nicht!
ConsoleWrite(StringFormat('+ %'&$iIndent&'s$sSubItemText #%02i: %-48s %s $aRect[%5i,%5i,%5i,%5i]\n', '', $iSubItem, $aSplit[0], $aSplit[1], $aRect[0], $aRect[1], $aRect[2], $aRect[3]))
Next
EndIf
Next
EndFunc ;==>_GUICtrlMenu_GetContextMenu_Example
Alles anzeigen
Schau mal, ob dir das hier weiterhilft:
Das Ermitteln des Handles für $hWnd, $hMain, $hDatei und die Keys bei ControlSend musst du natürlich entsprechend anpassen!
;-- TIME_STAMP 2021-11-10 21:53:36 v 0.1
#include <AutoItConstants.au3>
#include <GuiMenu.au3>
Opt('SendKeyDelay', 10) ; Mit ControlSend kommt der Text oft fehlerhaft an, wenn KeyDelay auf 5 (Default) steht! Bei mir funktioniert es mit 10 sehr gut.
;~ Opt('SendKeyDownDelay', 20)
Example_GUICtrlMenu_GetMenu()
Opt('SendKeyDelay', 5)
;~ Opt('SendKeyDownDelay', 5)
Func Example_GUICtrlMenu_GetMenu()
Local $hWnd, $hMain, $hDatei
; Open Notepad
Local $iPID = Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]")
$hWnd = WinGetHandle("[CLASS:Notepad]")
$hMain = _GUICtrlMenu_GetMenu($hWnd)
Local $hDatei = _GUICtrlMenu_GetItemSubMenu($hMain, 0) ; Handle für das Menu "Datei"
Writeln("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hDatei --> " & $hDatei & @LF)
Local $sItemText, $aSplit, $iItemCount = _GUICtrlMenu_GetItemCount($hDatei)
For $iItem = 0 To $iItemCount - 1 Step 1
$sItemText = _GUICtrlMenu_GetItemText($hDatei, $iItem)
If $sItemText = '' Then $sItemText = '--------------------------------' ; Separator line
$aSplit = StringSplit($sItemText & @TAB, @TAB, $STR_NOCOUNT)
Writeln(StringFormat('> $sItemText #%02i: %-32s %s\n', $iItem, $aSplit[0], $aSplit[1]))
Next
Writeln(@CRLF)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Namen der SubMenues, deren AcceleratorKeys und den dazu passenden ControlSend ausgeben.
Local $sMenuText, $iMenuCount = _GUICtrlMenu_GetItemCount($hMain), $iKeyPos, $sAccelatorKey, $sSend
Writeln("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iMenuCount --> " & $iMenuCount & @LF)
For $iMenu = 0 To $iMenuCount - 1 Step 1 ; Datei | Bearbeiten | Format | Ansicht | Hilfe
$sMenuText = _GUICtrlMenu_GetItemText($hMain, $iMenu)
$iKeyPos = StringInStr(StringReplace($sMenuText, '&&', '##'), '&') + 1
$sAccelatorKey = $iKeyPos ? StringMid($sMenuText, $iKeyPos, 1) : '' ; Das ist das Zeichen hinter dem "&" - falls vorhanden!
$sSend = $sAccelatorKey ? "ControlSend($hWnd, '', '', '" & '!' & $sAccelatorKey & "', $SEND_DEFAULT)" : ''
Writeln(StringFormat('> $sMenuText #%02i: %-32s Alt+%-32s %s\n', $iMenu, $sMenuText, $sAccelatorKey, $sSend))
Next
Writeln(@CRLF)
; Get/Set File menu help context ID
Writeln("> File (Datei) help context ID: " & _GUICtrlMenu_GetMenuContextHelpID($hDatei) & '\n')
_GUICtrlMenu_SetMenuContextHelpID($hDatei, 1234)
Writeln("> File (Datei) help context ID: " & _GUICtrlMenu_GetMenuContextHelpID($hDatei) & '\n')
; Möchten Sie die Änderungen an Unbekannt speichern?
; Wenn kein HotKey vorhanden ist.
;~ ControlSend($hWnd, "", "", StringFormat('!du{Enter}'), $SEND_DEFAULT) ; Send AcceleratorKey (Alt+du{Enter}) "Dateimenu öffnen"
; Wenn ein HotKey vorhanden ist.
ControlSend($hWnd, "", "", StringFormat('^+s{Enter}'), $SEND_DEFAULT) ; Send HotKey (Strg+Shift+s{Enter}) "Dateimenu öffnen"
MsgBox(64 + 262144, @ScriptName, 'Press Ok for Exit')
ProcessClose($iPID)
EndFunc ;==>Example_GUICtrlMenu_GetMenu
; Write a line of text to Notepad
Func Writeln($sText)
ControlSend("[CLASS:Notepad]", "", "Edit1", StringFormat($sText), $SEND_RAW)
EndFunc ;==>Writeln
Alles anzeigen
Nach längerem Suchen habe ich, sehr versteckt, die Option gefunden, das Formular im Browser zu editieren.
Ja, klasse... das ist doch mal eine feine Lösung, oder?!
Auf was könnte man da ausweichen und wo finde ich Information über die Pinbelegung?
Als Alternative fällt mir dies ein:
Die Dinger haben programmierbare Ein- und Ausgänge (Relays)... habe selbst zwei ETH484 - 4 x 16A ethernet relays (bei amazon.de gekauft) und kenne mich recht gut damit aus.
Habe mir dafür ein AutoIt-Script zum Steuern/Abfragen (via TCP/IP) geschrieben. Für USB und WIFI will ich mir auch noch holen... evtl. bringt mir das ja der Weihnachtsmann.
Pinbelegung für LPT findest du z.B. hier: https://de.wikipedia.org/wiki/IEEE_1284
Wird das aufpoppende WhatsApp-Fenster letztendlich aus Zeile 3 oder Zeile 4 heraus gestartet?
Das ConsoleWrite von BananaJoe ist auf jeden Fall schon mal eine gute Idee...
Damit bekommst du aber keine Info darüber, wem das Fenster gehört oder von wem der Proccess gestart wurde ... dafür muss man schon etwas mehr tun.
Hier mal ein kleines Bsp., wie ich mir solche Infos anzeigen lasse, wenn ich ein neues Script schreibe:
;-- TIME_STAMP 2021-11-08 20:33:14
; Nur nötig, wenn du Infos über fremde Processe haben willst (s. _GetProcessUser). Achtung: Hinter #RequireAdmin darf kein Kommentar stehen!!!
;~ #RequireAdmin
#include <Array.au3>
#include <WinAPIHObj.au3>
#include <WinAPIProc.au3>
_GetProcInfo_Example()
Func _GetProcInfo_Example()
Local $sNewFile = @ScriptDir & '\NeueTextdatei.txt'
If Not FileExists($sNewFile) Then FileWrite($sNewFile, 'Testdatei, die mit Notepad geöffnet werden soll...')
Local $iPID = Run('notepad.exe' & ' ' & $sNewFile)
_PrintVar('$iPID', $iPID)
Local $sProcessFileName = _WinAPI_GetProcessFileName($iPID)
_PrintVar('$sProcessFileName', $sProcessFileName)
Local $sCommandLine = _WinAPI_GetProcessCommandLine($iPID)
_PrintVar('$sCommandLine', $sCommandLine)
Local $aProcessUser = _GetProcessUser($iPID)
_PrintVar('$aProcessUser', _ArrayToString($aProcessUser, '|', -1, -1, @CRLF & '>' & @TAB & @TAB))
; ProcessWindows anzeigen
Local $bVisible = True, $aProcessWindows = _WinAPI_EnumProcessWindows($iPID, $bVisible) ; Handle|ClassName, ...
ReDim $aProcessWindows[$aProcessWindows[0][0] + 1][3] ; Spalte für Title hinzufügen
For $i = 1 To $aProcessWindows[0][0] Step 1
$aProcessWindows[$i][2] = WinGetTitle($aProcessWindows[$i][0])
Next
_PrintVar('$aProcessWindows', _ArrayToString($aProcessWindows, '|', -1, -1, @CRLF & StringFormat('>%'&StringLen(@ScriptLineNumber) + 14&'s', ''))) ; Handle|ClassName|Title
ConsoleWrite(@CRLF)
; Von welchem Proccess wurde Notepad gestartet?
Local $iParentPID = _WinAPI_GetParentProcess($iPID)
_PrintVar('$iParentPID', $iParentPID)
Local $sParentProcessFileName = _WinAPI_GetProcessFileName($iParentPID)
_PrintVar('$sParentProcessFileName', $sParentProcessFileName)
Local $sParentCommandLine = _WinAPI_GetProcessCommandLine($iParentPID)
_PrintVar('$sParentCommandLine', $sParentCommandLine)
ConsoleWrite(@CRLF)
; Hier noch eine Ausgabe mit _PrintVar, bei der ein Fehler aufgetreten ist.
Local $sShowExecuteError = Execute('#Alexa, go get some beer!')
_PrintVar('$sShowExecuteError', $sShowExecuteError)
; @@ Debug(45) : $sShowExecuteError ==>>
; Wenn du einen Doppelklick auf so ^^ eine Zeile in dem Ausgabefenster machst, setzt SciTE das Caret in diese Zeile... hier wäre es die Zeile 45!!!
; Aufräumen
MsgBox(64, @ScriptName, 'Klick auf OK, um Notepad zu beenden und die Textdatei wieder zu löschen.')
ProcessClose($iPID)
FileDelete($sNewFile)
EndFunc ;==>_GetProcInfo_Example
Func _GetProcessUser($iPID)
If IsAdmin() Then
; Enable "SeDebugPrivilege" privilege for obtain full access rights to another processes
Local $aAdjust, $hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)
EndIf
; Retrieve the user (account) name, domain (computer) name for the specified process
Local $aProcessUser = _WinAPI_GetProcessUser($iPID)
If IsAdmin() Then
; Enable SeDebugPrivilege privilege by default
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)
EndIf
Return $aProcessUser
EndFunc ;==>_GetProcessUser
Func _PrintVar($sVarName, $sValue, $iScriptLineNumber = @ScriptLineNumber, $iError = @error, $iExtended = @extended)
If $iError Or $iExtended Then
;~ ConsoleWrite(StringFormat('@@ Debug(%i) : \t %-32s ==>> %s\n! $iError = %i \t $iExtended = %i\n', $iScriptLineNumber, $sVarName, $sValue, $iError, $iExtended))
ConsoleWrite(StringFormat('@@ Debug(%i) : \t %-32s ==>> %s\n-%' & StringLen($iScriptLineNumber) + 14&'s$iError = %i \t $iExtended = %i\n', $iScriptLineNumber, $sVarName, $sValue, '', $iError, $iExtended))
Else
ConsoleWrite(StringFormat('@@ Debug(%i) : \t %-32s ==>> %s\n', $iScriptLineNumber, $sVarName, $sValue))
EndIf
EndFunc ;==>_PrintVar
Alles anzeigen
So, hier noch ein Bsp. - mehr kann ich momentan nicht für dich tun...
;-- TIME_STAMP 2021-11-07 00:20:21 v 0.1
#include <AutoItConstants.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
_Example()
; Das Setzen des Fokus mit ControlFocus() ist nur nötig, wenn bei ControlSend kein Control-Handle, sondern eine Control-ID angegeben wird.
Func _Example()
Local $hActive = WinGetHandle('[ACTIVE]'), $hFocus = ControlGetHandle($hActive, '', '[CLASSNN:' & ControlGetFocus($hActive) & ']')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hActive --> " & $hActive & @LF) ; SciTE
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hFocus --> " & $hFocus & @LF) ; Source-Pane
Local $iPID = ProcessExists('notepad.exe')
If Not $iPID Then $iPID = Run('notepad.exe')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iPID --> " & $iPID & @LF)
Local $hNotepad = WinWait('[REGEXPTITLE:.*Editor;CLASS:Notepad]', '', 3)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hNotepad --> " & $hNotepad & @LF)
If Not IsHWnd($hNotepad) Then Return SetError(1, 0, False)
WinActivate($hNotepad)
Local $hMainMenu = _GUICtrlMenu_GetMenu($hNotepad)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hMainMenu --> " & $hMainMenu & @LF)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Alle Items eines SubMenues anhand des Index ausgeben - hier nehmen wir auch wieder das Menu "Datei", das hat den Index 0.
; Hier werden in der letzten Spalte evtl. HotKeys angezeigt, die mit der Aktion (Funktion) des MenuItems verknüpft sind. Via HotKey kannst du diese Aktion ausführen, ohne das Menu anzeigen zu lassen.
;
; Bsp.: > $sItemText #01: &Neues Fenster Strg+Umschalt+N
;~ ControlSend($hNotepad, '', '', '^+N', $SEND_DEFAULT) ; Send "Strg+Umschalt+N" - Neues Notepad-Fenster öffnen
;
; Gäbe es für dieses MenuItem kein Hotkey, ginge es so:
;~ ControlSend($hNotepad, '', '', '!D', $SEND_DEFAULT) ; Menü "Datei" anzeigen (Alt+D)
;~ Sleep(1000) ; Warten, bis Menu geöffnet wurde.
;~ ControlSend($hNotepad, '', '', '+N{Enter}', $SEND_DEFAULT) ; Send "Umschalt+N+Enter" - Neues Notepad-Fenster öffnen
Local $hFile = _GUICtrlMenu_GetItemSubMenu($hMainMenu, 0) ; Handle für das Menu "Datei"
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hFile --> " & $hFile & @LF)
Local $sItemText, $aSplit, $iItemCount = _GUICtrlMenu_GetItemCount($hFile)
For $iItem = 0 To $iItemCount -1 Step 1
$sItemText = _GUICtrlMenu_GetItemText($hFile, $iItem)
If $sItemText = '' Then $sItemText = '--------------------------------' ; Separator line
$aSplit = StringSplit($sItemText & @TAB, @TAB, $STR_NOCOUNT)
ConsoleWrite(StringFormat('> $sItemText #%02i: %-32s %s\n', $iItem, $aSplit[0], $aSplit[1]))
Next
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConsoleWrite(@CRLF)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Namen der SubMenues, deren AcceleratorKeys und den dazu passenden ControlSend ausgeben.
Local $sMenuText, $iMenuCount = _GUICtrlMenu_GetItemCount($hMainMenu), $iKeyPos, $sAccelatorKey, $sSend
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iMenuCount --> " & $iMenuCount & @LF)
For $iMenu = 0 To $iMenuCount -1 Step 1 ; Datei | Bearbeiten | Format | Ansicht | Hilfe
$sMenuText = _GUICtrlMenu_GetItemText($hMainMenu, $iMenu)
$iKeyPos = StringInStr(StringReplace($sMenuText , '&&', '##'), '&') +1
$sAccelatorKey = $iKeyPos ? StringMid($sMenuText, $iKeyPos, 1) : '' ; Das ist das Zeichen hinter dem "&" - falls vorhanden!
$sSend = $sAccelatorKey ? "ControlSend($hNotepad, '', '', '" & '!' & $sAccelatorKey & "', $SEND_DEFAULT)" : ''
ConsoleWrite(StringFormat('> $sMenuText #%02i: %-32s Alt+%-32s %s\n', $iMenu, $sMenuText, $sAccelatorKey, $sSend))
Next
; Hier ein Bsp.:
ControlSend($hNotepad, '', '', '!D', $SEND_DEFAULT) ; Menü "Datei" anzeigen (Alt+D)
Sleep(2000) ; ...und 2 sec warten.
ControlSend($hNotepad, '', '', '{ESC 2}', $SEND_DEFAULT) ; Menü "Datei" wieder verstecken (ESC+ESC)
; Durch das ControlSend (an Notepad!) wird (nicht immer) nach Beenden des Scripts auch in SciTE der Fokus auf das Menü "Datei" gesetzt... das ist definitiv ein Bug!
ControlFocus($hActive, '', $hFocus) ; Hiermit korrigieren wird diesen Bug - erst ControlFocus, dann WinActivate... andersrum geht es nicht!
WinActivate($hActive)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConsoleWrite('- Done...' & @CRLF)
; Aufräumen
ProcessClose($iPID) ; Das mit Run gestartete Notepad beenden.
EndFunc ;==>_Example
Alles anzeigen
Nicht wirklich ein Fehler, aber unschön...
Bsp.: ControlSend
Hier werden auf der linken Seite zwei Suchergebnisse angezeigt... was dann ergo bedeutet, dass es für diese Funktion eine deutsche Übersetzung gibt.
In der Spalte Titel hast du es richtig gemacht... da steht einmal Funktion (deutsch) und Function (englisch)... aber unter der Spalte Position steht bei beiden "AutoIt-Hilfe".
Korrekt wäre, wenn für die englische Version dann auch der englische Text "AutoIt-Help" stehen würde.
Dies gilt für alle Übersetzungen in der deutschen Hilfe.
Wenn ich allerdings die Befehle in meinem Programm ausprobiere, dann passiert leider nichts.
Dein Script aus deinem ersten Post kann so nicht funktionieren... daran ist so ziemlich alles falsch... oder macht keinen Sinn.
Es gibt z. B. keine Möglichkeit mit STRG irgendwas zu steuern, ich müsste wissen, wie ich die Alt-Taste abfrage, bzw. ansteuere.
Für ControlSend schaust du in der Hilfe bei Send... da stehen die Sachen, die du dafür wissen musst.
! = Alt-Taste
+ = Shift-Taste
^ = Strg bzw. Ctrl-Taste
# = Windows-Taste
Wenn ich morgen dazu komme, schreibe ich dir noch ein Bsp. dafür, wie du ein Menü "ausliest" und den zu dem jeweiligen Menüpunkt passenden ControlSend erstellen kannst.
Wo ist das Script eigentlich her? Gibts dafür eine ausführliche Dokumentation?
Das ist von mir... hatte ich extra für dich geschrieben... dafür brauche ich 10-15 Minuten... dein Problem ist, dass dir die nötigen Grundlagen fehlen, um mit AutoIt zu arbeiten und du deshalb gar nicht weißt, wo, wie und was du suchen musst. Sowas kommt nicht über Nacht...
Übrigens... es gibt auch noch eine andere sehr empfehlenswerte Option... so mache ich es... mit DisplayFusion kannst du endlos viele Einstellungen für Multi-Monitor-Betrieb sehr komfortabel automatisieren - z.B. wo welches Fenster in welcher Größe auf welchem Monitor angezeigt werden soll... und noch 100.000 Sachen mehr. Einziger Nachteil ist, es kostet was... aber das Tool ist jeden Cent wert und für mich mittlerweile quasi unverzichtbar!
Hier mal ein kleines Bsp. mit notepad.exe:
#include <AutoItConstants.au3>
_Example()
Func _Example()
Local $iPID = ProcessExists('notepad.exe')
If Not $iPID Then $iPID = Run('notepad.exe')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iPID --> " & $iPID & @LF)
Local $hNotepad = WinWait('[REGEXPTITLE:.*Editor;CLASS:Notepad]', '', 3)
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hNotepad --> " & $hNotepad & @LF)
If IsHWnd($hNotepad) Then
WinActivate($hNotepad)
; Text einfügen
ControlSend($hNotepad, '', '', 'Mit AutoIt Text in andere Programme einfügen ist ganz einfach...' & @LF, $SEND_RAW)
ControlSend($hNotepad, '', '', 'aber möglichst mit ControlSend anstelle Send...' & @CRLF, $SEND_RAW)
ControlSend($hNotepad, '', '', 'Und jetzt speichern wir das in eine Datei.' & @LF, $SEND_RAW)
ControlSend($hNotepad, '', '', '^+s', $SEND_DEFAULT) ; Send STRG+SHIFT+S - Menü "Datei" -->> "Speichern unter..."
Local $hSaveAs = WinWait('[TITLE:Speichern unter; CLASS:#32770]', '', 3) ; 3 Sekunden auf Fenster warten.
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hSaveAs --> " & $hSaveAs & @LF)
Sleep(1000) ; Etwas warten, bis das Fenster komplett aufgebaut ist, da wir sonst evtl. kein Handle für die ToolBar (Pfadname) oder das Edit (Dateiname) bekommen.
Local $hToolBar = ControlGetHandle($hSaveAs, '', '[CLASS:ToolbarWindow32; INSTANCE:4]')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hToolBar --> " & $hToolBar & @LF)
ControlSetText($hToolBar, '', '', @ScriptDir) ; Pfad ändern, in dem die Datei gespeichert werden soll.
Local $hEdit = ControlGetHandle($hSaveAs, '', '[CLASS:Edit; INSTANCE:1]')
ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $hEdit --> " & $hEdit & @LF)
ControlSetText($hEdit, '', '', 'Test_mit_AutoIt.txt') ; Hier kommt der Dateiname hin.
Sleep(5000) ; Kleine Pause, damit wir sehen können, ob der Pfad/Name korrekt geändert wurde.
ControlClick($hSaveAs, '', '[CLASS:Button; INSTANCE:2]') ; Text speichern.
ConsoleWrite('Done...' & @CRLF)
Sleep(3000)
; Aufräumen
If FileExists(@ScriptDir & '\Test_mit_AutoIt.txt') Then FileDelete(@ScriptDir & '\Test_mit_AutoIt.txt') ; Testdatei wieder löschen...
ProcessClose($iPID) ; Notepad beenden.
EndIf
EndFunc ;==>_Example
Alles anzeigen
Ist es machbar, die Hauptanzeige temporär via autoit zu ändern, danach mein script durchlaufen lassen und am ende wieder die alte hauptanzeige einzustellen?
Ja, das ist machbar... dazu muss man die Funktion ChangeDisplaySettingsEx via DllCall aufrufen und kann so den primären Monitor ändern. Bevor dein Script beendet wird, dann einfach noch mal die Funktion aufrufen und den primären Monitor wieder zurücksetzen.
Kann dir bei der Umsetzung aber frühestens am WE weiterhelfen.
Der Eintrag ist (beim Beispiel von Bitnugger):
openpath.$(au3)=$(SciteDefaultHome)\..\include;F:\AutoIt\AutoIt3_MyIncludes
Wenn die Beta installiert ist, sind es zwei Einträge... den sollte man also auch erwähnen:
openpath.beta.$(au3)=$(SciteDefaultHome)\..\beta\include;f:\AutoIt\AutoIt3_MyInclude
(ich lasse den Post als ungelöst, damit auch andere Foren-Mitglieder den Post sofort sehen können).
Hm, wenn du ihn als gelöst markierst, können sie ihn nicht mehr sehen? Kann ich gar nicht glauben... weil ist ja nicht gerade intelligent, ihn als ungelöst stehen zu lassen, obwohl er ja gelöst ist.
Gibt es da etwa eine spezielle Einstellung in SciTe, damit es auch ohne öffnen und schließen geht?
Ja. Du startest in SciTE aus dem Menü Extras die "SciTE Config" und gibst dort an, wo dein Include-Verzeichnis ist. Sonst brauchst du nichts machen.