Evtl. hilft dir dann die Funktion _WinAPI_GetKeyboardState und _WinAPI_GetKeyNameText weiter... siehe Bsp. in der AutoIt-Hilfe.
Beiträge von Bitnugger
-
-
dein Script fliegt hier raus If Not IsHWnd($hWnd) Then _ErrExit(4, 'Fehler bei WinWaitActive!') ; Fehlermeldung wird erzeugt, somit kann ich die beiden Handles noch nicht vergleichen.
In dem Fall gibt es keine zwei Handles weil keines gefunden wurde... und somit auch nichts zu vergleichen. Eine Ausgabe von $hWnd mit ConsoleWrite bringt dann auch nicht mehr Erleuchtung.
Ich sehe aber, das ich wieder mal einen blöden Fehler eingebaut habe... ändere folgende Zeile um...
$hWnd = WinWaitActive("[TITLE:IBM Notes Arbeitsbereich: CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde
zu...
$hWnd = WinWaitActive("[TITLE:IBM Notes Arbeitsbereich; CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde
oder so, wenn das auch nicht geht...
$hWnd = WinWaitActive("[REGEXPTITLE:^(IBM Notes.+); CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde
Du kennst ja sicherlich die Windows Tastenkombinationen "WinTaste" + Pfeiltasten
Ja ok, das macht allerdings Sinn.
-
OMG den Tipp hätte ich nicht in einem Thread gegeben, der mit Keylogger überschrieben ist..
Ich vertraue auf das Gute im Menschen und habe zudem auch keine fertige Lösung präsentiert... lediglich einen Hinweis, dass in der AutoIt-Hilfe weitere Infos dazu stehen... die allerdings nur dann verständlich sind, wenn eine gewisse Erkenntnisstufe vorhanden ist. Wer sich mit Hilfe Anderer einen funktionierenden Keylogger erschleichen will und damit nichts Gutes im Sinn hat, lebt eh auf extrem dünnem Eis...
-
Teste es mal so...
Code
Alles anzeigenFunc _99_LotusNotes() ; Lotus Notes Local $hWnd, $iWait = 0, $iMove, $sAppName = "Lotus Notes", $iLocation, $aWinPos = [[3015, 34, 592, 996], [3015, 34, 592, 996]] ; <-- die Koordinaten sind ja identisch!? GUICtrlSetData($sLabel5, $sAppName) GUISetState(@SW_SHOW, $hGUI) Local $iPID = Run("C:\Program Files (x86)\IBM\Notes\notes.exe", "", @SW_MINIMIZE) ; starte Lotus Notes If Not $iPID Then _ErrExit(4, 'Fehler bei Run!') ; Fehlermeldung wird erzeugt Do ; Je mehr und je ausführlicher die angegeben Infos zum Fenster sind, umso sicherer wird das richtige Fenster gefunden. Deshalb, wenn bekannt, auch die CLASS angeben! $hWnd = WinWaitActive("[REGEXPTITLE:IBM Notes Arbeitsbereich; CLASS:SWT_Window0]", "", 1) ; Wartet maximal 1 Sekunde $iWait += 1 Until $hWnd Or $iWait = 20 If Not IsHWnd($hWnd) Then _ErrExit(4, 'Fehler bei WinWaitActive!') ; Fehlermeldung wird erzeugt ConsoleWrite('> $hWnd = ' & $hWnd & ' <-- Vergleiche das Handle mit dem was dir vom AutoIt-Info-Tool angezeigt wird, wenn WinMove nicht funktioniert!' & @CRLF) ; ******************************************************************* Sleep(250) ; Vorsichtshalber noch etwas warten! (Teste auch mal ohne, oder evtl. erhöhen, wenn WinMove nicht klappt!) ; ^^^^^^^^^^^^^^^^^^ ; ******************************************************************* ;~ WinActivate($hApp) ; Für WinMove muss das Fenster nicht den Focus haben, der wäre z.B. nötig, wenn du Tastatureingaben mit Send an dieses Fenser schicken willst! $iLocation = $sLocation = "GP" ? 0 : 1 $iMove = WinMove($hWnd, "", $aWinPos[$iLocation][0], $aWinPos[$iLocation][1], $aWinPos[$iLocation][2], $aWinPos[$iLocation][3]) ; Verschiebt die Anwendung an obige Koordinaten ConsoleWrite('- $iMove = ' & $iMove & @CRLF) EndFunc ;==>_99_LotusNotes
Das hier
Send("{LWIN down}{UP}") ;
geht irgendwie nicht. Es öffnet sich hier das Windows Menü. Ich dachte ich hole mir vorher nochmals von Lotus Notes den Focus, aber irgendwie will das nicht
Durch das "down" bleibt LWIN gedrückt, solange kein {"LWIN up"} gesendet wird... das willst du aber gar nicht, deshalb einfach das "down" weglassen.
Für dein Vorhaben ist die Verwendung von Send eh absolut an keiner Stelle sinnvoll...
-
Schau dir in der AutoIt-Hilfe die Funktion _WinAPI_SetWindowsHookEx und die Beispiele dazu mal genauer an...
-
-
Teste das mal so...
Code
Alles anzeigenLocal $iWait, $hWnd04, $iPID_W_04 = Run(@AppDataDir & "\Telegram Desktop\Telegram.exe") ; Telegram starten If Not $iPID_W_04 Then _ErrExit(4, 'Fehler bei Run!') Do $hWnd04 = WinWaitActive("[TITLE:Telegram]", "", 1) ; Maximal 1 Sekunde warten, bis das Fenster von Telegram den Fokus hat. $iWait += 1 Until $hWnd04 Or $iWait = 20 If Not IsHWnd($hWnd04) Then _ErrExit(4, 'Fehler bei WinWaitActive!') Sleep(250) ; Vorsichtshalber noch etwas warten! (Teste auch mal ohne, oder evtl. erhöhen, wenn WinMove nicht klappt.) Send("1234{ENTER}"); schreibe den Login und drücke ENTER - Besser/sicherer wäre, wenn du hier ControlSend() benutzen würdest! WinMove($hWnd04, "", -840, 34, 840, 626) ; Verschiebt Telegram auf die X-Position von -840 und Y-Position von 34 und setzt die Höhe auf 840 und Breite auf 626 ; ... Func _ErrExit($iError, $sMsg, $iScriptLineNumber = @ScriptLineNumber) ConsoleWrite('! Error: ' & $iError & @TAB & $sMsg & @CRLF & '@@ ScriptLineNumber('&$iScriptLineNumber&') : <-- Mache einen Doppelklick auf diese Zeile, wenn SciTE zu der Zeile springen soll, in der _ErrExit aufgerufen wurde!' & @CRLF) Exit $iError EndFunc
-
Habe die in Post #3 von mir geänderte Binary.au3 nochmals ein wenig umgeändert.
Code
Alles anzeigen; 3. Change the Code in _BinaryAnd, _BinaryOR, _BinaryXOR, _BinaryNot, ; _BinaryShift, _BinaryRotate, _BinaryReverse, _BinaryInBin, _BinaryReplace, ; _BinaryRandom ; From: ; Static $CodeBufferPtr ; If Not $CodeBufferPtr Then ; Local $Code ; If @AutoItX64 Then ; $Code = Binary("0x...") ; Else ; $Code = Binary("0x...") ; EndIf ; $CodeBufferPtr = __BinaryCodeBufferAlloc($Code) ; EndIf ; To: ; Local Static $aCode = ["0x...(X86)", "0x...(X64)"], _ ; $CodeBufferPtr = __BinaryCodeBufferAlloc($aCode[@AutoItX64])
Und weil es zum Thema passt, findet ihr hier im Anhang noch eine kleine UDF von mir...
Funktionen: _BinaryMidAND, _BinaryMidNOT, _BinaryMidOR, _BinaryMidXOR
-
Schau dir dazu in der AutoIt-Hilfe die Beispiele zu der Funktion_Excel_RangeRead an...
-
Leider muss ich Dir sagen, dass das komplett am Thema vorbei ging.
Was genau ging komplett am Thema vorbei? Habe deinen Text gelesen und vermute mal, dass dir nicht ganz klar ist, wie eine ComboBox funktioniert.
Die Position 1 (also der Wert der ComboBox, den man sieht, wenn man die ComboBox nicht aufklappt), soll als InputBox dienen.
Der Satz ergibt so keinen Sinn... denn der Wert den du siehst, wenn die ComboBox nicht aufgeklappt ist, ist nicht zwingend der, der an Position 1 steht und "Die Position 1" kann nicht als InputBox dienen. Oder meinst du damit, dass nur dann eine Eingabe in das Input-Feld der ComboBox erlaubt sein soll, wenn der Wert, der an Position 1 steht, angezeigt wird, um einen Kunden hizuzufügen?
Mit dem Script von mir kannst du neue Einträge hinzufügen oder bestehende löschen.
Hinzufügen: Einen nicht vorhanden Namen in das Input-Feld der ComboBox (vorher evtl. leeren) eingeben, dann auf den Plus-Button drücken.
Entfernen: Einen Namen aus der aufgeklappten Liste der ComboBox auswählen, dann auf den Minus-Button drücken. Der Eintrag an Position 1 (Platzhalter) kann nicht gelöscht werden.
Es fehlt noch die Möglichkeit bestehende Einträge zu ändern. Dazu müsste die Nachricht $EN_CHANGE ausgewertet werden, die immer dann gesendet wird, wenn sich der Inhalt des Input-Feldes ändert. Diese Nachricht könnte man auch dafür nutzen, um die Liste der ComboBox anzuzeigen und in dieser den ersten Eintrag zu selektieren, der mit der Eingabe in dem Input-Feld übereinstimmt. Schau dir dazu in der AutoIt-Hilfe die Beispiele zu _GUICtrlEdit_Create an!
Anmerkung: Input-Controls existieren nur in AutoIt und sind vereinfacht gesagt Edit-Controls mit nur einer Zeile. Deshalb funktioniert $EN_CHANGE mit beiden. Das EN bei $EN_CHANGE steht übrigens für Edit Notification.
Wenn keiner der vordefinierten Einträge gelöscht oder geändert werden soll, ist das auch kein großes Ding... würde ich so aber nicht machen, denn auch hier kann sich ja was ändern und dann musst du diese Änderungen im Quellcode anpassen. Die vordefinierten Einträge würde ich nur beim ersten Start des Scripts verwenden, wenn noch keine Ini-Datei angelegt wurde. Danach dann nur die Werte aus der Ini-Datei verwenden, in der auch die vordefinierten Einträge gespeichert werden.
-
Meinst du das etwa so...
Code
Alles anzeigen#include <Array.au3> Global $hGui = GUICreate('Test') Global $sComboDefault = 'DB abfragen' Global $cCombo = GUICtrlCreateCombo($sComboDefault, 10, 10, 200) Global $sCombo = 'Val_1|Val_2|Val_3|Val_4' Global $aCombo = StringSplit($sComboDefault & '|' & $sCombo, '|', 2) GUICtrlSetData($cCombo, $sCombo) Global $cAdd = GUICtrlCreateButton('+', 220, 10, 20, 22) Global $cDel = GUICtrlCreateButton('-', 240, 10, 20, 22) GUISetState() Local $iIndex While True Switch GUIGetMsg() Case -3 Exit Case $cAdd $sCombo = GUICtrlRead($cCombo) $iIndex = _ArraySearch($aCombo, $sCombo) If @error Then ConsoleWrite("Add $sCombo --> " & $sCombo & @CRLF) $iIndex = _ArrayAdd($aCombo, $sCombo) $sCombo = _ArrayToString($aCombo, '|') ConsoleWrite('$sCombo = ' & $sCombo & @CRLF) GUICtrlSetData($cCombo, "|" & $sCombo, $aCombo[$iIndex]) EndIf Case $cDel $sCombo = GUICtrlRead($cCombo) $iIndex = _ArraySearch($aCombo, $sCombo) If Not @error And $aCombo[$iIndex] <> $sComboDefault Then ConsoleWrite("Remove $aCombo["&$iIndex&"] --> " & $aCombo[$iIndex] & @CRLF) _ArrayDelete($aCombo, $iIndex) $sCombo = _ArrayToString($aCombo, '|') ConsoleWrite('$sCombo = ' & $sCombo & @CRLF) GUICtrlSetData($cCombo, "|" & $sCombo, $aCombo[$iIndex -1]) EndIf EndSwitch WEnd
-
In Zeile 1764 werden die _Backup_Einstellungen() aufgerufen.Der _Text_Editor ab 1961 und _Text_Editor_WM_NOTIFY ab 2042.
Das ListView wird über die _Backup_Laufwerke_WM_Notify_EventsZeile 1517 gesteuert.Dem Text habe ich entnommen, dass du mehrere Funktionen registriert hast, um Nachrichten für die Windows Message ID WM_NOTIFY auszuwerten...
GUIRegisterMsg($WM_NOTIFY, "_Backup_Laufwerke_WM_Notify_Events")
GUIRegisterMsg($WM_NOTIFY, "_Backup_Protokoll_WM_Notify_Events")
GUIRegisterMsg($WM_NOTIFY, "_Text_Editor_WM_NOTIFY")
...das geht aber nicht, denn du kannst in deinem Script eine Message ID nur für eine Funktion registrieren - in deinem Fall ist dies nun _Text_Editor_WM_NOTIFY.
Die Funktionen kannst du aber leicht zusammenlegen und dann, wie ich weiter oben bereits angemerkt hatte, besser mit $hWndFrom anstelle $iIDFrom hantieren.
Code
Alles anzeigenFunc _WM_Notify($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $tEnLink, $cpMin, $cpMax, $tMsgFilter, $sLink Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") Local $iIDFrom = DllStructGetData($tNMHDR, 'IDFrom') Local $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $g_hBackup_Laufwerke_ListView Switch $iCode Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) ; Tu was... EndSwitch Case $g_hRestore_Laufwerke_ListView Switch $iCode Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) ; Tu was... EndSwitch Case $g_hLoglistView Switch $iCode Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) _Backup_Protokoll_OnLeftClick(DllStructGetData($tInfo, "Index")) Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) _Backup_Protokoll_OnRightClick(DllStructGetData($tInfo, "Index")) EndSwitch Case $g_hTextEditor Switch $iCode Case $EN_LINK $tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam) If DllStructGetData($tMsgFilter, "msg") = $WM_LBUTTONUP Then $tEnLink = DllStructCreate($tagENLINK, $iLparam) $cpMin = DllStructGetData($tEnLink, "cpMin") $cpMax = DllStructGetData($tEnLink, "cpMax") $sLink = _GUICtrlRichEdit_GetTextInRange($g_hTextEditor, $cpMin, $cpMax) ConsoleWrite($sLink & @LF) If StringRegExp($sLink, "^(/|\\\\)") Then ShellExecute($sLink) Else ;~ Run("Explorer.exe /e, " & $sLink) EndIf ; MsgBox, _ArrayDisplay, alles was blockierend ist, ist hier absolut tabu!!! EndIf EndSwitch ;~ Case ... EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>_WM_Notify
-
Wenn ich die beiden Zeilen...
Global $hBackup_Laufwerke_ListView = ControlGetHandle($hGUI, '', $Backup_Laufwerke_ListView)Global $hRestore_Laufwerke_ListView = ControlGetHandle($hGUI, '', $Restore_Laufwerke_ListView)
...vor der Funktion Platziere, erhalte ich die Meldung: Variable used without being declaredDas Handle für ein Control besorgst du dir direkt nachdem du es erstellt hast, also eine oder ein paar Zeilen darunter.
Code
Alles anzeigen; ... Global $Button_Stick_verschluesseln, $Backup_Einstellungen, $Backup_Einstellungen_Groesse, $Backup_Datenaufnahme, $Backup_Protokoll, $Backup_USB_Stick_GB, $Backup_Groesse_USB_Stick_GB, $Backup_Laufwerke_ListView, $hBackup_Laufwerke_ListView, $Backup_Zielpfad, $Backup_Label_ist_ein_USB_Stick_angeschlossen ; ... Global $Restore_Laufwerke_ListView, $hRestore_Laufwerke_ListView, $Restore_Pfad, $Restore_Laufwerk, $Restore_Laufwerke_Item, $Restore_Laufwerk_oeffnen ; ... $Restore_Laufwerke_ListView = GUICtrlCreateListView("Laufwerk|Typ|Dateisystem|Freier Speicher (GB)|Speicherkapazität (GB)|", 29, 60, 586, 83, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) $hRestore_Laufwerke_ListView = GUICtrlGetHandle($Restore_Laufwerke_ListView) GUICtrlSetColor(-1, 0x000000) GUICtrlSetBkColor(-1, 0xDBF4FF) GUICtrlSetCursor(-1, 0) ; Hand Icon ; ... $Backup_Laufwerke_ListView = GUICtrlCreateListView("Laufwerk|Typ|Dateisystem|Freier Speicher (GB)|Speicherkapazität (GB)|", 29, 60, 586, 83, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) GUICtrlSetColor(-1, 0x000000) GUICtrlSetBkColor(-1, 0xDBF4FF) GUICtrlSetCursor(-1, 0) ; Hand Icon $hBackup_Laufwerke_ListView = GUICtrlGetHandle($Backup_Laufwerke_ListView) ; ...
Zudem solltest du Variablen mit einem dem Typ entsprechenden Kürzel versehen... und globale Variablen sollten besser mit $g_ beginnen. Das hilft später ungemein bei der Fehlersuche!
Global $g_idRestore_Laufwerke_ListView ; CtrlID
Global $g_hRestore_Laufwerke_ListView ; Handle
Global $g_sIniFile = @ScriptDir & '\IniFile.ini' ; String
Global $g_iBackup_Einstellungen_Groesse ; Integer
Global $g_aDrives ; Array
Hier kannst du mehr dazu lesen: Best coding practices - AutoIt Wiki
Variablen ausserhalb von Funktionen sind übrigens immer global, auch wenn du sie mit DIM oder Local deklarierst!
-
Du holst dir einmal das Event ab und fragst immer dasselbe ab, du hast vergessen in der Schleife nochmal GUIGetMsg() in $nMsg zu speichern.
Hihi, ja, ich Depp... danke - habe es korrigiert.
-
Die CPU-Last ist viel zu hoch
Das liegt an deinem Main-Loop, bzw. deiner While-Schleife...
CodeWhile 1 Global $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Sleep(100) ; Das macht hier ja unheimlich viel Sinn! ;-) EndSwitch WEnd
Im MsgMode wäre sie bis auf das überflüssige Sleep() fast korrekt... fast, weil die Variable $nMsg vor dem Loop deklariert werden sollte und anstelle des Global ein Local völlig ausreichend wäre.
Code
Alles anzeigenLocal $nMsg While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd ; oder so, wenn die Message nur als Parameter für Switch benötigt wird. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd
Im MsgMode schaltet die Funktion GUIGetMsg die CPU bei Bedarf automatisch in den Idle-Mode (Leerlauf), sodass sie in Schleifen sicher verwendet werden kann, ohne die gesamte CPU zu belasten.
Da du aber mit allen GUI's im OnEventMode arbeitest, sollte deine While-Schleife (Main-Loop) so aussehen:
Wenn ich einen der Buttons, Einstellungen, Datenaufnahme oder Protokoll klicke, kann ich danach kein Laufwerk mehr wählen.
Was muss ich tun um das ListView zu reaktivieren?
Ich will dein Script bei mir nicht starten, weil sich die Spuren nur schwer beseitigen lassen. Meinst du mit Laufwerk auswählen geht danach nicht mehr, dass du keine Benachrichtigung mehr bekommst, wenn du mit der Maus in das Listview $Backup_Laufwerke_ListView bzw. $Restore_Laufwerke_ListView klickst?
Hier noch ein paar Dinge, die mir beim Überfliegen deines Codes aufgefallen sind:
Funktion _Bytes_KB_MB_GB
Siehe _WinAPI_StrFormatByteSize, _WinAPI_StrFormatByteSizeEx und _WinAPI_StrFormatKBSize
Code: __On_ButtonSwitch @GUI_CtrlId Case $GUI_EVENT_CLOSE ; <-- wird von __On_Close verarbeitet und trifft hier somit niemals zu
Aus __On_Close und __On_Button würde ich eine Funktion __On_Event machen... alle Events in einer Funktion.
Funktion _Laufwerke_ListViewBox
If @UserName = @UserName Or @UserName = @UserName Then
Hust... das macht natürlich Sinn...
Funktion _Backup_Laufwerke_WM_Notify_Events
Hier hast du bei #forceref $hWndGUI als Parameter angegeben... wobei $hWndGUI aber nirgends deklariert wird. Richtig wäre hier wohl $hWnd.
Wenn man mit mehreren GUI's hantierst, kann die Frage nach der ControlID u.U. ins Auge gehen, deshalb sollte dafür anstelle der ControlID besser das Handle des Controls verwendet werden.
Code
Alles anzeigen; ... Global $hBackup_Laufwerke_ListView = ControlGetHandle($hGUI, '', $Backup_Laufwerke_ListView) Global $hRestore_Laufwerke_ListView = ControlGetHandle($hGUI, '', $Restore_Laufwerke_ListView) ; ... Func _Backup_Laufwerke_WM_Notify_Events($hWnd, $MsgID, $wParam, $lParam) #forceref $hWnd, $MsgID, $wParam Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom") Local $nNotifyCode = DllStructGetData($tNMHDR, "Code") Local $iIDFrom = DllStructGetData($tNMHDR, 'IDFrom') Switch $hWndFrom Case $hBackup_Laufwerke_ListView If $nNotifyCode = $NM_CLICK Then ; ... EndIf Case $hRestore_Laufwerke_ListView If $nNotifyCode = $NM_CLICK Then ; ... EndIf EndSwitch ; ... Return $GUI_RUNDEFMSG EndFunc ;==>_Backup_Laufwerke_WM_Notify_Events
_GDIPlus_Startup() / _GDIPlus_Shutdown()
_GDIPlus_Startup() solltest du einmalig beim Start ausführen, und _GDIPlus_Shutdown() ebenso, wenn das Script beendet wird.
Code_GDIPlus_Startup() OnAutoItExitRegister('_Exit') ; Tu was... Exit Func _Exit() _GDIPlus_Shutdown() EndFunc
Laufvariablen würde ich nicht im globalen Kontext benutzen, weil dies später zu extrem schwer auffindbaren Fehlern führen kann. Analog dazu würde ich es auch möglichst vermeiden, globale Variablen innerhalb von Funktionen und Schleifen (s. Main-Loop) zu deklarieren.
-
Oder gibt es noch eine ganz andere Möglichkeit die installierten Drucker auszulesen?
Ja, gibt es... hier ein Bsp.:
C
Alles anzeigen;~ #include <WinAPI.au3> ; AutoIt <= 3.3.14.2 #include <WinAPIConv.au3> ; AutoIt >= 3.3.14.3 _Example() Func _Example() Local $aComputer = _GetComputer() ConsoleWrite('$aComputer = ' & Join($aComputer, ',') & @CRLF & @CRLF) If IsArray($aComputer) Then For $i = 0 To UBound($aComputer) - 1 Step 1 _GetPrintersInfo($aComputer[$i]) If @error Then ConsoleWrite('! Keine Antwort von "' & $aComputer[$i] & '" bekommen!' & @CRLF & @CRLF) Next EndIf EndFunc ;==>_Example Func _GetPrintersInfo($strComputer = ".") Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") If Not IsObj($objWMIService) Then Return SetError(1) Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer", 'WQL', 48) For $objItem In $colItems ConsoleWrite("-------------------------------------------" & @CRLF) ConsoleWrite("Win32_Printer instance from '" & $strComputer & "'" & @CRLF) ConsoleWrite("-------------------------------------------" & @CRLF) ConsoleWrite("Attributes : " & $objItem.Attributes & @CRLF) ConsoleWrite("Availability : " & $objItem.Availability & @CRLF) ConsoleWrite("AvailableJobSheets : " & Join($objItem.AvailableJobSheets, ",") & @CRLF) ConsoleWrite("AveragePagesPerMinute : " & $objItem.AveragePagesPerMinute & @CRLF) ConsoleWrite("Capabilities : " & Join($objItem.Capabilities, ",") & @CRLF) ConsoleWrite("CapabilityDescriptions : " & Join($objItem.CapabilityDescriptions, ",") & @CRLF) ConsoleWrite("Caption : " & $objItem.Caption & @CRLF) ConsoleWrite("CharSetsSupported : " & Join($objItem.CharSetsSupported, ",") & @CRLF) ConsoleWrite("Comment : " & $objItem.Comment & @CRLF) ConsoleWrite("ConfigManagerErrorCode : " & $objItem.ConfigManagerErrorCode & @CRLF) ConsoleWrite("ConfigManagerUserConfig : " & $objItem.ConfigManagerUserConfig & @CRLF) ConsoleWrite("CreationClassName : " & $objItem.CreationClassName & @CRLF) ConsoleWrite("CurrentCapabilities : " & Join($objItem.CurrentCapabilities, ",") & @CRLF) ConsoleWrite("CurrentCharSet : " & $objItem.CurrentCharSet & @CRLF) ConsoleWrite("CurrentLanguage : " & $objItem.CurrentLanguage & @CRLF) ConsoleWrite("CurrentMimeType : " & $objItem.CurrentMimeType & @CRLF) ConsoleWrite("CurrentNaturalLanguage : " & $objItem.CurrentNaturalLanguage & @CRLF) ConsoleWrite("CurrentPaperType : " & $objItem.CurrentPaperType & @CRLF) ConsoleWrite("Default : " & $objItem.Default & @CRLF) ConsoleWrite("DefaultCapabilities : " & Join($objItem.DefaultCapabilities, ",") & @CRLF) ConsoleWrite("DefaultCopies : " & $objItem.DefaultCopies & @CRLF) ConsoleWrite("DefaultLanguage : " & $objItem.DefaultLanguage & @CRLF) ConsoleWrite("DefaultMimeType : " & $objItem.DefaultMimeType & @CRLF) ConsoleWrite("DefaultNumberUp : " & $objItem.DefaultNumberUp & @CRLF) ConsoleWrite("DefaultPaperType : " & $objItem.DefaultPaperType & @CRLF) ConsoleWrite("DefaultPriority : " & $objItem.DefaultPriority & @CRLF) ConsoleWrite("Description : " & $objItem.Description & @CRLF) ConsoleWrite("DetectedErrorState : " & $objItem.DetectedErrorState & @CRLF) ConsoleWrite("DeviceID : " & $objItem.DeviceID & @CRLF) ConsoleWrite("Direct : " & $objItem.Direct & @CRLF) ConsoleWrite("DoCompleteFirst : " & $objItem.DoCompleteFirst & @CRLF) ConsoleWrite("DriverName : " & $objItem.DriverName & @CRLF) ConsoleWrite("EnableBIDI : " & $objItem.EnableBIDI & @CRLF) ConsoleWrite("EnableDevQueryPrint : " & $objItem.EnableDevQueryPrint & @CRLF) ConsoleWrite("ErrorCleared : " & $objItem.ErrorCleared & @CRLF) ConsoleWrite("ErrorDescription : " & $objItem.ErrorDescription & @CRLF) ConsoleWrite("ErrorInformation : " & Join($objItem.ErrorInformation, ",") & @CRLF) ConsoleWrite("ExtendedDetectedErrorState : " & $objItem.ExtendedDetectedErrorState & @CRLF) ConsoleWrite("ExtendedPrinterStatus : " & $objItem.ExtendedPrinterStatus & @CRLF) ConsoleWrite("Hidden : " & $objItem.Hidden & @CRLF) ConsoleWrite("HorizontalResolution : " & $objItem.HorizontalResolution & @CRLF) ConsoleWrite("InstallDate : " & $objItem.InstallDate & @CRLF) ConsoleWrite("JobCountSinceLastReset : " & $objItem.JobCountSinceLastReset & @CRLF) ConsoleWrite("KeepPrintedJobs : " & $objItem.KeepPrintedJobs & @CRLF) ConsoleWrite("LanguagesSupported : " & Join($objItem.LanguagesSupported, ",") & @CRLF) ConsoleWrite("LastErrorCode : " & $objItem.LastErrorCode & @CRLF) ConsoleWrite("Local : " & $objItem.Local & @CRLF) ConsoleWrite("Location : " & $objItem.Location & @CRLF) ConsoleWrite("MarkingTechnology : " & $objItem.MarkingTechnology & @CRLF) ConsoleWrite("MaxCopies : " & $objItem.MaxCopies & @CRLF) ConsoleWrite("MaxNumberUp : " & $objItem.MaxNumberUp & @CRLF) ConsoleWrite("MaxSizeSupported : " & $objItem.MaxSizeSupported & @CRLF) ConsoleWrite("MimeTypesSupported : " & Join($objItem.MimeTypesSupported, ",") & @CRLF) ConsoleWrite("Name : " & $objItem.Name & @CRLF) ConsoleWrite("NaturalLanguagesSupported : " & Join($objItem.NaturalLanguagesSupported, ",") & @CRLF) ConsoleWrite("Network : " & $objItem.Network & @CRLF) ConsoleWrite("PaperSizesSupported : " & Join($objItem.PaperSizesSupported, ",") & @CRLF) ConsoleWrite("PaperTypesAvailable : " & Join($objItem.PaperTypesAvailable, ",") & @CRLF) ConsoleWrite("Parameters : " & $objItem.Parameters & @CRLF) ConsoleWrite("PNPDeviceID : " & $objItem.PNPDeviceID & @CRLF) ConsoleWrite("PortName : " & $objItem.PortName & @CRLF) ConsoleWrite("PowerManagementCapabilities: " & Join($objItem.PowerManagementCapabilities, ",") & @CRLF) ConsoleWrite("PowerManagementSupported : " & $objItem.PowerManagementSupported & @CRLF) ConsoleWrite("PrinterPaperNames : " & _WideCharToMultiByte(Join($objItem.PrinterPaperNames, ",")) & @CRLF) ConsoleWrite("PrinterState : " & $objItem.PrinterState & @CRLF) ConsoleWrite("PrinterStatus : " & $objItem.PrinterStatus & @CRLF) ConsoleWrite("PrintJobDataType : " & $objItem.PrintJobDataType & @CRLF) ConsoleWrite("PrintProcessor : " & $objItem.PrintProcessor & @CRLF) ConsoleWrite("Priority : " & $objItem.Priority & @CRLF) ConsoleWrite("Published : " & $objItem.Published & @CRLF) ConsoleWrite("Queued : " & $objItem.Queued & @CRLF) ConsoleWrite("RawOnly : " & $objItem.RawOnly & @CRLF) ConsoleWrite("SeparatorFile : " & $objItem.SeparatorFile & @CRLF) ConsoleWrite("ServerName : " & $objItem.ServerName & @CRLF) ConsoleWrite("Shared : " & $objItem.Shared & @CRLF) ConsoleWrite("ShareName : " & $objItem.ShareName & @CRLF) ConsoleWrite("SpoolEnabled : " & $objItem.SpoolEnabled & @CRLF) ConsoleWrite("StartTime : " & $objItem.StartTime & @CRLF) ConsoleWrite("Status : " & $objItem.Status & @CRLF) ConsoleWrite("StatusInfo : " & $objItem.StatusInfo & @CRLF) ConsoleWrite("SystemCreationClassName : " & $objItem.SystemCreationClassName & @CRLF) ConsoleWrite("SystemName : " & $objItem.SystemName & @CRLF) ConsoleWrite("TimeOfLastReset : " & $objItem.TimeOfLastReset & @CRLF) ConsoleWrite("UntilTime : " & $objItem.UntilTime & @CRLF) ConsoleWrite("VerticalResolution : " & $objItem.VerticalResolution & @CRLF) ConsoleWrite("WorkOffline : " & $objItem.WorkOffline & @CRLF & @CRLF) Next EndFunc ;==>_GetPrintersInfo Func _GetComputer() Local $iPID = Run('net view', '', @SW_HIDE, $STDOUT_CHILD) ProcessWaitClose($iPID) Return StringRegExp(StdoutRead($iPID), '(?m)\\\\([\w|-]+)', 3) EndFunc ;==>_GetComputer Func Join($aArray, $sDelimiter) Local $sJoin If IsArray($aArray) Then For $sItem In $aArray $sJoin &= $sItem & $sDelimiter Next EndIf Return $sJoin ? StringTrimRight($sJoin, 1) : '' EndFunc ;==>Join ; Konvertiert den Text, damit Umlaute und Sonderzeichen in SciTE und in der Eingabeaufforderung korrekt dargestellt werden! Func _WideCharToMultiByte($vText, $iCodePage = @Compiled ? 1 : 65001, $bRetNoStruct = True, $bRetBinary = False) $vText = String($vText) ; Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde! Return _WinAPI_WideCharToMultiByte($vText, $iCodePage, $bRetNoStruct, $bRetBinary) EndFunc ;==>_WideCharToMultiByte
-
Hallo Bitnugger,
war Du schon dabei und hast ein neues Script erstellen können ? *VorsichtigFragNach*
Würde mich wirklich freuen, wenn Du da noch etwas machen würdest.Das Grundgerüst für dein Script habe ich bereits fertig und du stehst auch ganz oben auf meiner privaten ToDo-List... ich habe zu deinem Leidwesen aber auch noch eine geschäftliche ToDo-List... und die hat eine höhere Priorität. Ich denke, die werde ich zum WE hin abgearbeitet haben und dann bist du wieder dran.
-
Schau dir mal in der Hilfe die Syntax zu GUIGetMsg() an...
-
Ich wage kaum zu fragen , aber könntest Du Dich mit der Idee anfreunden im Header deiner UDF einen Modified-Eintrag zu machen, z.B. :
Habe meinen Post #3 editiert und im Header in der von mir geänderten UDF im Anhang vermerkt, was ich wo geändert habe.
-
Hast Du dort irgendwelche Änderungen vorgenommen ?
Ja, habe ich.
In dem Script, in dem ich die UDF verwende, benutze ich die AutoIt3Wrapper-Direktive:
#AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
Mit der Original-UDF bricht das Script dann mit Fehlermeldungen ab, weil die Variablen in den Zeilen 408-410 nicht verwendet werden. Deshalb habe ich die Zeilen auskommentiert - ähnlich auch in Zeile 487, wegen dem $Ret.
Die Funktionen _BitXOR64, _BitAND64 und _BitOR64 habe ich so umgestrickt, dass anstatt 20 Parameter nun 255 übergeben werden können, so wie es bei BitXOR usw. in AutoIt ist.