Сумісність сторонніх програм

Developer Guide

Якщо ви розробляєте на C++, ви можете напряму використовувати заголовний файл ipchelper.h із Seer SDK, який інкапсулює всі описані нижче API Win32 IPC.

Seer підтримує інтеграцію зі сторонніми програмами та користувацькими файловими менеджерами за допомогою Win32 IPC через повідомлення WM_COPYDATA.

Інтеграція з користувацькими програмами (ACustomApp)

Користувацька програма може дати команду Seer відобразити попередній перегляд для певного шляху до файлу.

Крок 1: Пошук дескриптора вікна Seer

Знайдіть дескриптор вікна за допомогою FindWindowW :

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

Крок 2: Надсилання абсолютного шляху до вибраного файлу

Надішліть абсолютний шлях до файлу в дескриптор вікна 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);
}

Інтеграція з користувацькими файловими менеджерами (ACustomExplorer)

Користувацькі файлові менеджери можуть зареєструвати ім'я класу свого вікна (classname), щоб Seer відстежував натискання клавіші «Пробіл» (Spacebar) всередині них і запитував шлях до поточного вибраного файлу для відображення попереднього перегляду.

Крок 1: Реєстрація імені класу

Створіть файл JSON у папці %USERPROFILE%/Documents/Seer/explorers/. При запуску Seer завантажує всі файли JSON із цього каталогу. JSON має містити ім'я класу цільового вікна:

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

Крок 2: Обробка натискання клавіші «Пробіл»

Коли користувач натискає клавішу «Пробіл» у вікні вашого файлового менеджера, Seer перехоплює натискання та викликає функцію GetForegroundWindow для зіставлення імені класу. У разі збігу Seer надсилає повідомлення WM_COPYDATA дескриптору вашого вікна зі значеннями dwData = SEER_REQUEST_PATH (4000), cbData = 0 та lpData = nullptr.

Seer надсилає це повідомлення за допомогою функції SendMessageTimeout із таймаутом 150 мс, щоб запобігти зависанню інтерфейсу, якщо ваша програма не відповідає.

Крок 3: Відповідь із вибраним шляхом

Ваша програма повинна обробити повідомлення WM_COPYDATA, переконатися, що dwData має значення SEER_REQUEST_PATH, і відповісти надсиланням повідомлення WM_COPYDATA у відповідь у Seer зі значенням dwData = SEER_RESPONSE_PATH (4001), що містить повний шлях до вибраного файлу у вигляді рядка широких символів, який закінчується нулем.

Крок 4: Відображення попереднього перегляду

Щойно Seer отримує шлях, відображається вікно попереднього перегляду, і процес завершується.


Довідник команд IPC (SeerCommand)

Для взаємодії з Seer у файлі seer/ipc.h визначено такі команди:

Ім'я команди Значення Опис
SEER_REQUEST_PATH 4000 Надсилається із Seer в користувацький провідник для запиту шляху до поточного вибраного файлу.
SEER_RESPONSE_PATH 4001 Надсилається із користувацького провідника назад у Seer і містить шлях до вибраного файлу як корисне навантаження.
SEER_INVOKE_W32 5000 Надсилається із користувацької програми в Seer для запуску попереднього перегляду в основному вікні (мінімальний інтервал 200 мс).
SEER_INVOKE_W32_SEP 5001 Надсилається із користувацької програми в Seer для запуску попереднього перегляду в окремому вікні.
SEER_IS_VISIBLE 5004 Перевіряє, чи відображається в даний момент основне вікно попереднього перегляду. Повертає VISIBLE_TRUE (1) або VISIBLE_FALSE (0).
SEER_HIDE 5005 Приховує основне вікно попереднього перегляду, якщо воно відображається.
SEER_GET_CURRENT_FILE 5006 Запитує у Seer шлях до файлу, який проглядається в даний момент (через іменовану спільну пам'ять).
SEER_GET_VERSION 5007 Запитує версію Seer (наприклад, повертає 40001 для версії 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Запитує, чи увімкнено режим відстеження файлів.

Запит файлу, який переглядається в даний момент

Оскільки повідомлення WM_COPYDATA не може безпосередньо повертати рядки змінної довжини, для запиту шляху до поточного файлу (SEER_GET_CURRENT_FILE) використовується протокол зіставлення файлів (іменована спільна пам'ять).

Приклад реалізації на C++

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

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

    // Створюємо унікальне ім'я для зіставлення файлів
    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';

    // Надсилаємо команду в Seer з унікальним ім'ям зіставлення як корисне навантаження
    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;
}