Compatibilidad de Terceros
Developer Guide
Si está desarrollando en C++, puede usar directamente el archivo de encabezado ipchelper.h del Seer SDK, que encapsula todas las API Win32 IPC descritas a continuación.
Seer admite la integración con aplicaciones de terceros y administradores de archivos personalizados mediante Win32 IPC a través de mensajes WM_COPYDATA.
Integración de aplicaciones personalizadas (ACustomApp)
Una aplicación personalizada puede hacer que Seer muestre una vista previa de una ruta de archivo específica.
Paso 1: Encontrar el identificador de ventana de Seer
Encuentre el identificador de ventana usando FindWindowW :
HWND seer = FindWindowW(L"SeerWindowClass", nullptr);
Paso 2: Enviar la ruta absoluta del archivo seleccionado
Envíe la ruta absoluta del archivo al identificador de ventana de 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);
}
Integración de administrador de archivos personalizado (ACustomExplorer)
Los administradores de archivos personalizados pueden registrar el nombre de clase de su ventana (classname) para que Seer escuche la pulsación de la barra espaciadora (Spacebar) dentro de ellos y solicite la ruta del archivo seleccionado actualmente para mostrar una vista previa.
Paso 1: Registrar el nombre de clase
Cree un archivo JSON en %USERPROFILE%/Documents/Seer/explorers/. Al iniciarse, Seer carga todos los archivos JSON en este directorio. El archivo JSON debe contener el nombre de clase de la ventana de destino:
{
"classname": "YourCustomExplorerClass",
"windowtext": "OptionalWindowTextToMatch",
"appname": "YourAppName"
}
Paso 2: Controlar la pulsación de la barra espaciadora
Cuando el usuario presiona la barra espaciadora en la ventana del administrador de archivos, Seer intercepta la pulsación y llama a GetForegroundWindow para hacer coincidir el nombre de clase. Si coincide, Seer envía un mensaje WM_COPYDATA al identificador de ventana con dwData establecido en SEER_REQUEST_PATH (4000), cbData = 0 y lpData = nullptr.
Seer envía este mensaje mediante SendMessageTimeout con un tiempo de espera de 150ms para evitar que la interfaz se bloquee si su aplicación no responde.
Paso 3: Responder con la ruta seleccionada
Su aplicación debe procesar el mensaje WM_COPYDATA, verificar si dwData es SEER_REQUEST_PATH y responder enviando un mensaje WM_COPYDATA a Seer con dwData establecido en SEER_RESPONSE_PATH (4001) que contenga la ruta completa del archivo seleccionado como una cadena de caracteres anchos terminada en nulo.
Paso 4: Visualización de la vista previa
Una vez que Seer recibe la ruta, muestra la ventana de vista previa y el proceso finaliza.
Referencia de comandos IPC (SeerCommand)
Los siguientes comandos están definidos en seer/ipc.h para comunicarse con Seer:
| Nombre del comando | Valor | Descripción |
|---|---|---|
SEER_REQUEST_PATH |
4000 |
Enviado desde Seer al explorador personalizado para solicitar la ruta del archivo seleccionado actualmente. |
SEER_RESPONSE_PATH |
4001 |
Enviado desde el explorador personalizado de vuelta a Seer que contiene la carga útil de la ruta del archivo. |
SEER_INVOKE_W32 |
5000 |
Enviado desde la aplicación personalizada a Seer para activar la vista previa en la ventana principal (intervalo mínimo de 200 ms). |
SEER_INVOKE_W32_SEP |
5001 |
Enviado desde la aplicación personalizada a Seer para activar la vista previa en una ventana separada. |
SEER_IS_VISIBLE |
5004 |
Comprueba si la ventana de vista previa principal es visible. Devuelve VISIBLE_TRUE (1) o VISIBLE_FALSE (0). |
SEER_HIDE |
5005 |
Oculta la ventana de vista previa principal si está visible. |
SEER_GET_CURRENT_FILE |
5006 |
Consulta a Seer para obtener la ruta del archivo que se está previsualizando actualmente (a través de la memoria compartida con nombre). |
SEER_GET_VERSION |
5007 |
Consulta la versión de Seer (por ejemplo, devuelve 40001 para la versión 4.0.1). |
SEER_IS_TRACKING_ENABLED |
5008 |
Consulta si el modo de seguimiento de archivos está habilitado. |
Solicitar el archivo que se está previsualizando actualmente
Debido a que WM_COPYDATA no puede devolver directamente cadenas de longitud variable, la consulta del archivo previsualizado actualmente (SEER_GET_CURRENT_FILE) utiliza un protocolo de mapeo de archivos (memoria compartida) con nombre.
Ejemplo de implementación en C++
#include <windows.h>
#include <string>
std::wstring getSeerCurrentFile(HWND seer_hwnd)
{
if (!seer_hwnd) return L"";
// Crear un nombre único para el mapeo del archivo
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';
// Enviar el comando a Seer con el nombre único del mapeo como carga útil
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;
}