Ich hätte noch einen Vorschlag für dich...
Die Digitaluhr soll ja wahrscheinlich nur auf dem Desktop angezeigt werden... bevor du sie anzeigst, solltest du also prüfen, ob dieser sichbar/aktiviert ist.
Ich hätte noch einen Vorschlag für dich...
Die Digitaluhr soll ja wahrscheinlich nur auf dem Desktop angezeigt werden... bevor du sie anzeigst, solltest du also prüfen, ob dieser sichbar/aktiviert ist.
Diesen Bug habe ich schon vor langer Zeit im englischen Forum gemeldet, die sehen das Problem beim Coder der UDF... solange dieser nichts am Rückgabewert ändert... bleibt es so wie es ist.
_WinAPI_GetVersion liefert als Ergebnis einen String und Oscar vergleicht dieses Ergebnis auch mit einem String... und in dem Fall ist "10" eben kleiner als "6.0"!
Das Ergebnis von _WinAPI_GetVersion muss also vor der Prüfung in eine Zahl umgewandelt werden, damit der Vergleich wie beabsichtigt funktioniert.
If Number(_WinAPI_GetVersion()) < 6.0 Then Exit MsgBox($MB_ICONERROR, StringFormat('%s - v%3.3s', $sAppTitle, $sAppVersion), StringFormat('Systemvoraussetzung nicht erfüllt!\nWindows Vista oder höher wird benötigt.'))
Edit: Ab AutoItVersion 3.3.14.3 liefert _WinAPI_GetVersion keinen String mehr, sondern ein Double.
Dann würde es so reichen:
Mit zweien gefüllt mit der ganzen Liste
Zwei || haben eine völlig andere Bedeutung als nur ein |.
Hier mal ein Beispiel:
pushd z:\ 2>nil && (echo "Aktuelles Verzeichnis ist nun z:\") || echo "z:\ nicht gefunden"
Schau mal hier...
;-- TIME_STAMP 2018-06-18 23:28:52 v 0.1
#include <WindowsConstants.au3>
#include <Misc.au3>
; Im globalen Bereich (außerhalb von Funktionen) gibt es keine lokalen Variablen - auch wenn du sie mit Local deklarierst, sie sind immer global!
Global $sZeichen = "A0:Left SHIFT|A1:Right SHIFT|A2:Left CTRL|A3:Right CTRL|A4:Left MENU|A5:Right MENU|01:Left Mouse|02:Right Mouse|04:Middle Mouse|5B:Left WIN|5C:Right WIN|5D:Right MENU|" & _
"08:BACKSPACE|09:TAB|0C:CLEAR ?|0D:ENTER|10:SHIFT|11:CTRL|12:ALT|13:PAUSE|14:CAPS LOCK|1B:ESC|20:SPACEBAR|21:PAGE UP|22:PAGE DOWN|23:END|24:HOME|25:LEFT ARROW|26:UP ARROW|" & _
"27:RIGHT ARROW|28:DOWN ARROW|29:SELECT ?|2A:PRINT ?|2B:EXECUTE ?|2C:PRINT SCREEN|2D:INS|2E:DEL|30:0|31:1|32:2|33:3|34:4|35:5|36:6|37:7|38:8|39:9|41:A|42:B|43:C|44:D|45:E|" & _
"46:F|47:G|48:H|49:I|4A:J|4B:K|4C:L|4D:M|4E:N|4F:O|50:P|51:Q|52:R|53:S|54:T|55:U|56:V|57:W|58:X|59:Y|5A:Z|60:NUM 0|61:NUM 1|62:NUM 2|63:NUM 3|64:NUM 4|65:NUM 5|66:NUM 6|" & _
"67:NUM 7|68:NUM 8|69:NUM 9|6A:NUM *|6B:NUM +|6C:NUM .|6D:NUM -|6E:NUM ,|6F:NUM /|70:F1|71:F2|72:F3|73:F4|74:F5|75:F6|76:F7|77:F8|78:F9|79:F10|7A:F11|7B:F12|7C:F13|7D:F14|" & _
"7E:F15|7F:F16|90:NUM|91:SCROLL|BA:Ü:;|BB:+:=|BC:,|BD:-|BE:.|BF:#:/|C0:Ö:`|DB:ß:|DC:^:\|DD:´:,|DE:Ä:#|E2:<:n.a."
Global $aSplit, $aZeichen = StringSplit($sZeichen, '|', 2), $aTastaturZeichen[UBound($aZeichen)][3], $sZeichenDeutsch, $sZeichenEnglisch
For $i = 0 To UBound($aTastaturZeichen) - 1 Step 1
$aSplit = StringSplit($aZeichen[$i], ':', 2)
$aTastaturZeichen[$i][0] = $aSplit[0]
$aTastaturZeichen[$i][1] = $aSplit[1]
$aTastaturZeichen[$i][2] = UBound($aSplit) = 3 ? $aSplit[2] : $aSplit[1]
Next
ConsoleWrite(UBound($aTastaturZeichen) & @CRLF)
Global $hDLL = DllOpen("user32.dll"), $hGUI = GUICreate('', 1, 1, -1, -1, $WS_POPUP)
_ToolTip('Die blockierte Taste wird als Tooltip angezeigt... Abbruch mit ESC!')
Sleep(1000)
ToolTip('')ß
While True
For $i = 0 To UBound($aTastaturZeichen) - 1
If _IsPressed($aTastaturZeichen[$i][0], $hDLL) Then
If $aTastaturZeichen[$i][0] = "1B" Then ExitLoop 2 ; ESC
$sZeichenDeutsch = $aTastaturZeichen[$i][1]
$sZeichenEnglisch = $aTastaturZeichen[$i][2]
_ToolTip('Hex-Code: ' & $aTastaturZeichen[$i][0] & @CRLF & 'Deutsche Taste: ' & $aTastaturZeichen[$i][1] & @CRLF & 'Englische Taste: ' & $aTastaturZeichen[$i][2])
While _IsPressed($aTastaturZeichen[$i][0], $hDLL)
Sleep(250)
WEnd
ToolTip('')
If Not WinActive($hGUI) Then WinActivate($hGUI)
ExitLoop
EndIf
Next
WEnd
DllClose($hDLL)
Func _ToolTip($sText)
Local $aMP = MouseGetPos()
ToolTip($sText, $aMP[0] - 50, $aMP[1] + 50)
EndFunc
Alles anzeigen
Abfalltonnen: Bei uns kannst du dir im Internet einen Jahresplan im PDF-Format downloaden...der sieht dann etwa so aus:
Wenn das Datum nicht korrekt ist, wird die entsprechende Tonne nicht angezeigt und du berücksichtigst auch nicht, dass wenn ein oder mehrere Feiertage in der Abholwoche vor dem Abholtag sind, sich dieser verschiebt.
Aber sonst... echt super... jetzt noch einen einheitlichen Hintergrund, diesen, die Schriftfarben und die Transparenz einstellbar machen, dann ist es perfekt.
Ob durch WinClose auch der Prozess beendet wird, liegt ganz allein bei an der Anwendung, dessen Fenster geschlossen wurde. In den meisten Fällen ist dies aber so.
Das Problem hier ist aber, dass das TrayIcon erst ausgeblendet wird, wenn man mit der Maus über diesen Bereich fährt.
Hier mal ein kleines Script, mit dem man das sehen kann...
;-- TIME_STAMP 2018-06-16 18:40:49 v 0.1
Local $hWnd = WinActive("[ACTIVE]")
Local $hTrayWnd = WinActivate("[CLASS:Shell_TrayWnd]")
Local $aTrayWndPos = WinGetPos($hTrayWnd)
Local $aMousePos = MouseGetPos()
If Not ProcessExists('OneDrive.exe') Then
Run(@LocalAppDataDir & '\Microsoft\OneDrive\OneDrive.exe')
Sleep(500)
EndIf
Local $hOneDrive = WinGetHandle('OneDrive')
WinSetState($hOneDrive, '', @SW_MINIMIZE)
Sleep(500)
WinClose(WinGetHandle('OneDrive'))
ProcessClose('OneDrive.exe')
For $i = $aTrayWndPos[2] - 150 To $aTrayWndPos[2] / 2 Step -100
MouseMove($aTrayWndPos[0] + $i, $aTrayWndPos[1] + 15)
Next
MouseMove($aMousePos[0], $aMousePos[1])
WinActivate($hWnd)
Alles anzeigen
Versuche es mal so... das @ComSpec kannst du dir sparen, wenn mit Run eine *.exe ausgeführt wird.
RunWait("ROBOCOPY " & $Quelle & " " & $Ziel & " /MIR /XX " & $Nixkopieren_1, '', @SW_SHOW)
oder so...
RunWait(StringFormat('ROBOCOPY "%s" "%s" /MIR /XX "%s"', $Quelle, $Ziel, $Nixkopieren_1), '', @SW_SHOW)
Ein paar Anmerkungen zu _GetCMDOutput.au3
#include <WinAPIFiles.au3> ; ab AutoIt v3.3.14.3 #include <WinAPIConv.au3>
...ist überflüssig, weil du OemToChar direkt via DllCall aufrufst.
Run(@COMSPEC & ' /c ' & $sCommand, ...
@COMSPEC wird nur benötigt, wenn mit $sCommand auch interne Befehle wie echo, if, for oder goto aufgerufen werden, für die es keine *.exe gibt. Bei netsh ist dies nicht der Fall.
c:\>where netsh
C:\Windows\System32\netsh.exe
If Not @error Then
Wir wollen wissen, ob es funktioniert hat... und nicht, ob kein Fehler aufgetreten ist.
If $iPID Then
Seit einiger Zeit benutze ich aber nicht mehr OemToChar, sondern _WinAPI_WideCharToMultiByte. Das hat den Vorteil, dass Textausgaben in SciTE und in der Eingabeaufforderung auch UTF-8-Zeichen enthalten dürfen. Dafür müssen allerdings drei Einstellungen geändert werden. Kleiner Nachteil dabei ist, dass bereits vorhandene Scripte von ANSI nach UTF-8 konvertiert werden müssen. Dafür habe ich aber auch ein Script.
SciTEUser.properties:
code.page=65001
output.code.page=65001
Eingabeaufforderung:
Eigenschaften ==> Schriftart ==> hier eine TrueType-Schriftart auswählen, die UTF-8-Zeichen enthält. Ich habe bei mir z.B. NSimSun ausgewählt.
Hier nun meine Funktionen für die Textausgabe in UTF-8:
#include <WinAPIFiles.au3> ; ab AutoIt v3.3.14.3 #include <WinAPIConv.au3>
Func _CW($sText)
ConsoleWrite(StringFormat(_WideCharToMultiByte($sText)) & @CRLF)
EndFunc ;==>_CW
; Konvertiert den Text, damit Umlaute und Sonderzeichen in SciTE und in der Eingabeaufforderung korrekt dargestellt werden!
Func _WideCharToMultiByte($vText, $iCodePage = 65001, $bRetString = True)
$vText = String($vText) ; Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
; SciTE output.code.page = 65001 (UTF-8), Eingabeaufforderung = 65001 (UTF-8) + Schriftart, die UTF-8-Zeichen enthält!
;~ Return _WinAPI_WideCharToMultiByte($vText, $iCodePage, $bRetString)
; SciTE output.code.page = 65001 (UTF-8), Eingabeaufforderung = 1 (OEM 850) + Schriftart, die UTF-8-Zeichen enthält! (Default)
Return _WinAPI_WideCharToMultiByte($vText, @Compiled ? 1 : $iCodePage, $bRetString)
EndFunc ;==>_WideCharToMultiByte
Alles anzeigen
Wie macht man Pfadangabe dynamisch, d.h. beim letzten Script-Start den Pfad zu merken. Dabei ist auch interessant , mehreren Pfadangaben (für unterschiedlichen Angaben) unterscheiden zu können.
Hier ein Beispiel...
;-- TIME_STAMP 2018-06-13 18:04:14 v 0.1
#Region ;************ Includes ************
#Include <FileConstants.au3>
#Include <Array.au3>
#EndRegion ;************ Includes ************
OnAutoItExitRegister('_Exit')
Global $g_sIniFile = StringRegExpReplace(@ScriptFullPath, '(.+)\..+', '\1.ini')
Global $g_aFileOpenDialog[0][2]
Global $g_sExcelFileLink1, $g_sExcelFileLink2, $g_sExcelFileLink3
; Anstelle 1, 2, 3 kannst du hier auch die ID eines Buttons angeben.
$g_sExcelFileLink1 = _FileOpenDialog(1, 'Select file', 'C:\', 'Files (*.xls;*.xlsx;*.xlsm)')
$g_sExcelFileLink2 = _FileOpenDialog(2, 'Select file', 'D:\', 'Files (*.xls;*.xlsx;*.xlsm)')
$g_sExcelFileLink3 = _FileOpenDialog(3, 'Select file', 'F:\', 'Files (*.xls;*.xlsx;*.xlsm)')
ConsoleWrite("$g_sExcelFileLink1 --> " & $g_sExcelFileLink1 & @CRLF)
ConsoleWrite("$g_sExcelFileLink2 --> " & $g_sExcelFileLink2 & @CRLF)
ConsoleWrite("$g_sExcelFileLink3 --> " & $g_sExcelFileLink3 & @CRLF)
_ArrayDisplay($g_aFileOpenDialog, '$g_aFileOpenDialog', '', 0, Default, 'ID|InitDir')
Func _FileOpenDialog($iID, $sTitle = 'Select file', $sInitDir = @ScriptDir, $sFilter = 'All (*.*)', $sOptions = BitOR($FD_FILEMUSTEXIST, $FD_PATHMUSTEXIST), $sDefaultName = '', $hWnd = '')
If Not UBound($g_aFileOpenDialog) Then
Local $aSection = IniReadSection($g_sIniFile, 'FileOpenDialog')
If Not @error Then
For $i = 1 To $aSection[0][0] Step 1
_ArrayAdd($g_aFileOpenDialog, $aSection[$i][1])
Next
EndIf
EndIf
Local $iIndex = _ArraySearch($g_aFileOpenDialog, $iID, 0, 0, 0, 0, 1, 0)
If @error Then $iIndex = _ArrayAdd($g_aFileOpenDialog, $iID & '|' & $sInitDir)
$sInitDir = $g_aFileOpenDialog[$iIndex][1]
$hWnd = $hWnd ? $hWnd : DllCall("user32.dll", "hwnd", "GetDesktopWindow")[0]
Local $sWorkingDir = @WorkingDir, $sFileLink = FileOpenDialog($sTitle, $sInitDir, $sFilter, $sOptions, $sDefaultName, $hWnd)
; Change the working directory (@WorkingDir) back to the old location as FileOpenDialog sets it to the last accessed folder.
FileChangeDir($sWorkingDir)
If $sFileLink Then $g_aFileOpenDialog[$iIndex][1] = StringRegExpReplace($sFileLink, '(.+\\).+', '\1')
Return $sFileLink
EndFunc ;==>_FileOpenDialog
Func _Exit()
If UBound($g_aFileOpenDialog) Then
For $i = 0 To UBound($g_aFileOpenDialog) -1 Step 1
IniWrite($g_sIniFile, 'FileOpenDialog', StringFormat('Dialog_%03i', $i), $g_aFileOpenDialog[$i][0] & '|' & $g_aFileOpenDialog[$i][1])
Next
EndIf
EndFunc ;==>_Exit
Alles anzeigen
Ich mache das mit WindowBlinds und habe den Style Trio eingestellt.
Auf Windows 10 könnte es am Skin liegen, aber auf Windows 7 habe ich den Default-Skin eingestellt und da geht es ja auch nicht.
Windows 7: Microsoft Windows [Version 6.1.7601]
Windows 10: Microsoft Windows [Version 10.0.17134.81]
Beide X64
AutoIt 3.3.14.5
Oben links im Fenster wird bei mir auf Windows 7/10 dann gar kein Icon angezeigt.
Hier mal eine minimalistische Version... den Rest bekommst du wohl selbst hin...
;-- TIME_STAMP 2018-06-09 21:24:13 v 0.1
#Region ;************ Includes ************
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#EndRegion ;************ Includes ************
Global $g_hOBS ; OBS Studio 21.1.0 / Open Broadcaster Software
If _Singleton(@ScriptName, 1) Then
_Main()
; Juhu, ich bin allein...
Else
; Es läuft bereits eine Instanz...
WinClose(WinGetHandle(@ScriptName)) ; Dann beenden...
_Main()
EndIf
Func _Main()
OnAutoItExitRegister('_Exit')
#Region - GUI Create
Local $hGUI = GUICreate(@ScriptName)
GUISetBkColor(0x280000)
GUISetState()
#EndRegion - GUI Create
_SetHotKey('+{f3}', '_Replay')
_SetHotKey('+{f4}', '_ExtendTime')
$g_hOBS = ControlGetHandle('OBS 21.1.0 (64bit, windows) - Profil: Unbenannt - Szenen: Unbenannt', '', '[CLASS:Qt5QWindowIcon; INSTANCE:1]')
ControlSend($g_hOBS, '', '', '+{f12}') ; start recording
AdlibRegister('_StopRecord', 1000 * 60 * 1)
#Region - GUI SwitchLoop
While True
Switch GUIGetMsg() ; nachschauen, ob eine Message für unsere GUI angekommen ist
Case $GUI_EVENT_CLOSE
Exit
;~ Case
;~ Case
;~ Case
;~ Case Else
EndSwitch
WEnd
#EndRegion - GUI SwitchLoop
EndFunc ;==>_Main
Func _StopRecord()
AdlibUnRegister('_StopRecord')
ControlSend($g_hOBS, '', '', '+{f11}')
EndFunc ;==>_StopRecord
Func _ExtendTime()
AdlibRegister('_StopRecord', 1000 * 60 * 1) ; stop recording after 1 minutes
EndFunc ;==>_ExtendTime
Func _Replay()
ControlSend($g_hOBS, '', '', '+{f6}')
EndFunc ;==>_Replay
Func _SetHotKey($sHotKey, $sFunction)
If Not HotKeySet($sHotKey, $sFunction) Then Exit MsgBox(16, @ScriptName, 'HotKey "' & $sHotKey & '" konnte nicht gesetzt werden!')
EndFunc
Func _Exit()
; Hier kannst du deine Einstellungen (z. B. Fensterposition) speichern, bevor Exit ausgeführt wird.
; HotKeys wieder freigeben, damit die nächste Instanz sie wieder aktivieren kann.
HotKeySet('+{f3}')
HotKeySet('+{f4}')
EndFunc ;==>_Exit
Alles anzeigen
Sieht das bei dir auch so aus?
;-- TIME_STAMP 2018-06-06 14:58:58 v 0.1
#Region ;************ Includes ************
;~ #include <AutoItConstants.au3>
;~ #include <GUITab.au3>
;~ #include <File.au3>
;~ #include <Array.au3>
;~ #include <Word.au3>
;~ #include <WordConstants.au3>
;~ #include <Clipboard.au3>
;~ #include <Misc.au3>
;~ #include <MsgBoxConstants.au3>
;~ #include <ComboConstants.au3>
;~ #include <StaticConstants.au3>
;~ #include <ButtonConstants.au3>
;~ #include <IE.au3>
;~ #include <Process.au3>
;~ #include <WinAPIFiles.au3>
;~ #include <WinAPISys.au3>
;~ #include <WinAPI.au3>
;~ #include <date.au3>
;~ #include <String.au3>
;~ #include <StringConstants.au3>
;~ #include <MenuConstants.au3>
;~ #include <AVIConstants.au3>
;~ #include <ProgressConstants.au3>
;~ #include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#EndRegion ;************ Includes ************
#Region ### START Koda GUI section ### Form=E:\Arbeit\Batchdateien\Scripte\BatteryLifeTest\Form1.kxf
$Form1 = GUICreate("Test by HaSc (C) 2018", @DesktopWidth, @DesktopHeight, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_MAXIMIZE, $WS_TABSTOP))
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
GUISetBkColor(0xFFFFFF)
$StartStopbutton = GUICtrlCreateButton("Start", 164, 856, 249, 57)
$Exit = GUICtrlCreateButton("Exit", 424, 856, 249, 57)
GUICtrlSetFont(-1, 12, 800, 0, "Arial")
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
$oWMP = ObjCreate("WMPLayer.ocx") ;mediaplayer-objekt erstellen -> für die Einstellungen: new-object -comobject Wmplayer.ocx | get-member in Powershell ausführen
GUICtrlCreateObj($oWMP, 768, 8, 1120, 921) ;objekt ins gui setzen und grösse angeben
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $Exit
Exit
Case $StartStopbutton
GUICtrlSetData($StartStopbutton, 'Stop')
Batterytest()
EndSwitch
WEnd
Func Batterytest()
Local $hTimer, $iTimeOut = 3000
While 1
$oWMP.URL = @ScriptDir & "\Wildlife.wmv" ;url/link zur avi/mp3/wma/wmv/... datei
$oWMP.uiMode = "full" ;videos anzeigen lassen und andere funktionen ausblenden (auf "full" setzen für alles anzeigen)
$oWMP.settings.mute = True
$oWMP.controls.play() ;abspielen (Play Taste)
$hTimer = TimerInit()
Do
If $oWMP.Playstate = 3 Then ExitLoop
Sleep(500)
Until TimerDiff($hTimer) < $iTimeOut ; Wenn nach 3 Sekunden das Video nicht gestartet wurde, ist evtl. ein Fehler aufgetreten.
If $oWMP.Playstate <> 3 Then Return SetError(1, 0, False)
While $oWMP.Playstate = 3
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $Exit
Exit
Case $StartStopbutton
$oWMP.controls.stop()
Return GUICtrlSetData($StartStopbutton, 'Start')
EndSwitch
WEnd
WEnd
EndFunc ;==>Batterytest
Alles anzeigen
Hiermit kannst du dir die gedrückte Taste via ToolTip anzeigen lassen... Abbruch mit ESC!
;-- TIME_STAMP 2018-06-06 04:00:06 v 0.1
#Region ;************ Includes ************
#Include <WindowsConstants.au3>
#include <Misc.au3>
#EndRegion ;************ Includes ************
Local $hDLL = DllOpen("user32.dll"), $hGUI = GUICreate('', 1, 1, -1, -1, $WS_POPUP), $x = @DesktopWidth / 2 - 50, $y = @DesktopHeight / 2
ToolTip('Die gedrückte Taste wird als Tooltip angezeigt... Abbruch mit ESC!', $x, $y)
Sleep(1000)
While True
For $i = 1 To 0xFF
If _IsPressed(Hex($i, 2), $hDLL) Then
If $i = 0x1B Then ExitLoop 2 ; ESC
ToolTip('_IsPressed: ' & Hex($i, 2) & @CRLF, $x, $y)
While _IsPressed(Hex($i, 2), $hDLL)
Sleep(250)
WEnd
EndIf
Next
If Not WinActive($hGUI) Then WinActivate($hGUI)
Sleep(10)
WEnd
ToolTip('')
DllClose($hDLL)
Alles anzeigen
Wenn dein Script eine GUI hat und die Taste(n) nur abgefragt werden sollen, wenn diese aktiv ist, solltest du besser GUISetAccelerators verwenden.
Auf einer engl. Tastatur... er hat aber sicher eine deutsche... und da ist das "-" doch an einer anderen Stelle?!
Bei mir (deutsche Tastatur) reagiert _IsPressed bei $VK_OEM_8 = 0xDF, wenn ich "ß" drücke.