Compatibilité tierce

Developer Guide

Si vous développez en C++, vous pouvez utiliser directement le fichier d'en-tête ipchelper.h du Seer SDK, qui encapsule toutes les API Win32 IPC décrites ci-dessous.

Seer prend en charge l'intégration avec des applications tierces et des gestionnaires de fichiers personnalisés à l'aide de l'IPC Win32 via des messages WM_COPYDATA.

Intégration d'application personnalisée (ACustomApp)

Une application personnalisée peut déclencher Seer pour afficher un aperçu pour un chemin de fichier spécifique.

Étape 1 : Trouver le handle de fenêtre de Seer

Trouvez le handle de fenêtre en utilisant FindWindowW :

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

Étape 2 : Envoyer le chemin absolu du fichier sélectionné

Envoyez le chemin absolu du fichier au handle de fenêtre 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);
}

Intégration de gestionnaire de fichiers personnalisé (ACustomExplorer)

Les gestionnaires de fichiers personnalisés peuvent enregistrer le nom de classe de leur fenêtre (classname) afin que Seer écoute l'appui sur la barre d'espace (Spacebar) dans celle-ci, et demande le chemin du fichier actuellement sélectionné pour afficher un aperçu.

Étape 1 : Enregistrer le nom de classe

Créez un fichier JSON sous %USERPROFILE%/Documents/Seer/explorers/. Au démarrage, Seer charge tous les fichiers JSON de ce dossier. Le JSON doit contenir le nom de classe de la fenêtre cible :

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

Étape 2 : Gérer l'appui sur la barre d'espace

Lorsque l'utilisateur appuie sur la barre d'espace dans la fenêtre de votre gestionnaire de fichiers, Seer intercepte la frappe et appelle GetForegroundWindow pour faire correspondre le nom de classe. S'il correspond, Seer envoie un message WM_COPYDATA au handle de votre fenêtre avec dwData défini sur SEER_REQUEST_PATH (4000), cbData = 0, et lpData = nullptr.

Seer envoie ce message en utilisant SendMessageTimeout avec un délai d'attente de 150ms pour éviter que l'interface ne se fige si votre application ne répond pas.

Étape 3 : Répondre avec le chemin sélectionné

Votre application doit gérer le message WM_COPYDATA, vérifier si dwData est SEER_REQUEST_PATH, et répondre en renvoyant un message WM_COPYDATA à Seer avec dwData défini sur SEER_RESPONSE_PATH (4001) contenant le chemin complet du fichier sélectionné sous forme de chaîne de caractères larges terminée par un caractère nul.

Étape 4 : Affichage de l'aperçu

Une fois que Seer reçoit le chemin, il affiche la fenêtre d'aperçu et le processus se termine.


Référence des commandes IPC (SeerCommand)

Les commandes suivantes sont définies dans seer/ipc.h pour communiquer avec Seer :

Nom de la commande Valeur Description
SEER_REQUEST_PATH 4000 Envoyé par Seer au gestionnaire personnalisé pour demander le chemin du fichier sélectionné.
SEER_RESPONSE_PATH 4001 Renvoyé par le gestionnaire personnalisé à Seer avec le chemin du fichier sélectionné en données utiles.
SEER_INVOKE_W32 5000 Envoyé par l'application personnalisée à Seer pour déclencher l'aperçu dans la fenêtre principale (intervalle min 200 ms).
SEER_INVOKE_W32_SEP 5001 Envoyé par l'application personnalisée à Seer pour déclencher l'aperçu dans une fenêtre séparée.
SEER_IS_VISIBLE 5004 Vérifie si la fenêtre d'aperçu principale est visible. Renvoie VISIBLE_TRUE (1) ou VISIBLE_FALSE (0).
SEER_HIDE 5005 Masque la fenêtre d'aperçu principale si elle est visible.
SEER_GET_CURRENT_FILE 5006 Demande à Seer le chemin du fichier actuellement prévisualisé (via une mémoire partagée nommée).
SEER_GET_VERSION 5007 Demande la version de Seer (renvoie par exemple 40001 pour la version 4.0.1).
SEER_IS_TRACKING_ENABLED 5008 Vérifie si le mode de suivi des fichiers est activé.

Demander le chemin du fichier actuellement prévisualisé

Comme WM_COPYDATA ne peut pas renvoyer directement des chaînes de caractères de longueur variable, l'interrogation du fichier actuellement prévisualisé (SEER_GET_CURRENT_FILE) utilise un protocole de mappage de fichiers (mémoire partagée) nommé.

Exemple d'implémentation C++

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

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

    // Créer un nom unique pour le mappage de fichier
    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';

    // Envoyer la commande à Seer avec le nom du mappage unique en données utiles
    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;
}