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;
}