Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
216to220
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
216to220
216to220
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

API-Funktion "PostMessage"

API-Funktion "PostMessage"
12.02.2003 14:44:50
marcus
hallo,

hat jemand von euch erfahrungen mit postmessage?
ich wollte den text "TEST" in ein handle schreiben, allerdings bricht Excel immer ab. das liegt wohl an den zusätzlichen parametern wParam und lParam.
kann mir jemand sagen, wie ich diese paramter bestimmen kann ?

mein code:

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Sub test()
...
j = PostMessage(e, "TEST", 0, 0)
...
End Sub

"e" ist das korrekte handle! daran liegt also nicht.

danke für tipps!

marcus

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: API-Funktion "PostMessage"
12.02.2003 17:54:02
GerdZ

Hallo marcus,

der Fehler liegt bei "TEST".
Hier muß ein Long-Wert mit einem Nachrichten-Code stehen.
Mit z.B.
Const WM_CLOSE = &H10
j = PostMessage(e, WM_CLOSE, 0, 0)
wird dem Fenster mit dem Handle e die WM_CLOSE-Nachricht übermittelt.
Das Fenster sollte sich dann schließen bzw. das Programm wird beendet.
Mit wParam und lParam werden, je nach Nachrichten-Code, zusätzliche Werte oder Zeiger auf Werte/Texte übergeben.
Um einen Text an ein Fenster zu senden ist vielleicht die WM_SETTEXT Nachricht mit der SendMessage-Funktion zu verwenden?
Vielleicht hilft der folgender Link weiter:
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_settext.asp

Gruß
Gerd

Anzeige
Re: API-Funktion "PostMessage"
12.02.2003 18:21:20
marcus

hallo herd,

erstmal vielen dank! jetzt bin ich nicht mehr so ratlos wie vorher! ;-)

die funktion mit dem fenster schliessen kenne ich auch. damit hab ich auch schon rumexperimentiert.

mein problem ist allerdings folgendes:
ich möchte eine 6 stellige zahl an ein handle schicken, das ein eingabefenster ist.

j=postmessage(e, zahl, 0,0)

e ist, wie gesagt, das handle
zahl ist die variable, der eine zahl zugewiesen wurde
wParam ist wohl nicht benutzt (habe ich in deinem link gelesen)
aber lParam ist für mich die grosse frage...
was setze ich dort ein, wenn ich eine zahl an das handle schicken will ?

gruss,

marcus

Anzeige
Re: API-Funktion "PostMessage"
12.02.2003 22:48:17
GerdZ

Hallo marcus,

wenn e das Handle des Eingabefeldes (eine Textbox ?) ist, könnte das vielleicht so funktionieren:
Const WM_SETTEXT = &HC
rc = SendMessage(e, WM_SETTEXT, 0, ByVal Str(Zahl))

Gruß
Gerd


Re: API-Funktion "PostMessage"
12.02.2003 22:59:03
marcus

hallo gerd !!

leider spuckt excel da eine fehlermeldung aus:
"Falsche DLL-Aufrufkonvention"

ich habe auch schon alle möglichen vb-archive durchgesucht, aber leider ohne erfolg...
trotzdem vielen danke für deine hilfe!!

gruss,

marcus

ein letzter versuch! ;-)
12.02.2003 23:11:20
marcus

hi gerd,

ich habe nochmal nachgelesen.
lParam muss der zeiger auf den text sein, der gesendet werden soll. dieser text muss mit einer 0 beendet werden. ich schätze mal so in etwa: testtext,0
aber wie kann ich einen zeiger auf einen text setzen ???!?!?

gruss,

marcus

Anzeige
Re: ein letzter versuch! ;-)
13.02.2003 16:24:27
GerdZ

Hallo marcus,

den Text für einen API-Aufruf mit einer 0 beenden, bedeutet, das Zeichen mit dem Code 0 anfügen.
sText = "mein Text" & chr$(0)
In VB und VBA ist chr$(0) bereits als die Konstante vbNullChar definiert.
sText = "mein Text" & vbNullChar

Für die Übergabe sind mir 2 Möglichkeiten bekannt:
1) lParam wird als Any ohne ByVal deklariert. Dadurch brauchst Du nur eine Deklaration für alle Eventualitäten. Um die korrekte Übergabe der Werte mußt Du Dich dann selbst kümmern.
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
beim Aufruf muß dann ByVal vor die Textvariable geschrieben werden.
RC = SendMessage(Handle , Nachrichtencode, 0, ByVal sText)

2) lParam wird als String mit ByVal deklariert. Nachteil: evtl. mehrere verschiedene Deklarationen. Vorteil: Die Typ-Überprüfung bei der Übergabe macht VB.
Private Declare Function SendMessageString Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As String) As Long
beim Aufruf wird nur die Textvariable angegeben.
RC = SendMessage(Handle , Nachrichtencode, 0, sText)

Wichtig ist, daß in beiden Fällen (entweder in der Deklaration oder beim Aufruf) ByVal (= als Wert) angegeben werden muß, obwohl ein Zeiger zu übergeben ist. Dies liegt daran, daß Texte in VB und VBA anders codiert sind, als sie von der API-Funktion verwendet werden. VB/VBA macht die Konvertierung automatisch.

Gruß
Gerd


Anzeige
vielen dank für die ausführliche info !!!
13.02.2003 23:49:37
marcus

jetzt hab ich wenigstens ein bisschen mehr durchblick! ;-)

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige