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