|
You last visited: Today at 01:46
Advertisement
Konsolenproblem (SetConsoleCursorPosition)
Discussion on Konsolenproblem (SetConsoleCursorPosition) within the AutoIt forum part of the Coders Den category.
03/20/2014, 14:58
|
#1
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
Konsolenproblem (SetConsoleCursorPosition)
Guten Tag
ich bin Neueinsteiger in AutoIT, komme von C++ und habe die wunderbare Eigenschaft von AutoIT gefunden, einfach dynamische Bibliotheken zu nutzen um die Begrenztheit mehr oder minder auszugleichen.
Also wollte ich ein wenig an der Konsole rumfrickeln, funktioniert auch bisher, allerdings habe ich folgendes Problem:
Code:
func consoleSetCursorPosition($x, $y)
Local $coords = DllStructCreate("INT X;INT Y") _
, $kernel = DllOpen("kernel32.dll") _
, $handle
DllStructSetData($coords, "X", $x)
DllStructSetData($coords, "Y", $y)
$handle = DllCall($kernel, "HANDLE", "GetStdHandle", _
"DWORD", $STD_OUTPUT_HANDLE)
if($handle[0] = 0) Then SetError(1, 0, -1)
$result = DllCall($kernel, "BOOL", "SetConsoleCursorPosition", _
"HANDLE", $handle, _
"struct",$coords)
DllClose($kernel)
return BitNot(BitNot($result)) ; -> !!result
EndFunc
Die Methode gibt mir immer false zurück. Weiß jemand worans liegt?
als Parameter habe ich einfach "struct" als Typ gewählt, da structs wie "COORD" ja nicht registriert sind. Scheint aber nicht zu funktionieren. Handle der Konsole ist gegeben. Error wird nicht gesetzt (Aufruf war erfolgreich), schreibt jedoch in die Variable [0]:0, [1]:0x000..0, Extended wird auf 6 gesetzt (GetLastError()).
Doku zu SetConsoleCursorPosition:
 .
Vielen Dank im Voraus
|
|
|
03/20/2014, 16:25
|
#2
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Da kommen Variablen vor die gar nicht deklariert wurden, wie wäre es denn wenn du uns ein Beispiel zippst und hochlädst?
|
|
|
03/21/2014, 08:23
|
#3
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
$STD_OUTPUT_HANDLE = 0xfffffff5, wie in Winbase.h definiert.
$result ist eine neue Variable, sollte eigentlich in der Deklaration im Kopf der Methode stehen. Alle anderen Variablen sind lokal.
|
|
|
04/01/2014, 15:34
|
#4
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
*bump* jemand ne Idee?
|
|
|
04/01/2014, 15:55
|
#5
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by DarkCrusade2
Guten Tag
ich bin Neueinsteiger in AutoIT, komme von C++ und habe die wunderbare Eigenschaft von AutoIT gefunden, einfach dynamische Bibliotheken zu nutzen um die Begrenztheit mehr oder minder auszugleichen.
Also wollte ich ein wenig an der Konsole rumfrickeln, funktioniert auch bisher, allerdings habe ich folgendes Problem:
Code:
func consoleSetCursorPosition($x, $y)
Local $coords = DllStructCreate("INT X;INT Y") _
, $kernel = DllOpen("kernel32.dll") _
, $handle
DllStructSetData($coords, "X", $x)
DllStructSetData($coords, "Y", $y)
$handle = DllCall($kernel, "HANDLE", "GetStdHandle", _
"DWORD", $STD_OUTPUT_HANDLE)
if($handle[0] = 0) Then SetError(1, 0, -1)
$result = DllCall($kernel, "BOOL", "SetConsoleCursorPosition", _
"HANDLE", $handle, _
"struct",$coords)
DllClose($kernel)
return BitNot(BitNot($result)) ; -> !!result
EndFunc
Die Methode gibt mir immer false zurück. Weiß jemand worans liegt?
als Parameter habe ich einfach "struct" als Typ gewählt, da structs wie "COORD" ja nicht registriert sind. Scheint aber nicht zu funktionieren. Handle der Konsole ist gegeben. Error wird nicht gesetzt (Aufruf war erfolgreich), schreibt jedoch in die Variable [0]:0, [1]:0x000..0, Extended wird auf 6 gesetzt (GetLastError()).
Doku zu SetConsoleCursorPosition:
 .
Vielen Dank im Voraus 
|
schau doch einfach mal in die dokumentation zu DllCall:
Quote:
If the function call fails then @error is set to non-zero.
Otherwise an array is returned that contains the function return value and a copy of all the parameters (including parameters that the function may have modified when passed by reference).
$return[0] = function return value
$return[1] = param1
$return[2] = param2
...
$return[n] = paramn
|
DllCall gibt immer ein array zurück (wenn der funktionsaufruf nicht fehlschlägt). fragt man ein beliebiges array als normale variable ab, so wird IMMER False (0) zurück gegeben.
entsprechend kann $result bei dir nur false zurück geben.
|
|
|
04/01/2014, 16:59
|
#6
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
Quote:
Originally Posted by lolkop
schau doch einfach mal in die dokumentation zu DllCall:
DllCall gibt immer ein array zurück (wenn der funktionsaufruf nicht fehlschlägt). fragt man ein beliebiges array als normale variable ab, so wird IMMER False (0) zurück gegeben.
entsprechend kann $result bei dir nur false zurück geben.
|
Die Funktion selber gibt BOOL zurück. Eine ähnliche Funktion ist MoveWindow(). Diese schreibt mir "true" in $result, wenn sie ausgeführt wurde (also setzt den Bitwert auf != 0).
|
|
|
04/01/2014, 17:22
|
#7
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by DarkCrusade2
Die Funktion selber gibt BOOL zurück. Eine ähnliche Funktion ist MoveWindow(). Diese schreibt mir "true" in $result, wenn sie ausgeführt wurde (also setzt den Bitwert auf != 0).
|
du scheinst nicht zu verstehen, das dllcalls arrays zurück geben...
Code:
Dim $array[1]=[5]
ConsoleWrite(Not $array&@CRLF)
wird immer True zurückgeben... 5!=0 und somit True in Autoit. Da $array aber ohne index verwendet wurde, ist $array immer False.
Code:
Dim $array[1]=[5]
ConsoleWrite(Not $array[0]&@CRLF)
hingegen gibt wie erwartet False zurück da der Index auf das erste element verweist.
in deinem beispiel musst du entsprechend $result[0] nutzen, um den ersten eintrag des ergebnisarrays zu erhalten.
korrekt wäre also zb:
Code:
Func consoleSetCursorPosition($x, $y)
Local $coords = DllStructCreate("INT X;INT Y") _
, $kernel = DllOpen("kernel32.dll") _
, $handle
DllStructSetData($coords, "X", $x)
DllStructSetData($coords, "Y", $y)
$handle = DllCall($kernel, "HANDLE", "GetStdHandle", _
"DWORD", $STD_OUTPUT_HANDLE)
if($handle[0] = 0) Then SetError(1, 0, -1)
$result = DllCall($kernel, "BOOL", "SetConsoleCursorPosition", _
"HANDLE", $handle, _
"struct",$coords)
If @error Then Return @error
DllClose($kernel)
return $result[0]
EndFunc
|
|
|
04/01/2014, 17:35
|
#8
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
Ach natürlich, habe nur ewig lange rumprobiert. Habe nicht gesehen, dass ich oben noch $result ohne Index stehen habe.
Richtig hieße es natürlich $result[0]. Funktioniert trotzdem nicht.
|
|
|
04/01/2014, 17:50
|
#9
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by DarkCrusade2
Ach natürlich, habe nur ewig lange rumprobiert. Habe nicht gesehen, dass ich oben noch $result ohne Index stehen habe.
Richtig hieße es natürlich $result[0]. Funktioniert trotzdem nicht. 
|
versuchs mal so:
Code:
Func consoleSetCursorPosition($x, $y)
Local $coords = BitShift($y, -16) + $x, $kernel = DllOpen("kernel32.dll"), $handle, $return
$handle = DllCall($kernel, "hwnd", "GetStdHandle", "dword", $STD_OUTPUT_HANDLE)
If @error Then Return SetError(@error, @extended, False)
$result = DllCall($kernel, "bool", "SetConsoleCursorPosition", "hwnd", $handle[0], "int", $coords)
If @error Then Return SetError(@error, @extended, False)
DllClose($kernel)
return $result[0]<>0
EndFunc
|
|
|
04/01/2014, 18:08
|
#10
|
elite*gold: 0
Join Date: Jul 2011
Posts: 15
Received Thanks: 0
|
*facepalm* ich hatte ja auch einfach bei $handle keinen Index angegeben. Jetzt funktioniert's, danke dir
|
|
|
04/02/2014, 01:02
|
#11
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
vergest es ... ^^
|
|
|
All times are GMT +1. The time now is 01:46.
|
|