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