サードパーティ互換性

Developer Guide

C++ で開発している場合は、Seer SDK に含まれる ipchelper.h ヘッダーファイルを直接使用できます。これには、以下で説明するすべての Win32 IPC API がラップされています。

Seer は、WM_COPYDATA メッセージを介した Win32 IPC を使用して、サードパーティ製アプリケーションおよびカスタムファイルマネージャーとの統合をサポートしています。

カスタムアプリの統合 (ACustomApp)

カスタムアプリケーションから、特定のファイルパスのプレビューを表示するように Seer をトリガーできます。

ステップ 1: Seer のウィンドウハンドルを取得する

FindWindowW を使用してウィンドウハンドルを検索します:

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

ステップ 2: 選択したファイルの絶対パスを送信する

ファイルの絶対パスを 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);
}

カスタムファイルマネージャーの統合 (ACustomExplorer)

カスタムファイルマネージャーはウィンドウのクラス名(classname)を登録することで、Seer にそのウィンドウ内でのスペースキー(Spacebar)の入力を監視させ、現在選択されているファイルのパスを要求してプレビューを表示させることができます。

ステップ 1: クラス名を登録する

%USERPROFILE%/Documents/Seer/explorers/ の下に JSON ファイルを作成します。Seer の起動時に、このディレクトリ内のすべての JSON ファイルが読み込まれます。JSON には対象となるウィンドウのクラス名を含める必要があります:

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

ステップ 2: スペースキーの入力を処理する

ユーザーがファイルマネージャーのウィンドウでスペースキーを押すと、Seer はそのキー入力をフックし、GetForegroundWindow を呼び出してクラス名を照合します。一致した場合、Seer は dwDataSEER_REQUEST_PATH (4000)、cbData = 0lpData = nullptr を設定した WM_COPYDATA メッセージを対象のウィンドウハンドルに送信します。

アプリケーションが応答しない場合にインターフェースがハングするのを防ぐため、Seer はこのメッセージを 150ms のタイムアウトを設定した SendMessageTimeout を使用して送信します。

ステップ 3: 選択されたパスを返信する

アプリケーションは WM_COPYDATA メッセージを処理し、dwDataSEER_REQUEST_PATH であることを確認した上で、選択されたファイルのフルパスを null 終端のワイド文字列として格納した WM_COPYDATA メッセージ(dwDataSEER_RESPONSE_PATH (4001) を設定)を Seer に返信する必要があります。

ステップ 4: プレビューの表示

Seer がパスを受信すると、プレビューウィンドウが表示され、処理が完了します。


IPC コマンドリファレンス (SeerCommand)

Seer との通信用に、seer/ipc.h で以下のコマンドが定義されています:

コマンド名 説明
SEER_REQUEST_PATH 4000 現在選択されているファイルのパスを要求するため、Seer からカスタムエクスプローラーに送信されます。
SEER_RESPONSE_PATH 4001 選択されたファイルのパス情報をペイロードとして含めて、カスタムエクスプローラーから Seer に返信されます。
SEER_INVOKE_W32 5000 メインウィンドウでプレビューをトリガーするため、カスタムアプリから Seer に送信されます(送信間隔は最低 200ms 必要)。
SEER_INVOKE_W32_SEP 5001 別ウィンドウでプレビューをトリガーするため、カスタムアプリから Seer に送信されます。
SEER_IS_VISIBLE 5004 メインプレビューウィンドウが表示されているかどうかを確認します。VISIBLE_TRUE (1) または VISIBLE_FALSE (0) を返します。
SEER_HIDE 5005 メインプレビューウィンドウが表示されている場合、非表示にします。
SEER_GET_CURRENT_FILE 5006 現在プレビューされているファイルのパスを要求します(命名された共有メモリ経由)。
SEER_GET_VERSION 5007 Seer のバージョンを要求します(例:バージョン 4.0.1 の場合は 40001 が返されます)。
SEER_IS_TRACKING_ENABLED 5008 ファイルトラッキングモードが有効かどうかを確認します。

現在プレビューされているファイルの要求

WM_COPYDATA は可変長の文字列を直接返せないため、現在プレビューされているファイル(SEER_GET_CURRENT_FILE)の問い合わせには、命名されたファイルマッピング(共有メモリ)プロトコルを使用します。

C++ 実装例

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

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

    // ファイルマッピング用の一意の名前を作成する
    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';

    // 一意の共有マッピング名をペイロードとして Seer にコマンドを送信する
    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;
}