サードパーティ互換性
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 は dwData に SEER_REQUEST_PATH (4000)、cbData = 0、lpData = nullptr を設定した WM_COPYDATA メッセージを対象のウィンドウハンドルに送信します。
アプリケーションが応答しない場合にインターフェースがハングするのを防ぐため、Seer はこのメッセージを 150ms のタイムアウトを設定した SendMessageTimeout を使用して送信します。
ステップ 3: 選択されたパスを返信する
アプリケーションは WM_COPYDATA メッセージを処理し、dwData が SEER_REQUEST_PATH であることを確認した上で、選択されたファイルのフルパスを null 終端のワイド文字列として格納した WM_COPYDATA メッセージ(dwData に SEER_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;
}