Kompatibilitet med tredje part

Developer Guide

Om du utvecklar i C++, kan du direkt använda header-filen ipchelper.h från Seer SDK, vilken kapslar in alla Win32 IPC API:er som beskrivs nedan.

Seer stöder integrering med tredjepartsprogram och anpassade filhanterare med hjälp av Win32 IPC via WM_COPYDATA-meddelanden.

Anpassad programintegrering (ACustomApp)

Ett anpassat program kan utlösa Seer för att visa en förhandsgranskning av en specifik filsökväg.

Steg 1: Hitta fönsterhandtaget för Seer

Hitta fönsterhandtaget med FindWindowW :

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

Steg 2: Skicka den valda filens absoluta sökväg

Skicka filens absoluta sökväg till fönsterhandtaget för 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);
}

Anpassad filhanterarintegrering (ACustomExplorer)

Anpassade filhanterare kan registrera sitt fönsterklassnamn (classname) så att Seer lyssnar efter tryck på blanksteget (Spacebar) i dem, och begär sökvägen till den markerade filen för att visa en förhandsgranskning.

Steg 1: Registrera klassnamnet

Skapa en JSON-fil under %USERPROFILE%/Documents/Seer/explorers/. När Seer startar läser det in alla JSON-filer i den här katalogen. JSON-filen måste innehålla målfönstrets klassnamn:

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

Steg 2: Hantera tryck på blanksteget

När användaren trycker på blanksteget i ditt filhanterarfönster fångar Seer knapptryckningen och anropar GetForegroundWindow för att matcha klassnamnet. Om det matchar skickar Seer ett WM_COPYDATA-meddelande till ditt fönsterhandtag med dwData inställt på SEER_REQUEST_PATH (4000), cbData = 0 och lpData = nullptr.

Seer skickar detta meddelande med SendMessageTimeout med en tidsgräns på 150ms för att förhindra att gränssnittet hänger sig om ditt program inte svarar.

Steg 3: Svara med den valda sökvägen

Ditt program måste hantera WM_COPYDATA-meddelandet, kontrollera om dwData är SEER_REQUEST_PATH, och svara genom att skicka ett WM_COPYDATA-meddelande tillbaka till Seer med dwData inställt på SEER_RESPONSE_PATH (4001) som innehåller den fullständiga sökvägen till den valda filen som en nollterminerad bred teckensträng.

Steg 4: Visa förhandsgranskning

När Seer tar emot sökvägen visas förhandsgranskningsfönstret och processen slutförs.


IPC-kommandoreferens (SeerCommand)

Följande kommandon är definierade i seer/ipc.h för kommunikation med Seer:

Kommandotext Värde Beskrivning
SEER_REQUEST_PATH 4000 Skickas från Seer till den anpassade utforskaren för att begära sökvägen till den markerade filen.
SEER_RESPONSE_PATH 4001 Skickas från den anpassade utforskaren tillbaka till Seer med sökvägen till den markerade filen.
SEER_INVOKE_W32 5000 Skickas från det anpassade programmet till Seer för att utlösa förhandsgranskning i huvudfönstret (minst 200 ms intervall).
SEER_INVOKE_W32_SEP 5001 Skickas från det anpassade programmet till Seer för att utlösa förhandsgranskning i ett separat fönster.
SEER_IS_VISIBLE 5004 Kontrollerar om huvudfönstret för förhandsgranskning är synligt. Returnerar VISIBLE_TRUE (1) eller VISIBLE_FALSE (0).
SEER_HIDE 5005 Döljer huvudfönstret för förhandsgranskning om det är synligt.
SEER_GET_CURRENT_FILE 5006 Frågar Seer efter sökvägen till den fil som förhandsgranskas för närvarande (via namngivet delat minne).
SEER_GET_VERSION 5007 Frågar efter version av Seer (t.ex. returnerar 40001 för version 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Frågar om filspårningsläget är aktiverat.

Begär den fil som förhandsgranskas för närvarande

Eftersom WM_COPYDATA inte kan returnera strängar med variabel längd direkt, använder förfrågan om den förhandsgranskade filen (SEER_GET_CURRENT_FILE) ett namngivet filmappningsprotokoll (delat minne).

C++ Exempel på implementering

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

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

    // Skapa ett unikt namn för filmappningen
    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';

    // Skicka kommandot till Seer med det unika mappningsnamnet som data
    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;
}