GREYHOUND Client fernsteuern
In dieser Dokumentation ist beschrieben, wie man den GREYHOUND Client fernsteuern kann.
“Link kopieren” – Direktlinks zu GREYHOUND-Elementen
GREYOUND stellt Weblinks zu Elementen zur Verfügung, die in Webapplikationen aufgerufen werden können. So kann man sich mit Kollegen in Chat oder Aufgaben-Tools über Elemente in GREYHOUND austauschen und Direktlinks hierzu posten. Klickt man diese an, öffnet sich das entsprechende Element in GREYHOUND.
Um so einen Link zu generieren, einfach ein beliebiges GREYHOUND-Element per Rechtsklick anwählen und „(Web) Link kopieren“ anklicken (alternativ: STRG + C). Klickt man diesen Link an, wird das entsprechende Element im GREYHOUND Windows-Client geöffnet.
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.