Сумісність сторонніх програм
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;
}