Perfekt! Super!
Vielen Dank. Genau das wollte ich! ![]()
Perfekt! Super!
Vielen Dank. Genau das wollte ich! ![]()
Hat keiner eine Idee, wie man die Beschreibung der laufenden Prozesse auslesen könnte?
Leider habe ich im englischen Forum auch (noch) nichts gefunden.
Vielen Dank.
Ja, ich könnte wirklich StringRegExp benutzen, um die Strings zu prüfen.
Doch erst muss ich mal von allen laufenden Prozessen die Beschreibung auslesen können und diese dann per StringRegExp durchsuchen!
Hallo zusammen,
ja, ich habe die Suchfunktion benutzt, aber auf mein Problem noch keine Lösung gefunden!
Ich möchte in einer Endlosschleife nach einem bestimmten Prozess ausschau halten. Sobald dieser existiert, muss ich gewisse Aktionen ausführen.
Bis jetzt mache ich das so:
[autoit]
$PID = WinGetProcess("", "ERP Workspace")
If $PID <> -1 AND WinExists("ERP 0408") Then XYZ
Das Problem ist, ich darf bei WinGetProcess nicht auf einen bestimmten Titel gehen, weil der Benutzer die EXE umbenannt haben könnte (kommt wirklich vor!)
Aber der Text ERP Workspace kommt in diesem Prozess vor und ist ja auch für den Benutzer unveränderlich.
Leider reicht das noch nicht. Denn wenn nun jemand in ein Notepad diesen Text schreibt, wir ja auch meine Aktion ausgeführt!
Deshalb noch die Abfrage WinExist!
Doch wenn jemand dummerweise ein Fenster offen hat, welches auch so heisst, dann läuft das auch nicht 100% zuverlässig!
Meine Frage nun: Wie kann ich die Beschreibung eines Prozesses (siehe Taskmanager) auslesen?
Zusätzlich: Ich kenne einige Schlüsselwörter, die in der Prozessbeschreibung vorkommen müssen. Doch leider nicht am Stück!
Also Z.B. ERP Workspace 07045 Process Update Manager Die Zahl kann aber immer ändern.
Wie kann ich sowas überprüfen?
Vielen Dank für alle Anregungen!
Veronesi
Wenn Du über das "X" die RDP Session "schliesst", dann ist die Gegenstelle immer noch gesperrt.
Vermutlich läuft deshalb das Script nicht richtig.
Du musst also nur dafür sorgen, dass beim schliessen dieser Session der vorherige Benutzer wieder eingeloggt wird!
Zu 2. habe ich mal einen Beitrag geschrieben:
So, mit diesem Script (aus dem Link welchen Du mir genannt hast) funktioniert es nun!
Ich muss einfach vorher unter Windows 7 folgende Befehle ausführen:
ShellExecuteWait(@WindowsDir & "\System32\DisplaySwitch.exe", "/extend")
[/autoit]
Damit werden alle Bildschirme neu eingelesen.
(Hintergrund: bei mir werden im laufenden Betrieb neue Bildschirme angeschlossen und gewechselt. Wäre dies nicht der Fall, würde das Script auch ohne diese Zeile funktionieren)
Script:
#include <Array.au3>
$aMonitor = _CI_GetMonitor()
$hFile = FileOpen(@ScriptDir & '\!Monitor-Info.txt', 2)
If $hFile <> -1 Then
For $i = 0 To UBound($aMonitor) - 1
$save = ''
For $j = 0 To UBound($aMonitor, 2) - 1
$save &= $aMonitor[$i][$j] & ' *** '
Next
FileWriteLine($hFile, $save)
Next
FileClose($hFile)
EndIf
_ArrayDisplay($aMonitor)
Func _CI_GetMonitor($strComputer = '.')
Switch @OSVersion
Case 'WIN_VISTA', 'WIN_7'
Local $sX64 = '', $iCount, $sHKLM, $sTmp, $sMfg, $sDeviceDesc, $sDPMS, $sClassGUID, $sHardwareID
If @OSArch <> 'X86' Then $sX64 = '64'
$sHKLM = 'HKEY_LOCAL_MACHINE' & $sX64
$iCount = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', 'Count')
Local $aMonitor[$iCount + 1][6] = [['Hersteller:', 'Modell:', 'DPMS-Untersützung:', 'Position (x, y):', 'akt. Auflösung:', 'max. Auflösung:']]
For $i = 1 To $iCount
$sTmp = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\services\monitor\Enum', $i - 1)
$sMfg = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'Mfg')
$aMonitor[$i][0] = StringRegExpReplace($sMfg, '.+;(.+)', '$1')
$sDeviceDesc = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'DeviceDesc')
$aMonitor[$i][1] = StringRegExpReplace($sDeviceDesc, '.+;(.+)', '$1')
$sDPMS = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp & '\Device Parameters', 'DPMS')
$aMonitor[$i][2] = StringMid('NeinJa', $sDPMS * 4 + 1, 4)
$sClassGUID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'ClassGUID')
$sHardwareID = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Enum\' & $sTmp, 'HardwareID')
Local $iEnum = 0, $sTmpKey, $sMatchingDeviceId, $sConnectivity, $sRecent, $sMatchConfig, $j, $x, $y, $cx, $cy
While True
$sTmpKey = $sHKLM & '\SYSTEM\CurrentControlSet\Control\Class\' & $sClassGUID & '\' & StringRight('0000' & $iEnum, 4)
$sMatchingDeviceId = RegRead($sTmpKey, 'MatchingDeviceId')
If @error Then ExitLoop
If $sMatchingDeviceId = $sHardwareID Then
$aMonitor[$i][5] = StringReplace(RegRead($sTmpKey, 'MaxResolution'), ',', ' x ')
$sConnectivity = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity', 1)
$sRecent = RegRead($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Connectivity\' & $sConnectivity, 'Recent')
$j = 0
Do
$j += 1
$sMatchConfig = RegEnumKey($sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\', $j)
Until StringInStr($sMatchConfig, $sRecent) Or (@error <> 0)
$sTmp = $sHKLM & '\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration\' & $sMatchConfig & '\' & StringRight('00' & $i - 1, 2)
$x = Number(String(RegRead($sTmp, 'Position.cx')))
If $x > 2 ^ 31 Then $x = -BitXOR($x, 0xffffffff)
$y = Number(String(RegRead($sTmp, 'Position.cy')))
If $y > 2 ^ 31 Then $y = -BitXOR($y, 0xffffffff)
$cx = RegRead($sTmp, 'PrimSurfSize.cx')
$cy = RegRead($sTmp, 'PrimSurfSize.cy')
$aMonitor[$i][4] = $cx & ' x ' & $cy
$aMonitor[$i][3] = $x & ', ' & $y
ExitLoop
EndIf
$iEnum += 1
WEnd
Next
Return $aMonitor
Case Else
Local $aReturn[2][8] = [[ _
'Hersteller:', 'Modell:', 'Breite (Pixel):', 'Höhe (Pixel):', _
'Pixel pro Inch (X):', 'Pixel pro Inch (Y):', 'Monitorgröße (ca.):', 'PNPDeviceID:']]
Local $x = 0, $objWMIService, $colItems, $Output
$objWMIService = ObjGet('winmgmts:\\' & $strComputer & '\root\cimv2')
If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DesktopMonitor', 'WQL', 0x30)
If IsObj($colItems) Then
For $objItem In $colItems
$x += 1
ReDim $aReturn[$x + 1][8]
$aReturn[$x][0] = $objItem.MonitorManufacturer
$aReturn[$x][1] = $objItem.Name
$aReturn[$x][2] = $objItem.ScreenWidth
$aReturn[$x][3] = $objItem.ScreenHeight
$aReturn[$x][4] = $objItem.PixelsPerXLogicalInch
$aReturn[$x][5] = $objItem.PixelsPerYLogicalInch
$aReturn[$x][6] = Round($objItem.ScreenWidth / ($objItem.PixelsPerXLogicalInch / 2.54), 2) & _
' x ' & Round($objItem.ScreenHeight / ($objItem.PixelsPerYLogicalInch / 2.54), 2) & ' cm²'
$aReturn[$x][7] = $objItem.PNPDeviceID
Next
EndIf
Return $aReturn
EndSwitch
EndFunc ;==>_CI_GetMonitor
Vielen Dank!
Dieser Beitrag endet leider im Januar mit mehr oder weniger dem Satz: "Ich geb's auf"...
Und leider funktioniert das script von dort bei mir nicht auf allen Win7 PCs mit allen Grafikkarten. Das ist mein eigentliches Problem!
Trotzdem danke für die Antwort.
Das Tutorial werde ich gerne mal lesen. Aber ich habe nicht grosse Hoffnungen für mich. (Bin eigentlich kein Programmierer) Und ich habe noch nicht mal herausgefunden war für ein Datentyp der Rückgabewert hat.....
Wäre um Hilfe echt froh und dankbar!
Veronesi
Hallo zusammen,
ich möchte gerne mit AutoIt diverse Informationen zu den angeschlossenen Bildschirmen auslesen. (Mehrere Monitore)
Mit ein bisschen suchen bin ich auf diese Seite gestossen: MSDN
Leider kenne ich mich in AutoIt überhaupt nicht aus, wie man eine DLL ansteuert. Da habe ich regelmässig Probleme. Ich kriege es einfach nicht hin.
Könnte mir jemand helfen?
Ich weiss einfach dass bei mir die Availability auf 3 stehen müsste.
Zurückbekommen möchte ich von der Funktion den ConfigManagerErrorCode ob er korrekt initialisiert wurde, sowie den String von MonitorType
Dazu benötigt man die Cimwin32.dll. Aber ich steh echt auf dem Schlauch, wie ich das auslesen könnte!
Vielen Dank für Eure Hilfen!
Veronesi
Wenn die Variable $iBuffer auf 500 setze, dann bekomme ich keine Fehlermeldung mehr zurück. Doch der Rückgabewert ($Filename) ist immer gleich 0.
Was stimmt hier nicht?
Func UNCPath()
Local $Filename, $tmp, $last
If WinActive("[CLASS:CabinetWClass]") = 0 Then Return -1 ;Return if not the Windows Explorer Windows is active!
_ClipBoard_Empty() ;Clears Clipboard
Send("^c") ;Ctrl + C
While 1 ;Wait till Clipboard is captured (with Ctrl+C)
$tmp = _ClipBoard_GetData(15) ;Get Clipboard Header Data
If $tmp <> "" Then ExitLoop
WEnd
$tmp = BinaryToString($tmp, 2) ;Converts binary to String
$tmp = StringTrimLeft($tmp, 10)
$last = StringInStr($tmp, Chr(0), 1)
If $last Then $Filename = StringLeft($tmp, $last -1) ;Filename contains now Path and filename, but not in UNC
$Filename = _WinNet_LetterToUNC(StringLeft($Filename, 3))
_ClipBoard_SetData($Filename)
MsgBox(0,"",$Filename)
EndFunc ;==>UNCPath
Func _WinNet_LetterToUNC($sDriveLetter)
; Author: ProgAndy
Local Static $sizeNETRESOURCE = DllStructGetSize(DllStructCreate($tagNETRESOURCE, 1))
$sDriveLetter = StringLeft($sDriveLetter, 1)&':'
Local $hEnum, $nStatus, $iCount, $iBuffer = 500, $tBuffer, $pBuffer, $iLen, $sLocalName, $tString, $pString, $tNETRESOURCE, $sRemoteName
If DriveStatus($sDriveLetter) = 'INVALID' Then Return SetError(1,0,'')
If Not _WinNet_OpenEnum(0, 0, 0, 0, $hEnum) or $hEnum=0 Then Return SetError(2,0,'')
$iCount = -1
_WinNet_EnumResource($hEnum, $iCount, 0, $iBuffer)
If $iBuffer = 0 Then Return SetError(3,0,0)
$tBuffer = DllStructCreate("byte[" & $iBuffer+1 & ']')
$pBuffer = DllStructGetPtr($tBuffer)
$iCount = -1
If _WinNet_EnumResource($hEnum, $iCount, $pBuffer, $iBuffer) Then
For $i = 0 To $iCount-1
$tNETRESOURCE = DllStructCreate($tagNETRESOURCE, $pBuffer+$i*$sizeNETRESOURCE)
$pString = DllStructGetData($tNETRESOURCE, 'LocalName')
$iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
If Not @error Then $iLen = $iLen[0]
$sLocalName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)
If StringLeft($sLocalName, 2) = $sDriveLetter Then
$pString = DllStructGetData($tNETRESOURCE, 'RemoteName')
$iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
If Not @error Then $iLen = $iLen[0]
$sRemoteName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)
_WinNet_CloseEnum($hEnum)
Return $sRemoteName
EndIf
Next
EndIf
_WinNet_CloseEnum($hEnum)
EndFunc
Also, hab's nun so gemacht:
$ret = _WinNet_LetterToUNC("R:\")
MsgBox(0, "", $ret & @CRLF & "error: " & @error)
$ret war = 0 und @error war = 3
@progandy
Vielen Dank für die Funktion. Leider bekomme ich immer 0 zurück!
Hier meine Versuche:
Func UNCPath()
Local $Filename, $tmp, $last
If WinActive("[CLASS:CabinetWClass]") = 0 Then Return -1 ;Return if not the Windows Explorer Windows is active!
_ClipBoard_Empty() ;Clears Clipboard
Send("^c") ;Ctrl + C
While 1 ;Wait till Clipboard is captured (with Ctrl+C)
$tmp = _ClipBoard_GetData(15) ;Get Clipboard Header Data
If $tmp <> "" Then ExitLoop
WEnd
$tmp = BinaryToString($tmp, 2) ;Converts binary to String
$tmp = StringTrimLeft($tmp, 10)
$last = StringInStr($tmp, Chr(0), 1)
If $last Then $Filename = StringLeft($tmp, $last -1) ;Filename contains now Path and filename, but not in UNC
$Filename = _WinNet_LetterToUNC(StringLeft($Filename, 3))
_ClipBoard_SetData($Filename)
MsgBox(0,"",$Filename)
EndFunc ;==>UNCPath
Func _WinNet_LetterToUNC($sDriveLetter)
; Author: ProgAndy
Local Static $sizeNETRESOURCE = DllStructGetSize(DllStructCreate($tagNETRESOURCE, 1))
$sDriveLetter = StringLeft($sDriveLetter, 1)&':'
Local $hEnum, $nStatus, $iCount, $iBuffer, $tBuffer, $pBuffer, $iLen, $sLocalName, $tString, $pString, $tNETRESOURCE, $sRemoteName
If DriveStatus($sDriveLetter) = 'INVALID' Then Return SetError(1,0,'')
If Not _WinNet_OpenEnum(0, 0, 0, 0, $hEnum) or $hEnum=0 Then Return SetError(2,0,'')
$iCount = -1
_WinNet_EnumResource($hEnum, $iCount, 0, $iBuffer)
If $iBuffer = 0 Then Return SetError(3,0,0)
$tBuffer = DllStructCreate("byte[" & $iBuffer+1 & ']')
$pBuffer = DllStructGetPtr($tBuffer)
$iCount = -1
If _WinNet_EnumResource($hEnum, $iCount, $pBuffer, $iBuffer) Then
For $i = 0 To $iCount-1
$tNETRESOURCE = DllStructCreate($tagNETRESOURCE, $pBuffer+$i*$sizeNETRESOURCE)
$pString = DllStructGetData($tNETRESOURCE, 'LocalName')
$iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
If Not @error Then $iLen = $iLen[0]
$sLocalName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)
If StringLeft($sLocalName, 2) = $sDriveLetter Then
$pString = DllStructGetData($tNETRESOURCE, 'RemoteName')
$iLen = DllCall("kernel32.dll", "int", "lstrlenW", "ptr", $pString)
If Not @error Then $iLen = $iLen[0]
$sRemoteName = DllStructGetData(DllStructCreate("wchar[" & $iLen & "]", $pString), 1)
_WinNet_CloseEnum($hEnum)
Return $sRemoteName
EndIf
Next
EndIf
_WinNet_CloseEnum($hEnum)
EndFunc
OK.
Ich bekomme den Pfad der markierten Datei im Array. Das ist ja korrekt. Einfach von diesem muss ich noch irgendwie auf den UNC Pfad kommen. (Siehe Bild)
Aber leider schnalle ich nicht, warum man diesen Header dann noch beschneiden muss, um an den Pfad zu kommen. Stehen dann in diesem Header diese Informationen? Und woher weiss ich das? Wieviele Zeichen? Wo findet man das?
Danke für weitere Infos!
veronesi
auf allen Freigaben im Netz bekomme ich den UNC-Pfad zurück. Wenn du auf der lokalen Maschine arbeitest, dann werden allerdings auch die lokalen Dateinamen zurückgegeben. Aber wo ist das Problem, die Rückgabe am Anfang auf \\ zu testen und dann den Servernamen davorzuhängen?
Ich arbeite auch im Netzwerk. Und ich bekomme immer den Pfad zurück (U:\2_Projekte\AutoIt\Testscript.au3) Aber leider ist das nicht der UNC Pfad.
Das Problem liegt darin, dass bei verschiedenen Leuten die Serverpfade nicht zwingend auf die gleichen Laufwerksbuchstaben gemappt sind. Deshalb benötige ich die UNC Pfade.
Und "einfach" den Servernamen davorzusetzen geht auch nicht, weil ich den dann ja nicht kenne.
Wir haben hier 72 verschiedene Server in einem Cluster. Da kann jedes Verzeichnis (auch wenn es für den Benutzer auf der gleichen Freigabe ist) von einem anderen Server stammen!
Hallo!
Vielen Dank!!
Es funktioniert fast ![]()
Ich bekomme nun den ganzen Pfad mit Dateiname. Aber eigentlich wollte ich den UNC Pfad.
Also \\Servername\Freigabe\Pfad1\Pfad2\Dateiname.ext
Wie komme ich nun an den ran? Aber das ist schon mal genial!
Nur habe ich leider überhaupt nicht verstanden, wie das funktioniert!
Könnte mir das jemand erklären?
Hier der Code:
Func UNCPath()
Local $Filename, $tmp, $last
If WinActive("[CLASS:CabinetWClass]") = 0 Then Return -1 ;Return if not the Windows Explorer Windows is active!
_ClipBoard_Empty() ;Clears Clipboard
Send("^c") ;Ctrl + C
While 1 ;Wait till Clipboard is captured (with Ctrl+C)
$tmp = _ClipBoard_GetData(15)
If $tmp <> "" Then ExitLoop
WEnd
$tmp = BinaryToString($tmp, 2) ;Converts binary to String
$tmp = StringTrimLeft($tmp, 10) ;Why this?
$last = StringInStr($tmp, Chr(0), 1) ;Why this?
If $last Then $Filename = StringLeft($tmp, $last -1) ;Why this?
_ClipBoard_SetData($Filename)
;~ MsgBox(0,"",$Filename)
EndFunc ;==>UNCPath
*hust* und nun?
Leider kann ich damit nichts anfangen. Ich finde keinerlei Informationen zur markierten Datei!
hmm werd ich die tage ma versuchen.
aber ist dieses GUISetOnEvent auch für normale buttons nutzbar? ich hatte in der referenz nur allgemeine dinge wie maximieren, minimieren, cancel und mausaktionen gesehen. is mein erstes autoit script, daher bitt ich um nachsicht
Ja, sicher geht das!
Du brauchst einfach
Opt("GUIOnEventMode", 1) ;Enable events on GUI
[/autoit]und
[autoit]GUICtrlSetOnEvent($bButtonXYZ, "_FuncXYZ")
[/autoit]Sobald dieser entsprechende Button gedrückt ist, springt AutoIt automatisch in die Subfunktion. Einfacher gehts' dann nicht mehr!
Hat jemand eine Idee, wie ich den UNC Pfad einer gerade im Windows Explorer herausfinden kann?
Oder zumindestens irgendwelche Informationen über die markierte Datei?
Nimm mal die #include Zeile bei Button1 und Button2 raus und füge diese einmal oben (bei den anderen Includes) ein.
Zudem würde ich generell - wenn Du schon die GUIGetMsg() Funktion verwenden möchtest - in den Cases nur Subfunktionen aufrufen.
Das macht das ganze viel übersichtlicher!
Oder verwende gleich die GUISetOnEvent Funktion!
Hallo Oscar!
Vielen Dank!
Nun habe ich auch die Funktionen Int und Mod kennen gelernt! Super!
Auch das StringFormat habe ich nun (mindestens im Ansatz) begriffen!
Danke!
Gruss
Veronesi