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