Tredjepartskompatibilitet

Developer Guide

Hvis du utvikler i C++, kan du bruke header-filen ipchelper.h fra Seer SDK direkte. Den pakker inn alle Win32 IPC API-ene som beskrives nedenfor.

Seer støtter integrasjon med tredjepartsprogrammer og egendefinerte filbehandlere ved bruk av Win32 IPC via WM_COPYDATA-meldinger.

Egendefinert programintegrasjon (ACustomApp)

Et egendefinert program kan utløse Seer til å vise en forhåndsvisning av en bestemt filbane.

Trinn 1: Finn fönsterhåndtaket til Seer

Finn fönsterhåndtaket med FindWindowW :

HWND seer = FindWindowW(L"SeerWindowClass", nullptr);

Trinn 2: Send den valgte filens absolutte bane

Send filens absolutte bane to fönsterhåndtaket to 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);
}

Integrasjon med egendefinert filbehandler (ACustomExplorer)

Egendefinerte filbehandlere kan registrere vindusklassenavnet (classname) sitt slik at Seer lytter etter trykk på mellomromstasten (Spacebar) i dem, og ber om banen til den valgte filen for å vise en forhåndsvisning.

Trinn 1: Registrer klassenavnet

Opprett en JSON-fil under %USERPROFILE%/Documents/Seer/explorers/. Når Seer starter opp, laster det inn alle JSON-filer i denne katalogen. JSON-en må inneholde klassenavnet til målvinduet:

{
  "classname": "YourCustomExplorerClass",
  "windowtext": "OptionalWindowTextToMatch",
  "appname": "YourAppName"
}

Trinn 2: Håndter trykk på mellomromstasten

Når brukeren trykker på mellomromstasten i filbehandlervinduet ditt, fanger Seer opp tastetrykket og kaller GetForegroundWindow for å matche klassenavnet. Hvis det samsvarer, sender Seer en WM_COPYDATA-melding til vindushåndtaket ditt med dwData satt til SEER_REQUEST_PATH (4000), cbData = 0 og lpData = nullptr.

Seer sender denne meldingen ved hjelp av SendMessageTimeout med en tidsavbrudd på 150ms for å forhindre at grensesnittet fryser hvis programmet ditt ikke svarer.

Trinn 3: Svar med valgt bane

Programmet ditt må håndtere WM_COPYDATA-meldingen, sjekke om dwData er SEER_REQUEST_PATH, og svare ved å sende en WM_COPYDATA-melding tilbake til Seer med dwData satt til SEER_RESPONSE_PATH (4001) som inneholder den fullstendige banen til den valgte filen som en null-terminert bred tegnstreng.

Trinn 4: Vis forhåndsvisning

Når Seer mottar banen, vises forhåndsvisningsvinduet og prosessen fullføres.


IPC-kommandoreferanse (SeerCommand)

Følgende kommandoer er definert i seer/ipc.h for kommunikasjon med Seer:

Kommandonavn Verdi Beskrivelse
SEER_REQUEST_PATH 4000 Sendes fra Seer til den egendefinerte utforskeren for å be om den valgte filbanen.
SEER_RESPONSE_PATH 4001 Sendes fra den egendefinerte utforskeren tilbake til Seer med den valgte filbanen som nyttelast.
SEER_INVOKE_W32 5000 Sendes fra det egendefinerte programmet til Seer for å utløse forhåndsvisning i hovedvinduet (minst 200 ms intervall).
SEER_INVOKE_W32_SEP 5001 Sendes fra det egendefinerte programmet til Seer for å utløse forhåndsvisning i et eget vindu.
SEER_IS_VISIBLE 5004 Sjekker om hovedvinduet for forhåndsvisning er synlig. Returnerer VISIBLE_TRUE (1) eller VISIBLE_FALSE (0).
SEER_HIDE 5005 Skjuler hovedvinduet for forhåndsvisning hvis det er synlig.
SEER_GET_CURRENT_FILE 5006 Spør Seer etter banen til filen som forhåndsvises (via navngitt delt minne).
SEER_GET_VERSION 5007 Spør etter versjon av Seer (f.eks. returnerer 40001 for versjon 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Spør om filsporing er aktivert.

Be om banen til filen som forhåndsvises

Fordi WM_COPYDATA ikke kan returnere strenger med variabel lengde direkte, bruker forespørselen om den gjeldende filen (SEER_GET_CURRENT_FILE) en navngitt filtilordningsprotokoll (delt minne).

C++ Eksempel på implementering

#include <windows.h>
#include <string>

std::wstring getSeerCurrentFile(HWND seer_hwnd)
{
    if (!seer_hwnd) return L"";

    // Opprett et unikt navn for filtilordningen
    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';

    // Send kommando til Seer med det unike tilordningsnavnet som nyttelast
    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;
}