Сторонняя совместимость

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), содержащим полный путь к выбранному файлу в виде строки широких символов, оканчивающейся нулем (wide string).

Шаг 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;
}