Kompatibilitas Pihak Ketiga
Developer Guide
Jika Anda mengembangkan dalam C++, Anda dapat langsung menggunakan file header ipchelper.h dari Seer SDK, yang membungkus semua Win32 IPC API yang dijelaskan di bawah ini.
Seer mendukung integrasi dengan aplikasi pihak ketiga dan pengelola berkas khusus menggunakan Win32 IPC via pesan WM_COPYDATA.
Integrasi Aplikasi Khusus (ACustomApp)
Aplikasi khusus dapat memicu Seer untuk menampilkan pratinjau untuk jalur berkas tertentu.
Langkah 1: Menemukan window handle Seer
Temukan window handle menggunakan FindWindowW :
HWND seer = FindWindowW(L"SeerWindowClass", nullptr);
Langkah 2: Mengirimkan jalur absolut berkas yang dipilih
Kirim jalur absolut berkas ke window handle 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);
}
Integrasi Pengelola Berkas Khusus (ACustomExplorer)
Pengelola berkas khusus dapat mendaftarkan nama kelas jendela (classname) mereka sehingga Seer mendengarkan penekanan tombol spasi (Spacebar) di dalamnya, dan meminta jalur berkas yang saat ini dipilih untuk menampilkan pratinjau.
Langkah 1: Mendaftarkan Classname
Buat berkas JSON di bawah %USERPROFILE%/Documents/Seer/explorers/. Saat Seer dimulai, ia memuat semua berkas JSON di direktori ini. JSON harus berisi nama kelas jendela target:
{
"classname": "YourCustomExplorerClass",
"windowtext": "OptionalWindowTextToMatch",
"appname": "YourAppName"
}
Langkah 2: Menangani Penekanan Tombol Spasi
Ketika pengguna menekan tombol spasi di jendela pengelola berkas Anda, Seer mencegat penekanan tombol tersebut dan memanggil GetForegroundWindow untuk mencocokkan classname. Jika cocok, Seer mengirimkan pesan WM_COPYDATA ke handle jendela Anda dengan dwData disetel ke SEER_REQUEST_PATH (4000), cbData = 0, dan lpData = nullptr.
Seer mengirimkan pesan ini menggunakan SendMessageTimeout dengan batas waktu 150ms untuk mencegah antarmuka hang jika aplikasi Anda tidak merespons.
Langkah 3: Merespons dengan Jalur yang Dipilih
Aplikasi Anda harus menangani pesan WM_COPYDATA, memeriksa apakah dwData adalah SEER_REQUEST_PATH, dan merespons dengan mengirimkan pesan WM_COPYDATA kembali ke Seer dengan dwData disetel ke SEER_RESPONSE_PATH (4001) yang berisi jalur lengkap dari berkas yang dipilih sebagai string karakter lebar yang diakhiri null.
Langkah 4: Tampilan Pratinjau
Setelah Seer menerima jalur, pratinjau jendela ditampilkan dan proses selesai.
Referensi Perintah IPC (SeerCommand)
Perintah berikut ditentukan dalam seer/ipc.h untuk berkomunikasi dengan Seer:
| Nama Perintah | Nilai | Deskripsi |
|---|---|---|
SEER_REQUEST_PATH |
4000 |
Dikirim dari Seer ke penjelajah khusus meminta jalur berkas yang dipilih saat ini. |
SEER_RESPONSE_PATH |
4001 |
Dikirim dari penjelajah khusus kembali ke Seer yang berisi muatan jalur berkas yang dipilih. |
SEER_INVOKE_W32 |
5000 |
Dikirim dari aplikasi khusus ke Seer untuk memicu pratinjau di jendela utama (interval minimum 200 ms). |
SEER_INVOKE_W32_SEP |
5001 |
Dikirim dari aplikasi khusus ke Seer untuk memicu pratinjau di jendela terpisah. |
SEER_IS_VISIBLE |
5004 |
Memeriksa apakah jendela pratinjau utama terlihat. Mengembalikan VISIBLE_TRUE (1) atau VISIBLE_FALSE (0). |
SEER_HIDE |
5005 |
Menyembunyikan jendela pratinjau utama jika terlihat. |
SEER_GET_CURRENT_FILE |
5006 |
Meminta Seer untuk jalur berkas yang sedang dipratinjau (melalui memori bersama bernama). |
SEER_GET_VERSION |
5007 |
Meminta versi Seer (misalnya mengembalikan 40001 untuk versi 4.0.1). |
SEER_IS_TRACKING_ENABLED |
5008 |
Memeriksa apakah mode pelacakan berkas diaktifkan. |
Meminta Berkas yang Sedang Dipratinjau
Karena WM_COPYDATA tidak dapat secara langsung mengembalikan string dengan panjang variabel, kueri berkas yang sedang dipratinjau (SEER_GET_CURRENT_FILE) menggunakan protokol pemetaan berkas (memori bersama) bernama.
Contoh Implementasi C++
#include <windows.h>
#include <string>
std::wstring getSeerCurrentFile(HWND seer_hwnd)
{
if (!seer_hwnd) return L"";
// Buat nama unik untuk pemetaan berkas
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';
// Kirim perintah ke Seer dengan nama pemetaan unik sebagai muatan
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;
}