Compatibilità Terze Parti

Developer Guide

Se stai sviluppando in C++, puoi utilizzare direttamente il file di intestazione ipchelper.h dal Seer SDK, che racchiude tutte le API Win32 IPC descritte di seguito.

Seer supporta l'integrazione con applicazioni di terze parti e file manager personalizzati utilizzando Win32 IPC tramite messaggi WM_COPYDATA.

Integrazione di app personalizzate (ACustomApp)

Un'applicazione personalizzata può richiedere a Seer di mostrare un'anteprima per un percorso file specifico.

Passaggio 1: Trovare l'handle della finestra di Seer

Trova l'handle della finestra utilizzando FindWindowW :

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

Passaggio 2: Inviare il percorso assoluto del file selezionato

Invia il percorso assoluto del file all'handle della finestra di 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);
}

Integrazione di file manager personalizzati (ACustomExplorer)

I file manager personalizzati possono registrare il nome della classe della loro finestra (classname) in modo che Seer rilevi la pressione della barra spaziatrice (Spacebar) al loro interno e richieda il percorso del file attualmente selezionato per mostrare un'anteprima.

Passaggio 1: Registrare il nome della classe

Crea un file JSON in %USERPROFILE%/Documents/Seer/explorers/. All'avvio, Seer carica tutti i file JSON in questa directory. Il file JSON deve contenere il nome della classe della finestra di destinazione:

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

Passaggio 2: Gestire la pressione della barra spaziatrice

Quando l'utente preme la barra spaziatrice nella finestra del file manager, Seer intercetta la digitazione e chiama GetForegroundWindow per verificare la corrispondenza del nome della classe. Se corrisponde, Seer invia un messaggio WM_COPYDATA all'handle della finestra con dwData impostato su SEER_REQUEST_PATH (4000), cbData = 0 e lpData = nullptr.

Seer invia questo messaggio utilizzando SendMessageTimeout con un timeout di 150ms per evitare il blocco dell'interfaccia se l'applicazione non risponde.

Passaggio 3: Rispondere con il percorso selezionato

L'applicazione deve gestire il messaggio WM_COPYDATA, verificare se dwData è SEER_REQUEST_PATH e rispondere inviando a sua volta un messaggio WM_COPYDATA a Seer con dwData impostato su SEER_RESPONSE_PATH (4001) contenente il percorso completo del file selezionato come stringa di caratteri wide terminata da zero.

Passaggio 4: Visualizzazione dell'anteprima

Una volta ricevuto il percorso, Seer mostra la finestra di anteprima e il processo si completa.


Riferimento comandi IPC (SeerCommand)

I seguenti comandi sono definiti in seer/ipc.h per comunicare con Seer:

Nome comando Valore Descrizione
SEER_REQUEST_PATH 4000 Inviato da Seer al gestore personalizzato per richiedere il percorso del file selezionato.
SEER_RESPONSE_PATH 4001 Inviato dal gestore personalizzato a Seer contenente il percorso del file selezionato come payload.
SEER_INVOKE_W32 5000 Inviato dall'app personalizzata a Seer per avviare l'anteprima nella finestra principale (intervallo minimo 200 ms).
SEER_INVOKE_W32_SEP 5001 Inviato dall'app personalizzata a Seer per avviare l'anteprima in una finestra separata.
SEER_IS_VISIBLE 5004 Verifica se la finestra di anteprima principale è visibile. Restituisce VISIBLE_TRUE (1) o VISIBLE_FALSE (0).
SEER_HIDE 5005 Nasconde la finestra di anteprima principale se è visibile.
SEER_GET_CURRENT_FILE 5006 Richiede a Seer il percorso del file attualmente previsualizzato (tramite memoria condivisa con nome).
SEER_GET_VERSION 5007 Richiede la versione di Seer (ad es. restituisce 40001 per la versione 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Verifica se la modalità di monitoraggio del file è abilitata.

Richiedere il file attualmente previsualizzato

Poiché WM_COPYDATA non può restituire direttamente stringhe a lunghezza variabile, la richiesta del file attualmente previsualizzato (SEER_GET_CURRENT_FILE) utilizza un protocollo di mappatura file (memoria condivisa) con nome.

Esempio di implementazione C++

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

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

    // Creare un nome unico per la mappatura del file
    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';

    // Inviare il comando a Seer con il nome di mappatura unico come 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;
}