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