타사 호환성
Developer Guide
C++로 개발하는 경우, 아래 설명된 모든 Win32 IPC API를 래핑한 Seer SDK의 ipchelper.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는 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;
}