Probleme mit API

flashgod

Mitglied
Das wär der Code


Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_CLOSE = &H10
Public Const WM_DESTROY = &H2


Private Sub main()
Dim win
Dim msg
win = FindWindow("ThunderRT6FormDC", "CraXMc")
MsgBox (win)
'msg = DefWindowProc(win, WM_CLOSE)
'msg = SendMessage(win, WM_CLOSE)
MsgBox (msg)
End Sub

Das mit FindWindow Funktioniert auch ohne Probleme
Nun will ich aber dieses "gefundene" Fenster schließen
Ich hab es schon mit allen möglichen Variationen von
DefWindowProc und SendMessage -- mit -- WM_CLOSE, WM_DESTROY, WM_QUIT etc.

Versucht aber ich bekomm immer den Fehler
Argument nicht Optional.

Was mach ich falsch???
Danke schon mal
 

flashgod

Mitglied
jo das hab ich auch gesehen
ABER
laut MSDN braucht man bei WM_CLOSE nur diese 2 Parameter
die letzten 2 werden nicht benötigt

und das letzte ist keine MsgBox sonder nur eine Variable die msg heißt


aber wie löse ich mein problem nun?
könnte mir einer nur den aufruf hinschreiben?
danke
 

Dario Linsky

Erfahrenes Mitglied
auch wenn die letzten beiden parameter keine informationen enthalten sollen, müssen die übergeben werden. zahlen ohne wert gibt's aber nicht, also haben die den wert 0:

DefWindowProc(win, WM_CLOSE, 0, 0)



wenn das keine MsgBox ist, was ist das dann?
 

flashgod

Mitglied
o sorry bin nur durcheinander gekommen weil du was anderes zitiert hast

das mit den "0"len werd ich gleich mal versuchen Danke

Aber wegen den Rückgabe wert mit der MsgBox hab ich noch nie gehört
werd s mir auch gleich mal in der MSDN anschaun

noch ne gute nacht!
 

Dario Linsky

Erfahrenes Mitglied
naja.. ist halt ein unterschied, ob du eine msgbox benutzt, um eine meldung auszugeben...
Code:
MsgBox "Meldung", vbQuestion + vbYesNo, "Bla"
...oder ob du damit eine bestätigung vom benutzer haben willst...
Code:
Antwort = MsgBox("Meldung", vbQuestion + vbYesNo, "Bla")

der unterschied zwischen einer normalen methode und einer funktion ist der, dass eine funktion irgendetwas zurückgibt. bei funktionen müssen die parameter eingeklammert werden, bei methoden nicht.

im ersten fall ist die MsgBox nur eine normale methode, die eine meldung ausgibt und nichts weiter.
im zweiten fall ist die MsgBox eine funktion, die einen wert zurückgibt, der den button definiert den der benutzer anklickt.

du kennst bestimmt auch diese meldungen "möchten sie jetzt speichern? ja, nein, abbrechen", und so weiter.
da kann man eben eine menge mit machen. ;)
 

flashgod

Mitglied
jo ist mir schon klar
danke das trotzdem so gut erklärt hast
ich habs aber immer so gelöst
will ich eine eingabe vom user immer InputBox
und nur so schnell was zum debuggen MsgBox in ein fertiges programm kommt die eher selten.

aber was noch super wär
könntest du mir erklären warum ich
hier die "0"len brauche?
msg = DefWindowProc(win, WM_CLOSE,0,0)
p.s Funktioniert SUPER

ist das nur bei API funktionen so?
oder hab ich bis jetzt was verpennt?
 

Dario Linsky

Erfahrenes Mitglied
also normalerweise müsste der compiler sich beschweren, wenn man einfach nur
Code:
MsgBox("test")
schreibt. bei mir nimmt der die klammern nur, wenn ich nachher einen rückgabewert davon brauche.
die MsgBox ist zwar prima zum debuggen, aber in so ziemlich jedem _fertigen_ programm kommen mehr von diesen funktionen vor, als du denkst. beispielsweise notepad: beim beenden gibt's eine abfrage, ob man änderungen speichern will - das ist eine MessageBox (oder MsgBox).
im übrigen ist eine MessageBox was ganz anderes als eine InputBox, aber egal.

die nullen brauchst du, weil die parameter in _der_ funktion eben nicht optional sind. wie die funktion selbst genau implementiert ist, kann ich dir nicht sagen.
aber im grunde kann man sagen: überall, wo man als parameter wParam oder lParam übergeben muss, sollte man das auch tun. die eigentliche nachricht, die an das handle geschickt wird, ist ja WM_CLOSE, aber es gibt andere nachrichten, die noch zusätzliche informationen enthalten können - und die brauchen dann einfach noch die beiden anderen parameter.
 
Zuletzt bearbeitet: