타사 호환성

Developer Guide

C++로 개발하는 경우, 아래 설명된 모든 Win32 IPC API를 래핑한 Seer SDKipchelper.h 헬퍼 헤더 파일을 직접 사용할 수 있습니다.

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 = 0, lpData = 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;
}