Сторонняя совместимость
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;
}