Seite 1 von 2

PB versteht bestimmte API-befehle nicht !?!

Verfasst: 24.08.2005 10:32
von Dr.Pixel
Warum versteht PureBasic bestimmte Befehle nicht?
Beispiel:

Code: Alles auswählen

hWnd.l = FindWindow_(0, "Dokument1 - Microsoft Word") 
If hWnd 
  SetForegroundWindow(hWnd)
EndIf

Fehlermeldung:
Zeile3: SetForegroundWindow() is not a function, an array, or a linked list

Auch bei vielen anderen Befehlen aus dem Codearchiv kommt diese Fehlermeldung.
Muss ich mit "IncludeFile" noch eine api.dll oder ähnliches hinzufügen?

Danke.

Edit by Kiffi: Code-Tags gesetzt

Verfasst: 24.08.2005 10:36
von Tafkadasom2k5
Das Problem kenne ich auch...bei den Befehlen wos ned ging hab ich das dann so gemacht:


LoadLibrary(1,blabla.dll..)
CallFunction(1,"Befehl",flags)

die "1" steht hier immer für die ID der geladenen Library...

Verfasst: 24.08.2005 10:38
von DarkDragon
SetForegroundWindow(hWnd) = SetForegroundWindow_(hWnd)

[EDIT]
Ha ich war schneller ;)

Re: PB versteht bestimmte API-befehle nicht !?!

Verfasst: 24.08.2005 10:39
von Kiffi
da fehlt der Unterstrich vor der Klammer:

Code: Alles auswählen

SetForegroundWindow_(hWnd)
[Edit]
@DD: Grrrrrrrrr!
Ich war aber schneller als Mücke
;-)
[/Edit]

Verfasst: 24.08.2005 10:41
von mueckerich
Da fehlt einfach ein Unterstrich. Schreib mal
SetForegroundWindow_(hWnd)
dann gehts. Es handelt sich hier um einen API- Aufruf, die werden durch einen Unterstrich am ende gekennzeichnet.

Edit: Okay Kiffi war schneller :allright:
Edit: :oops: Autsch, DD auch noch.

Verfasst: 24.08.2005 11:13
von Dr.Pixel
OK, danke. Klappt.

Aber was ist hier falsch in der Datei "ListChildWindows.pb" aus dem Codearchiv:

Zeile 18: class$ = PeekS (MemoryID())


Fehlermeldung:
Zeile18: MemoryID() is not a function, an array, or a linked list

Verfasst: 24.08.2005 11:15
von DarkDragon
MemoryID gibts nichtmehr, man muss den rückgabewert von AllocateMemory(DerzweiteParameter) speichern und anstatt MemoryID() benutzen.

Verfasst: 24.08.2005 11:24
von Kiffi
alternativ kannst Du den Klassennamen und Fenstertitel auch mit diesen
beiden Routinen ermitteln:

Auszug aus NTCs EnumAllWindows V3:

Code: Alles auswählen

Procedure.s GetClassName(handle.l)
  Class.s = Space(#BufferSize)
  GetClassName_(handle, @Class, Len(Class))
  ProcedureReturn Left(Class, Len(Class))
EndProcedure

Procedure.s GetTitle(handle)
  Name.s = Space(#BufferSize)
  GetWindowText_(handle, @Name, Len(Name))
  ProcedureReturn Left(Name, Len(Name))
EndProcedure 
der Aufruf erfolgt dann mit:

Code: Alles auswählen

class$ = GetClassName(window)
und

Code: Alles auswählen

title$ = GetTitle(window) 
Grüße ... Kiffi

Verfasst: 24.08.2005 15:01
von Dr.Pixel
Also, ich habe das Programm nun umgeschrieben.
Trotzdem kommt folgende FM:
[ERROR] ListChildWindows.pb (Line 20): "Class.s = Space(#BufferSize)"
[ERROR] Invalid Memory access.

Was mache ich falsch?

Code: Alles auswählen

#BufferSize = 2048 


Procedure.s GetClassName(handle.l) 
  Class.s = Space(#BufferSize) 
  GetClassName_(handle, @Class, Len(Class)) 
  ProcedureReturn Left(Class, Len(Class)) 
EndProcedure 

Procedure.s GetTitle(handle) 
  Name.s = Space(#BufferSize) 
  GetWindowText_(handle, @Name, Len(Name)) 
  ProcedureReturn 
EndProcedure 



Procedure ListChildWindows (window, parameter) 

    GetClassName_ (window, ReAllocateMemory (0, 255), 255) 
    ;class$ = PeekS (MemoryID ())
    class$ = GetClassName(window) 


    GetWindowText_ (window, ReAllocateMemory (0, 255), 255) 
    AllocateMemory(DerzweiteParameter) 
    ;title$ = PeekS (MemoryID ()) 
    title$ = GetTitle(window) 

    FreeMemory (0) 
    
    For a = 1 To parameter 
        sub$ = sub$ + "--------" 
    Next 
    
    Debug sub$ + ">" + Chr (34) + title$ + Chr (34) + " / Class: " + class$ 

    EnumChildWindows_ (window, @ListChildWindows (), parameter + 1) 

    ProcedureReturn #True 
    
EndProcedure 

; List top-level windows... 

Procedure ListWindows (window, parameter) 

    GetClassName_ (window, ReAllocateMemory (0, 255), 255) 
    ;class$ = PeekS (MemoryID ()) 
    class$ = GetClassName(window)

    GetWindowText_ (window, ReAllocateMemory (0, 255), 255) 
    ;title$ = PeekS (MemoryID ()) 
    title$ = GetTitle(window) 

    FreeMemory (0) 
    
    Debug "" 
    Debug "------------------------------------------------------------------------" 
    Debug Chr (34) + title$ + Chr (34) + " / Class: " + class$ 
    Debug "------------------------------------------------------------------------" 
    
    EnumChildWindows_ (window, @ListChildWindows (), 1) 
    
    ProcedureReturn #True 
    
EndProcedure 

EnumWindows_ (@ListWindows (), 0) 

Verfasst: 24.08.2005 15:25
von Kiffi
ungetestet:

Code: Alles auswählen


#BufferSize = 2048


Procedure.s GetClassName(handle.l)
  Class.s = Space(#BufferSize)
  GetClassName_(handle, @Class, Len(Class))
  ProcedureReturn Left(Class, Len(Class))
EndProcedure

Procedure.s GetTitle(handle)
  Name.s = Space(#BufferSize)
  GetWindowText_(handle, @Name, Len(Name))
  ProcedureReturn
EndProcedure

Procedure ListChildWindows (window, parameter)
  
  class$ = GetClassName(window)
  
  title$ = GetTitle(window)
  
  For a = 1 To parameter
    sub$ = sub$ + "--------"
  Next
  
  Debug sub$ + ">" + Chr (34) + title$ + Chr (34) + " / Class: " + class$
  
  EnumChildWindows_ (window, @ListChildWindows (), parameter + 1)
  
  ProcedureReturn #True
  
EndProcedure

; List top-level windows...

Procedure ListWindows (window, parameter)
  
  class$ = GetClassName(window)
  
  title$ = GetTitle(window)
  
  Debug ""
  Debug "------------------------------------------------------------------------"
  Debug Chr (34) + title$ + Chr (34) + " / Class: " + class$
  Debug "------------------------------------------------------------------------"
  
  EnumChildWindows_ (window, @ListChildWindows (), 1)
  
  ProcedureReturn #True
  
EndProcedure

EnumWindows_ (@ListWindows (), 0)