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