Tratsch rund um Autoit / Autoit Talk | kleinere Fragen

10/29/2012 01:54 Dr.Toni-old#586
Ein Release würde sich lohnen :)
Hilft den Newbies :)
10/29/2012 11:34 -STORM-#587
Ehrlich gesagt würde ich Anfängern davon abraten.
Dabei entsteht bloß Code, den sie nicht verstehen. Ist ähnlich wie mit den Koda GUIs.
Um eine Sprache zu lernen, sollte man lieber alles selbst schreiben.
10/29/2012 13:00 Havelock_Vetinari#588
Quote:
Originally Posted by she was 8 View Post
meinste
@ScriptDir
@ScriptFullPath
@WorkingDir
@DesktopCommonDir
@DesktopDir

usw?
Nein eben nicht^^

Das Programm liegt an ort x und wird ausgeführt . Ich möchte das Verzeichnis in dem ich mich befunden habe , bevor ich das Programm gestartet habe herausfinden ( das Programm wird durch ein Makro meiner Tastatur gestartet)
10/29/2012 13:05 -STORM-#589
Was genau meinst du mit Ort?
In welchem Programm du bist, also aktives Fenster?
Oder bist du immer im Windows Explorer, und willst dort den Ordner rausfinden?
10/29/2012 14:01 Lawliet#590
Also ich denke er meint wenn er vom Ordner X1 (z.B. C:\user\Desktop) auf Ordner X2 wechselt (z.B. C:\user\Desktop\Programme) und sein Programm startet, dann soll sein Programm X1 ausgeben.
Das geht nicht
10/29/2012 14:13 Havelock_Vetinari#591
Ok , ich erkläre wohl besser was ich vorhabe damit es hier etwas klarer wird :)

Ich möchte mir ein Programm schreiben , welches mir eine Datei an dem Ort erstellt , an dem ich bin ( Desktop , C:\x\x\xxxxx) . Also das programm fragt meine Tastendrücke ab und soll dann , an dem Ort ( wie oben schon , irgendein Verzeichnis etc...) an dem ich mich befinde , anhand der Tastendrücke eine Datei für mich erstellen ( ich drücke a = .au3 wird erstellt , b = .bat wird erstellt)

Das Programm lasse ich dann durch ein Makro meiner g15 (gamer-tastatur mit zusätzlichen Tasten um sie mit Makros zu belegen . Ich drücke also nur die taste um das Programm zu starten , wechsle nicht das Verzeichnis ( Das einzige Problem ist dann , dass das Programm dann sozusagen "über" dem Verzeichnis steht)) starten. So weit so gut ... Ist auch alles nicht schwer , das einzige Problem das ich habe ist , dass ich nicht weiß wie ich den genauen Ort an dem ich mich gerade befinde ( Desktop , C:\xxxxxxxx\.....) herausfinden kann ...

( Das Programm soll mir halt dort wo ich mich gerade aufhalte meine Dateien erstellen)

Hoffe das bringt ein wenig klarheit^^
10/29/2012 14:23 -STORM-#592
Hab es mir nochmal durchgelesen, und wenn ich dich richtig verstanden habe, passt das Beispiel:
Code:
#include <Process.au3> ;// für _ProcessGetName

;// falls Explorer geöffnet ist wird Adresse zurückgegeben, andernfalls wird leerer Wert zurückgegeben und @error auf 1 gesetzt
Func _GetDirectory()
	Local $WinHandle = WinGetHandle("") ;// ohne Parameter automatisch Handle des aktiven Fensters zurückgegeben ==> Ausgangswert für weiteres Überprüfen
	Local $WinPID = WinGetProcess($WinHandle) ;// zugehörigen Prozess finden ==> Ausganswert für Prozess-Namen
	Local $ProcName = _ProcessGetName($WinPID) ;//Prozess-Name (später nach explorer.exe überprüfen)

	Local $WinText = WinGetText($WinHandle) ;// erste Zeile gibt Pfad an falls $ProcName==explorer.exe

	Local $directory ;//Variable definieren zum späteren Speichern der Adresse
	If $ProcName == "explorer.exe" Then
		Local $CutFirstLine = StringSplit($WinText, @CRLF) ;// einzelne Zeilen von WinText splitten ==> Adresse steht in erster Zeile
		If $CutFirstLine[0] > 0 Then ;// falls $CutFirstLine[1] existiert
			$directory = StringTrimLeft($CutFirstLine[1], StringLen("Adresse: ")) ;// "Adresse: " vom String (erste Zeile) abschneiden
		EndIf
		MsgBox(0,"Directory",$directory) ;// erhaltene Adresse anzeigen
	Else
		SetError(1)
	EndIf

	Return $directory
EndFunc
Quote:
Originally Posted by Lawliet! View Post
Also ich denke er meint wenn er vom Ordner X1 (z.B. C:\user\Desktop) auf Ordner X2 wechselt (z.B. C:\user\Desktop\Programme) und sein Programm startet, dann soll sein Programm X1 ausgeben.
Das geht nicht
Würde mit meinem Beispiel auch gehen , indem man die Adresse des aktiven Explorerfensters global speichert und auf Veränderung überprüft.
Pseudocode:
Code:
If $address_new <> $address_previous Then MsgBox(0,"vorheriges Verzeichnis",$address_previous)
Oder habe ich dich missverstanden?
10/29/2012 14:29 Achat#593
Hmm vielleicht kannst du da ja irgendwie was mit der Registry machen.
Dein Programm soll ja das selbe machen wie
Rechtsklick ->> Neu ->> Datei ??

MfG
10/29/2012 14:31 Havelock_Vetinari#594
Quote:
Originally Posted by -STORM- View Post
Hab es mir nochmal durchgelesen, und wenn ich dich richtig verstanden habe, passt das Beispiel:
Code:
#include <Process.au3> ;// für _ProcessGetName

;// falls Explorer geöffnet ist wird Adresse zurückgegeben, andernfalls wird leerer Wert zurückgegeben und @error auf 1 gesetzt
Func _GetDirectory()
	Local $WinHandle = WinGetHandle("") ;// ohne Parameter automatisch Handle des aktiven Fensters zurückgegeben ==> Ausgangswert für weiteres Überprüfen
	Local $WinPID = WinGetProcess($WinHandle) ;// zugehörigen Prozess finden ==> Ausganswert für Prozess-Namen
	Local $ProcName = _ProcessGetName($WinPID) ;//Prozess-Name (später nach explorer.exe überprüfen)

	Local $WinText = WinGetText($WinHandle) ;// erste Zeile gibt Pfad an falls $ProcName==explorer.exe

	Local $directory ;//Variable definieren zum späteren Speichern der Adresse
	If $ProcName == "explorer.exe" Then
		Local $CutFirstLine = StringSplit($WinText, @CRLF) ;// einzelne Zeilen von WinText splitten ==> Adresse steht in erster Zeile
		If $CutFirstLine[0] > 0 Then ;// falls $CutFirstLine[1] existiert
			$directory = StringTrimLeft($CutFirstLine[1], StringLen("Adresse: ")) ;// "Adresse: " vom String (erste Zeile) abschneiden
		EndIf
		MsgBox(0,"Directory",$directory) ;// erhaltene Adresse anzeigen
	Else
		SetError(1)
	EndIf

	Return $directory
EndFunc

Würde mit meinem Beispiel auch gehen , indem man die Adresse des aktiven Explorerfensters global speichert und auf Veränderung überprüft.
Pseudocode:
Code:
If $address_new <> $address_previous Then MsgBox(0,"vorheriges Verzeichnis",$address_previous)
Oder habe ich dich missverstanden?
Genau das isses :) Danke

Quote:
Originally Posted by Achat View Post
Hmm vielleicht kannst du da ja irgendwie was mit der Registry machen.
Dein Programm soll ja das selbe machen wie
Rechtsklick ->> Neu ->> Datei ??

MfG
Ja , so ungefähr ^^
10/30/2012 23:45 ExChill#595
Hallo,

habe folgenden Code:

PHP Code:
#include <Array.au3>
#include <Process.au3>


Global $aProcess ProcessList()
Global 
$apRAM[UBound($aProcess)-1][2]

For 
$i 0 To UBound($aProcess)-1
    $aRAM 
ProcessGetStats($aProcess[$i][1])
    
$apRAM[1][1] = $aRAM
Next

_ArrayDisplay 
($aRAM)
_ArrayDisplay ($apRAM
$aRAM wird korrekt angezeigt.
In $apRAM wird jedoch logischerweise kein Wert eingetragen, da hinter $aRAM nichts steht.

Wenn ich jedoch diesen Code benutze:

PHP Code:
#include <Array.au3>
#include <Process.au3>


Global $aProcess ProcessList()
Global 
$apRAM[UBound($aProcess)-1][2]

For 
$i 0 To UBound($aProcess)-1
    $aRAM 
ProcessGetStats($aProcess[$i][1])
    
$apRAM[1][1] = $aRAM[0] ;<=== [0ergänzt
Next

_ArrayDisplay 
($aRAM)
_ArrayDisplay ($apRAM
bekomme ich den Fehler

Quote:
Subscript used with non-Array variable.:
$apRAM[1][1] = $aRAM[0]
$apRAM[1][1] = $aRAM^ ERROR
$aRAM ist jedoch ein Array, was sich mit _ArrayDisplay ja sogar anzeigen lässt.

Ich hoffe ihr könnt mir helfen :)

MfG ExChill
10/30/2012 23:48 -STORM-#596
Arrays werden mit Dim definiert.
10/30/2012 23:53 Requiable#597
Wäre jemand so nett und kann mir ein ausführliches WinHttp Tutorial schicken? Möchte einen kleinen Packet Bot schreiben für nen total unbekanntes Browsergame ;)

Danke im Vorraus
10/30/2012 23:59 Achat#598
Quote:
Originally Posted by -STORM- View Post
Arrays werden mit Dim definiert.
Oder mit local oder global. Dim benutze ich nie.

Quote:
Originally Posted by Requiable View Post
Wäre jemand so nett und kann mir ein ausführliches WinHttp Tutorial schicken? Möchte einen kleinen Packet Bot schreiben für nen total unbekanntes Browsergame ;)

Danke im Vorraus
Sufu von epvp benutzen, Google benutzen,

Es gibt keine ausführlichen Tutorials, alle Tutorials zusammen sind vielleicht ausführlich.

MfG
10/31/2012 00:29 KDeluxe#599
Quote:
Originally Posted by ExChill View Post
Hallo,

habe folgenden Code:

PHP Code:
#include <Array.au3>
#include <Process.au3>


Global $aProcess ProcessList()
Global 
$apRAM[UBound($aProcess)-1][2]

For 
$i 0 To UBound($aProcess)-1
    $aRAM 
ProcessGetStats($aProcess[$i][1])
    
$apRAM[1][1] = $aRAM
Next

_ArrayDisplay 
($aRAM)
_ArrayDisplay ($apRAM
$aRAM wird korrekt angezeigt.
In $apRAM wird jedoch logischerweise kein Wert eingetragen, da hinter $aRAM nichts steht.

Wenn ich jedoch diesen Code benutze:

PHP Code:
#include <Array.au3>
#include <Process.au3>


Global $aProcess ProcessList()
Global 
$apRAM[UBound($aProcess)-1][2]

For 
$i 0 To UBound($aProcess)-1
    $aRAM 
ProcessGetStats($aProcess[$i][1])
    
$apRAM[1][1] = $aRAM[0] ;<=== [0ergänzt
Next

_ArrayDisplay 
($aRAM)
_ArrayDisplay ($apRAM
bekomme ich den Fehler



$aRAM ist jedoch ein Array, was sich mit _ArrayDisplay ja sogar anzeigen lässt.

Ich hoffe ihr könnt mir helfen :)

MfG ExChill
$aRam ist aber nicht immer ein Array. Du gehst alle Prozesse durch, sobald bei einem der Rückgabewert von ProcessGetStats() kein Array ist, stürzt dein Programm ab.
Was kann man da machen? Auf Fehler überprüfen oder prüfen, ob es sich um ein Array handelt.
Abgesehen davon beinhaltet das erste Element von $aProcess keine ProzessID, sondern die Anzahl der gefundenen Prozesse. Du musst also auch bei 1 und nicht bei 0 beginnen. UBound() wird überhaupt nicht benötigt.

Hier mal ein Beispiel:
Code:
#include <Array.au3>

Global $aProcess = ProcessList()
Global $apRAM[$aProcess[0][0]][2]

For $i = 1 To $aProcess[0][0]
	$apRAM[$i - 1][0] = $aProcess[$i][1]
	$aRAM = ProcessGetStats($aProcess[$i][1])
	If IsArray($aRAM) Then
		$apRAM[$i - 1][1] = $aRAM[0]
	Else
		$apRAM[$i - 1][1] = 0
	EndIf
Next
_ArrayDisplay($apRAM)
10/31/2012 03:54 Achat#600
Wie kann ich herausfinden, ob das Maus-Rad nach oben oder unten bewegt wurde?

MfG