GREYHOUND Client fernsteuern

In dieser Dokumentation ist beschrieben, wie man den GREYHOUND Client fernsteuern kann.

Protokoll-Handler für URLs in Windows

Da der GREYHOUND Client mittlerweile auch über einen Protokoll-Handler für URLs in Windows registriert ist, kann man den Client auch per URL fernsteuern. Die URLs sind wie folgt aufgebaut:

greyhound:Aktion?Param1=Wert1&Param2=Wert2&Param3=Wert3 

Die blau markierten Worte sind Platzhalter. Die möglichen Aktionen und Parameter sind dieselben wie hier beschrieben.
D.h. um eine neue Mail im Client aufgehen zu lassen (Action=NewItem, Kind=EMail, Subject=Hallo Welt), würde man sowas als URL aufrufen:

greyhound:NewItem?Kind=EMail&Subject=Hallo%20Welt 

Der Action-Parameter wird also direkt hinter “greyhound:” angegeben, alle weiteren Parameter (wie in URLs üblich) hinter “?” bzw. “&” mit URL-codierten Werten (also z. B. %20 statt Leerzeichen).

Windows Messages (WM_COPYDATA)

Die Kommunikation zwischen den Applikationen findet über die Windowsbotschaft vom Typ WM_COPYDATA statt. Eine WM_COPYDATABotschaft kann Strings zwischen Anwendungen hin und her transportieren. Um eine Botschaft an den GREYHOUND Client zu senden, muss man diese nur an das Fenster mit der Klasse “TFbmClient” und dem Fenstertitel “GREYHOUND” senden.

Bis GREYHOUND Version 4.2.5 build 1632 lautete die Klasse des Fensters “TFbmMain” und der gesuchte Teil des Fenstertitels “GREYHOUND Client”.

Der GREYHOUND Client fängt die Botschaft ab und verarbeitet sie entsprechend der nachfolgenden Dokumentation.

Praxis

Anbei ein kurzer Beispielquelltext in Delphi zum Finden des gewünschten Fensters:

function GetWindowHandle(const ClassName, WindowTitle: string): HWND;
var
 wHandle: Hwnd;
 CClassName: array[0..255] of Char;
 CWindowTitle: array[0..255] of Char;

begin
 Result := 0;
 wHandle := GetWindow(Application.Handle, GW_HWNDFIRST);

 repeat
  GetClassName(wHandle, CClassName, 255);

  if (ClassName = '') or AnsiContainsText(string(CClassName), ClassName) then
  begin
   GetWindowText(wHandle, CWindowTitle, 255);

   if (WindowTitle = '') or AnsiContainsText(string(CWindowTitle), WindowTitle) then
   begin
    Result := wHandle;
   end;
  end;

  wHandle := GetWindow(wHandle, GW_HWNDNEXT);
 until (wHandle <= 0) or (Result > 0);
end;

In diesem Fall würde die Funktion mit den folgenden Parametern aufgerufen:

var
 MyHandle: HWND;

begin
 MyHandle := GetWindowHandle('TFbmClient', 'GREYHOUND');
end;

Die Daten für die WM_COPYDATA Struktur können nun wie folgt zusammengebaut werden:

procedure SendData(Str: string);
var
 MyHandle: HWND;
 aCopyData: TCopyDataStruct;
 p: PChar;

begin
 MyHandle := GetWindowHandle('TFbmClient', 'GREYHOUND');

 if MyHandle > 0 then
 begin
  p := PChar(Str);

  with aCopyData do
  begin
   dwData := 0;
   cbData := StrLen(p) + 1;
   lpData := p;
  end;

  SetForegroundWindow(MyHandle); // TODO: Fenster immer aktivieren?
  SendMessage(MyHandle, WM_COPYDATA, Longint(Handle), Longint(@aCopyData));
 end;
end;

Der dritte Parameter der Funktion SendMessage enthält das Handle auf die eigene Applikation bzw. auf ein Fenster der eigenen Applikation.

Die Funktion SendData kann nun mit den unten spezifizierten Parametern aufgerufen werden, um den Client fernzusteuern. Die Daten die an den Client übermittelt werden bestehen aus Wertepaaren, welche durch ein Gleichheitszeichen in Name und Wert separiert sind. Jeder Wert steht in einer eigenen Zeile. Die Zeilen sind durch die Sequenz #13#10 voneinander getrennt (Windows Zeilenumbruch).

Testanwendung herunterladen

Die Testanwendung am Ende dieses Beitrags kann verwendet werden, um die gewünschten Funktionen zu testen. Für die Testanwendung liegt außerdem der Delphi Quelltext vor.