Entwickler-Ecke

Windows API - Eine eigene Messagenummer


Anonymous - Mi 26.02.03 08:49
Titel: Eine eigene Messagenummer
Normalerweise nehmen wir, wenn wie eine Message erstellen, diesen Code:


Quelltext
1:
2:
const 
  MYMESSAGE = WM_USER + 1;


WM_USER ist die Grenze der höhsten Windowsmessage. Ab hier können wir loslegen. Nun weiß ich, daß die API noch eine weitere Funktion anbietet. Mit der kann man eine Messagenummer generieren die einmalig im System ist, ohne jetzt selbst eine Nummer nach oberen Art zu wählen.

Alle Jahre wieder fällt mir die Funktion auf, ich nehme mir vor sie mir diesmal zu merken und vergesse sie dennoch. Wer weiß welche Funktion das macht?


Delete - Mi 26.02.03 09:12

RegisterWindowMessage.

Diese ID bleibt für die Dauer der Windows-Session immer aktiv. Das heißt, erst ein Neustart "löscht" sie aus dem System. Aber - wenn du dein Programm mehrmals startest, dann "bemerkt" es, dass diese Nachricht schon existiert und holt sich die bereits registrierte ID.

Diese Technik wird u.a. vom Suchen/Ersetzen-Dialog genutzt, damit man auf die Rückmeldungen der Dialogbox reagieren kann. :)


toms - Mi 26.02.03 09:15

RegisterWindowMessage

Syntax


Quelltext
1:
2:
3:
RegisterWindowMessage(  
lpString: PChar  {a pointer to a message string}  
): UINT;  {returns a unique message identifier}


Description

This function generates a new message identifier that is unique throughout the system. This new message identifier can be used by any of the PostMessage or SendMessage functions, and is typically used to provide a means of communication between two applications. If two different applications register the same message string, each application will receive an identical unique message identifier. This identifier remains valid until the current Windows session terminates.

Parameters

lpString: A pointer to a null-terminated string containing the message to be registered.

Return Value

If the function succeeds, it returns a unique message identifier in the range of $C000 through $FFFF. If the function fails, it returns zero.

Beispiel

{register the user defined message}
UserMessage := RegisterWindowMessage('System Wide User Defined Message');


Anonymous - Mi 26.02.03 11:56

Danke, genau das habe ich gesucht. Ich hab mir die Funktion brav aufgeschrieben und hoffe, daß ich sie nicht wieder vergessen.

Eine Infofrage. Gibts auch eine Möglichkeit diese Message freizugeben? Nicht daß es nötig wäre. Mit 50 Messages wird das System nicht so sehr belastet, aber die Wahrscheinlichkeit ist groß, daß wenn daß Programm beendet wird, es wahrscheinlich nicht wieder gestartet wird.

Wie gesagt, ist nur interessenshalber.


Delete - Mi 26.02.03 23:15

Hatte ich eigentlich schon erwähnt:
MathiasSimmack hat folgendes geschrieben:
Diese ID bleibt für die Dauer der Windows-Session immer aktiv. Das heißt, erst ein Neustart "löscht" sie aus dem System. Aber - wenn du dein Programm mehrmals startest, dann "bemerkt" es, dass diese Nachricht schon existiert und holt sich die bereits registrierte ID.

Daher auch Einspruch in Richtung Tom. Ein Teil deines Zitates ist veraltet und falsch. Beweisbar durch Tests ist die Aussage des neuen PSDK:
PSDK hat folgendes geschrieben:
If two different applications register the same message string, the applications return the same message value. The message remains registered until the session ends.

Zwei verschiedene Anwendungen, die den selben Message-String benutzen, erhalten auch die selbe Message-Nummer. Und das ist ja auch der tiefere Sinn der Sache, denn wie heißt es weiter:
Zitat:
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)