WM_COPYDATA - Datentausausch zwischen Skripten

Hilfreiche Erklärungen und Tipps zum Lernen von Autohotkey

Moderator: jNizM

just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 04:58

!!! In Bearbeitung !!!

Moin,

in diesem Beitrag habe ich angekündigt, etwas mehr über das Thema sagen zu wollen. Damit fange ich heute (16.07.20) mal an.

Für das Übermitteln von Daten von Skript zu Skript hat Microsoft die Nachricht und die zugehörige Datenstruktur entwickelt.

Um die zu nutzen braucht es Folgendes:
  • Alle beteiliegten Skripte müssen für das Senden das Handle (HWND) eines der Skriptfenster des Zielskripts kennen. Das darf auch das verborgene Hauptfenster des Skripts sein. Für Antworten kann das Zielfenster der eingehenden Nachricht entnommen werden.
  • In den empfangenden Skripten braucht man eine Funktion für die Behandlung eingehender Nachrichten

    Code: Select all

    OnMessage(0x004A, "MeineNachrichtenFunktion")
    mit den Parametern wParam und lParam.
  • Außerdem habe ich mal gelesen (finde es aber nicht mehr wieder), dass unter Umständen in emfangenden Skripten der Aufruf von

    Code: Select all

    DllCall("ChangeWindowMessageFilter", "UInt", 0x004A, "UInt", 1) ; WM_COPYDATA
    nötig sein soll, damit die Nachricht akzeptiert wird. Ich habe das aber bisher nicht gebraucht.
Und das war's auch schon.

Wie Ragnar unten angemerkt hat, gibt es für die Nutzung von WM_COPYDATA auch ein Beispiel in der Doku.
Last edited by just me on 17 Jul 2020, 05:48, edited 2 times in total.
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 05:57

Daten:

Für den Datenttransport hat Microsoft die Struktur COPYDATASTRUCT bereitgestellt:

Code: Select all

typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
Diese Struktur besteht aus drei Feldern mit folgenden Inhalten:
  • ULONG_PTR dwData;
    Ein Feld in Pointergröße, das einen UINT (32-bit) Wert enthält. Hier kann Alles übergeben werden, was in 4 Bytes passt.
  • DWORD cbData;
    Die Anzahl der Bytes, auf die der im folgenden Feld lpData; enthaltene Pointer zeigt. Wenn kein Pointer übergeben wird, muss das Feld auf Null gesetzt werden.
  • PVOID lpData;
    Ein Pointer auf beliebige zusätzliche Daten oder Null.
Die ersten beiden Felder müssen in einer Länge von 4 Bytes gefüllt bzw. ausgelesen werden. Das letzte Feld enthält einen Pointer von 4 (32 Bit) bzw. 8 (64 Bit) bytes Länge. Wegen der Feldausrichtung in Strukturen ist die Distanz zwischen den Feldern immer A_PtrSize Bytes.

Code: Select all

VarSetCapacity(CDS, A_PtrSize * 3, 0) ; COPYDATASTRUCT
; Put:
NumPut(dwData, CDS, 0, "UInt")
NumPut(cbData, CDS, A_PtrSize, "UInt")
NumPut(lpData, CDS, A_PtrSize * 2, "UPtr")
; Get:
dwData := NumGet(CDS, 0, "UInt")
cbData := NumGet(CDS, A_PtrSize, "UInt")
lpData := NumGet(CDS, A_PtrSize * 2, "UPtr")
Per lpData können beliebige Inhalte übermittelt werden, Binärdaten und auch Text. Bei Text ist zu beachten, dass cbData die Länge in Bytes enthalten muss, nicht die Länge in Zeichen. Wenn alle Skripte dieselbe Sprache (ANSI / Unicode) sprechen, können Texte ohne Konvertierung übermittelt werden, anderenfalls sollten sie nach UTF-8 konvertiert werden. Für die Bestimmung, welcher Datentyp sich hinter lpData verbirgt, kann das Feld dwData benutzt werden (z.B. 1 = Text, 2 = Binärdaten).
Last edited by just me on 16 Jul 2020, 05:59, edited 1 time in total.
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 05:58

Senden:
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 06:00

Empfangen:
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 06:01

Reserviert!
User avatar
Ragnar
Posts: 321
Joined: 30 Sep 2013, 15:25

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 08:45

Nur als Randinformation: Für dieses Konzept gibt es bereits Beispiele in der Doku (OnMessage-Beispiel #3 für das Senden/Empfangen von Zahlen und OnMessage-Beispiel #4 für das Senden/Empfangen von Zeichenketten).
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: WM_COPYDATA - Datentausausch zwischen Skripten

16 Jul 2020, 15:56

@Ragnar,
stimmt! Die Beispiele beruhen aber sehr ausgeprägt auf AHK 1.0 Konzepten.

Return to “Tutorials”

Who is online

Users browsing this forum: No registered users and 5 guests