Hallo,
mit Winlist lasse ich zu bestimmten Fenstern den Namen und das Handle in eine Liste eintragen. Nur wenn ich dann später ein bestimmtes Handle benötige, lese ich das aus. Der Wert stimmt noch zu 100%, nur kann ich damit keine Fensterfunktionen bedienen, und auch IsHWnd schlägt fehl. Wie kann ich das Handle wieder gültig machen?
Handle nach eintragen in ListView ungültig
-
- [ gelöst ]
-
NoName -
30. Januar 2009 um 22:42 -
Geschlossen -
Erledigt
-
-
- Offizieller Beitrag
Code ? Ich hab dem Hellseher heute in Urlaub geschickt.
-
Ich dachte das wäre an meiner Erklärung deutlich. Naja, hier ein Beispiel ( Wenn die erste MsgBox weggeklickt wird bitte die Spalte in der ListView markieren sonst Error):
[autoit]GUICreate("",300,200)
[/autoit][autoit][/autoit][autoit]
$list=GUICtrlCreateListView("Winname|Handle",0,0,300,200)$winlist=WinList()
[/autoit][autoit][/autoit][autoit]
GUICtrlCreateListViewItem($winlist[1][0] & "|" & $winlist[1][1],$list)GUISetState()
[/autoit][autoit][/autoit][autoit]If isHWnd($winlist[1][1]) then MsgBox(0,"",$winlist[1][1] & " ist ein gültiges Handle")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Sleep(5000)
[/autoit]
$win=StringSplit(GUICtrlRead(GUICtrlRead($list)),"|")
If not IsHWnd($win[2]) Then MsgBox(0,"",$winlist[1][1] & " ist jetzt nicht mehr gültig") -
- Offizieller Beitrag
Vielleicht so versuchen :
[autoit]GUICreate("",300,200)
[/autoit][autoit][/autoit][autoit]
$list=GUICtrlCreateListView("Winname|Handle",0,0,300,200)$winlist=WinList()
[/autoit][autoit][/autoit][autoit]
$Item = GUICtrlCreateListViewItem($winlist[1][0] & "|" & $winlist[1][1],$list)GUISetState()
[/autoit][autoit][/autoit][autoit]If isHWnd($winlist[1][1]) then MsgBox(0,"",$winlist[1][1] & " ist ein gültiges Handle")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]Sleep(5000)
[/autoit]
$win=StringSplit(GUICtrlRead($Item),"|")
If Not HWnd($win[2]) Then MsgBox(0,"",$winlist[1][1] & " ist jetzt nicht mehr gültig")
[autoit]
Die Zeile kann nicht laufen :$win=StringSplit(GUICtrlRead(GUICtrlRead($list)),"|")
[/autoit]da ist der Rückgabewert immer 0 also @error
-
Tut mir Leid, habe mich oben falsch ausgedrückt. Nach der ersten MsgBox muss das Item in der ListView angeklickt werden. Dann wird in der zweiten MsgBox das gleiche Handle angezeigt, allerdings ist es kein Handle mehr. Und wenn ich versuche, das mit HWnd wieder zu einem Handle zu formen kommt 0x0000000000000000 raus...
-
Mir ist gerade aufgefallen, dass bei mir die HWnd Funktion allgemein nicht geht. Auch das Beispiel in der Hilfe unter HWnd geht nicht, der Rückgabewert ist immer 0x0000000000000000
Woran kann das liegen? An Vista?Code aus der Hilfe:
[autoit]Run("notepad.exe")
[/autoit]
WinWait("[CLASS:Notepad]")
Local $hWnd = WinGetHandle("[CLASS:Notepad]")
Local $sHWND = String($hWnd) ; Convert to a string
WinSetState(HWnd($sHWND), "", @SW_MINIMIZE)
Sleep(5000) ; Notepad should be minimized
WinClose(HWnd($sHWND)) -
- Offizieller Beitrag
An Vista sollte es nicht liegen. Mein Beispiel und auch deins aus der letzten Post funzt bei Vista Home Premium,Vista Ultimate 32/64 und auch bei Windows 2008 einwandfrei . Hast du das SP1 und alle Updates installiert ? Welche Autoit Version benutzt du ?
-
Also ich habe Windows Vista Ultimate 64x, habe erst letzte Woche neu aufgesetzt. Es fehlen eine Reihe an Updates, bin die jetzt mal am installieren. Und ich habe auch schon extra die neue AutoIt Version geladen. Naja ich gebe Feedback wenn die Updates fertig sind.
Edit: Achja, SP1 habe ich... -
Warscheinlich prüft die HWnd-Funktion noch irgend etwas, das nicht alle HWnds erfüllen. Teste doch mal das: Beim ersten funktioniert es, beim 2. muss eine extra Funktion für die Umwandlung her.
Spoiler anzeigen
[autoit]$HWND = WinGetHandle("BASS")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$String = String($HWND)
$HWNDBack = HWnd($String)
MsgBox(0, '', $HWND & @CRLF & $String & @CRLF & $HWNDBack)$test = "0x0044042A"
[/autoit] [autoit][/autoit] [autoit]
$HWND2 = HWnd($test)
$Str2HWND = _Str2HWnd($test)
MsgBox(0, '', $test & @CRLF & $HWND2& @CRLF & $Str2HWND)Func _Str2HWnd($String)
[/autoit]
; Prog@ndy
Local $HWND = DllStructCreate("HWND")
DllStructSetData($HWND,1,$String)
Return DllStructGetData($HWND,1)
EndFunc -
Warscheinlich prüft die HWnd-Funktion noch irgend etwas, das nicht alle HWnds erfüllen. Teste doch mal das: Beim ersten funktioniert es, beim 2. muss eine extra Funktion für die Umwandlung her.
Spoiler anzeigen
[autoit]$HWND = WinGetHandle("BASS")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$String = String($HWND)
$HWNDBack = HWnd($String)
MsgBox(0, '', $HWND & @CRLF & $String & @CRLF & $HWNDBack)$test = "0x0044042A"
[/autoit] [autoit][/autoit] [autoit]
$HWND2 = HWnd($test)
$Str2HWND = _Str2HWnd($test)
MsgBox(0, '', $test & @CRLF & $HWND2& @CRLF & $Str2HWND)Func _Str2HWnd($String)
[/autoit]
; Prog@ndy
Local $HWND = DllStructCreate("HWND")
DllStructSetData($HWND,1,$String)
Return DllStructGetData($HWND,1)
EndFuncJa, nur ich habe das Problem, dass bei mir nichtmal das erste geht. Aber das mit der Funktion _Str2HWnd funktioniert. Darf der Parameter nur bestimmte Anzahl von Zeichen haben oder ist das egal?
Und generell. Die Winupdates und die neue AutoItversion haben nicht geholfen. Die Funktion HWnd() funktioniert immernoch nicht bei mir!
-
Die _Str2Hwnd muss einen HWND in String-Form erhalten. Alles andere wird nicht richtig umgewandelt(PTR oder Number könnten auch noch gehen, einfach testen)
-
Ok, danke, dann gucke ich mal gleich ob das so alles passt.
Edit: Klappt anscheinend nicht so wie ich es mir gedacht habe. Ich gebe als Parameter einen String, z.B. 0x00000000000405D4. Als Rückgabewert von deiner Funktion bekomme ich auch hier 0x0000000000000000. Warum?
-
- Offizieller Beitrag
Dein String ist kein Handle, viel zuviele Nullen.
-
Der String der als Parameter gegeben wird sieht doch nur so aus wie ein Handle?! Naja, Lösung ist einfach den Parameter von links auf 8 stellen zu verkürzen, und dann wieder "0x" vorne ranzuhängen, dann geht es wunderbar. Ich danke euch beiden.