Compatibilidade com Terceiros

Developer Guide

Se você está desenvolvendo em C++, pode usar diretamente o arquivo de cabeçalho ipchelper.h do Seer SDK, que encapsula todas as APIs Win32 IPC descritas abaixo.

O Seer oferece suporte à integração com aplicativos de terceiros e gerenciadores de arquivos personalizados usando Win32 IPC por meio de mensagens WM_COPYDATA.

Integração de aplicativo personalizado (ACustomApp)

Um aplicativo personalizado pode acionar o Seer para exibir uma visualização de um caminho de arquivo específico.

Passo 1: Encontrar o identificador de janela do Seer

Encontre o identificador de janela usando FindWindowW :

HWND seer = FindWindowW(L"SeerWindowClass", nullptr);

Passo 2: Enviar o caminho absoluto do arquivo selecionado

Envie o caminho absoluto do arquivo para o identificador de janela do 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);
}

Integração de gerenciador de arquivos personalizado (ACustomExplorer)

Gerenciadores de arquivos personalizados podem registrar o nome de classe de sua janela (classname) para que o Seer escute o pressionamento da barra de espaço (Spacebar) dentro deles e solicite o caminho do arquivo selecionado no momento para exibir uma visualização.

Passo 1: Registrar o nome da classe

Crie um arquivo JSON em %USERPROFILE%/Documents/Seer/explorers/. Quando o Seer é iniciado, ele carrega todos os arquivos JSON neste diretório. O JSON deve conter o nome de classe da janela de destino:

{
  "classname": "YourCustomExplorerClass",
  "windowtext": "OptionalWindowTextToMatch",
  "appname": "YourAppName"
}

Passo 2: Manipular o pressionamento da barra de espaço

Quando o usuário pressiona a barra de espaço na janela do gerenciador de arquivos, o Seer intercepta a tecla pressionada e chama GetForegroundWindow para corresponder ao nome de classe. Se corresponder, o Seer envia uma mensagem WM_COPYDATA para o identificador de sua janela com dwData definido como SEER_REQUEST_PATH (4000), cbData = 0 e lpData = nullptr.

O Seer envia essa mensagem usando SendMessageTimeout com um tempo limite de 150ms para evitar que a interface trave se o seu aplicativo não responder.

Passo 3: Responder com o caminho selecionado

O seu aplicativo deve manipular a mensagem WM_COPYDATA, verificar se dwData é SEER_REQUEST_PATH e responder enviando uma mensagem WM_COPYDATA de volta para o Seer with dwData definido como SEER_RESPONSE_PATH (4001) contendo o caminho completo do arquivo selecionado como uma string de caracteres largos terminada em nulo.

Passo 4: Exibição da visualização

Assim que o Seer recebe o caminho, ele exibe a janela de visualização e o processo é concluído.


Referencia de comandos IPC (SeerCommand)

Os seguintes comandos são definidos em seer/ipc.h para comunicação com o Seer:

Nome do comando Valor Descrição
SEER_REQUEST_PATH 4000 Enviado do Seer para o explorador personalizado solicitando o caminho do arquivo selecionado no momento.
SEER_RESPONSE_PATH 4001 Enviado do explorador personalizado de volta para o Seer contendo a carga útil do caminho do arquivo selecionado.
SEER_INVOKE_W32 5000 Enviado do aplicativo personalizado para o Seer para acionar a visualização na janela principal (intervalo mínimo de 200 ms).
SEER_INVOKE_W32_SEP 5001 Enviado do aplicativo personalizado para o Seer to acionar a visualização em uma janela separada.
SEER_IS_VISIBLE 5004 Verifica se la janela de visualização principal está visível. Retorna VISIBLE_TRUE (1) ou VISIBLE_FALSE (0).
SEER_HIDE 5005 Oculta a janela de visualização principal, se estiver visível.
SEER_GET_CURRENT_FILE 5006 Consulta o Seer para obter o caminho do arquivo visualizado no momento (por meio da memória compartilhada nomeada).
SEER_GET_VERSION 5007 Consulta a versão do Seer (por exemplo, retorna 40001 para a versão 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Consulta se o modo de rastreamento de arquivos está ativado.

Solicitando o arquivo visualizado no momento

Como WM_COPYDATA não pode retornar strings de comprimento variável diretamente, a consulta do arquivo visualizado no momento (SEER_GET_CURRENT_FILE) usa um protocolo de mapeamento de arquivo (memória compartilhada) nomeado.

Exemplo de implementação em C++

#include <windows.h>
#include <string>

std::wstring getSeerCurrentFile(HWND seer_hwnd)
{
    if (!seer_hwnd) return L"";

    // Criar um nome exclusivo para o mapeamento de arquivo
    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 o comando para o Seer com o nome de mapeamento exclusivo 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;
}