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;
}