Kompatibilität Drittanbieter
Developer Guide
Wenn Sie in C++ entwickeln, können Sie direkt die Header-Datei ipchelper.h aus dem Seer SDK verwenden, die alle unten beschriebenen Win32-IPC-APIs kapselt.
Seer unterstützt die Integration mit Drittanbieter-Anwendungen und benutzerdefinierten Dateimanagern über Win32-IPC mittels WM_COPYDATA-Nachrichten.
Custom App Integration (ACustomApp)
Eine benutzerdefinierte Anwendung kann Seer veranlassen, eine Vorschau für einen bestimmten Dateipfad anzuzeigen.
Schritt 1: Das Fensterhandle von Seer finden
Finden Sie das Fensterhandle mit FindWindowW:
HWND seer = FindWindowW(L"SeerWindowClass", nullptr);
Schritt 2: Den absoluten Pfad der ausgewählten Datei senden
Senden Sie den absoluten Pfad der Datei an das Fensterhandle von Seer:
void sendPath2Seer(HWND seer, LPCWSTR path)
{
COPYDATASTRUCT cd;
cd.cbData = (wcslen(path) + 1) * sizeof(wchar_t);
cd.lpData = (LPVOID)path;
cd.dwData = SEER_INVOKE_W32; // 5000
SendMessageW(seer, WM_COPYDATA, 0, (LPARAM)&cd);
}
Custom Dateimanager Integration (ACustomExplorer)
Benutzerdefinierte Dateimanager können ihren Fensterklassenname (classname) registrieren, sodass Seer auf das Drücken der Leertaste (Spacebar) in diesen Fenstern lauscht und den Pfad der aktuell ausgewählten Datei anfordert, um eine Vorschau anzuzeigen.
Schritt 1: Den Klassennamen registrieren
Erstellen Sie eine JSON-Datei unter %USERPROFILE%/Documents/Seer/explorers/. Beim Start lädt Seer alle JSON-Dateien in diesem Verzeichnis. Die JSON-Datei muss den Klassenname des Zielfensters enthalten:
{
"classname": "YourCustomExplorerClass",
"windowtext": "OptionalWindowTextToMatch",
"appname": "YourAppName"
}
Schritt 2: Leertaste-Drücken verarbeiten
Wenn der Benutzer im Fenster Ihres Dateimanagers die Leertaste drückt, fängt Seer den Tastendruck ab und ruft GetForegroundWindow auf, um den Klassennamen abzugleichen. Bei Übereinstimmung sendet Seer eine WM_COPYDATA-Nachricht an Ihr Fensterhandle, wobei dwData auf SEER_REQUEST_PATH (4000), cbData = 0 und lpData = nullptr gesetzt ist.
Seer sendet diese Nachricht mit SendMessageTimeout und einem Timeout von 150ms, um ein Einfrieren der Benutzeroberfläche zu verhindern, falls Ihre Anwendung nicht reagiert.
Schritt 3: Mit dem ausgewählten Pfad antworten
Ihre Anwendung muss die WM_COPYDATA-Nachricht verarbeiten, prüfen, ob dwData gleich SEER_REQUEST_PATH ist, und mit einer WM_COPYDATA-Nachricht an Seer antworten, bei der dwData auf SEER_RESPONSE_PATH (4001) gesetzt ist und die den vollständigen Pfad der ausgewählten Datei als nullterminierte Breitzeichen-Zeichenkette (wide string) enthält.
Schritt 4: Vorschau-Anzeige
Sobald Seer den Pfad empfängt, wird das Vorschaufenster angezeigt und der Vorgang ist abgeschlossen.
IPC-Befehlsreferenz (SeerCommand)
Die folgenden Befehle sind in seer/ipc.h für die Kommunikation mit Seer definiert:
| Befehlsname | Wert | Beschreibung |
|---|---|---|
SEER_REQUEST_PATH |
4000 |
Wird von Seer an den benutzerdefinierten Explorer gesendet, um den Pfad der aktuell ausgewählten Datei anzufordern. |
SEER_RESPONSE_PATH |
4001 |
Wird vom benutzerdefinierten Explorer an Seer zurückgesendet und enthält den Pfad der ausgewählten Datei. |
SEER_INVOKE_W32 |
5000 |
Wird von der benutzerdefinierten App an Seer gesendet, um eine Vorschau im Hauptfenster auszulösen (Mindestintervall 200 ms). |
SEER_INVOKE_W32_SEP |
5001 |
Wird von der benutzerdefinierten App an Seer gesendet, um eine Vorschau in einem separaten Fenster auszulösen. |
SEER_IS_VISIBLE |
5004 |
Überprüft, ob das Hauptvorschaufenster sichtbar ist. Gibt VISIBLE_TRUE (1) oder VISIBLE_FALSE (0) zurück. |
SEER_HIDE |
5005 |
Blendet das Hauptvorschaufenster aus, falls es sichtbar ist. |
SEER_GET_CURRENT_FILE |
5006 |
Fragt Seer nach dem Pfad der aktuell angezeigten Datei (über benannten gemeinsam genutzten Speicher). |
SEER_GET_VERSION |
5007 |
Fragt die Seer-Version ab (gibt z. B. 40001 für Version 4.0.1 zurück). |
SEER_IS_TRACKING_ENABLED |
5008 |
Überprüft, ob der Dateiverfolgungsmodus aktiviert ist. |
Abfragen der aktuell angezeigten Datei
Da WM_COPYDATA keine Zeichenketten mit variabler Länge direkt zurückgeben kann, verwendet die Abfrage der aktuell angezeigten Datei (SEER_GET_CURRENT_FILE) ein Protokoll über benannten gemeinsam genutzten Speicher (file mapping).
C++ Beispiel-Implementierung
#include <windows.h>
#include <string>
std::wstring getSeerCurrentFile(HWND seer_hwnd)
{
if (!seer_hwnd) return L"";
// Eindeutigen Namen für das File Mapping erstellen
wchar_t map_name[MAX_PATH] = {0};
swprintf_s(map_name, L"SeerCurFile_%u_%llu", GetCurrentProcessId(), GetTickCount64());
constexpr size_t buf_bytes = MAX_PATH * sizeof(wchar_t);
HANDLE map = CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, buf_bytes, map_name);
if (!map) return L"";
auto view = static_cast<wchar_t*>(MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, buf_bytes));
if (!view) {
CloseHandle(map);
return L"";
}
view[0] = L'\0';
// Befehl an Seer senden mit dem eindeutigen Mapping-Namen als Payload
COPYDATASTRUCT cds;
cds.dwData = 5006; // SEER_GET_CURRENT_FILE
cds.cbData = buf_bytes;
cds.lpData = map_name;
SendMessageW(seer_hwnd, WM_COPYDATA, 0, reinterpret_cast<LPARAM>(&cds));
std::wstring current_file;
if (view[0] != L'\0') {
current_file = view;
}
UnmapViewOfFile(view);
CloseHandle(map);
return current_file;
}