URL Protocol Handler 轉發

前言

Leko 昨天在看 Kurzgesagt 的影片的時候,發現他有些早期的影片是沒有 60 FPS 的,看了不太開心

靈機一動,丟進 PotPlayer + BFRC 讓他自動補幀好了

然而事與願違 -- Kurzgesagt 的早期影片是 25 FPS 的,AMD Fluid Motion 只支援 24 和 30 FPS 的補幀。

平時用的 PotPlayer (x64) 用於動畫補幀,不是很想動到那些設置...

於是安裝了 x86 版本的 PotPlayer,配置了一下確定能用於 25 FPS 的補幀 (可能會再另外開一篇文章) 安裝了 Chrome 擴充元件 讓 Youtube 影片底下有快速按鈕可以自動打開 PotPlayer 播放。

然而,由於同時安裝了 x64 和 x86 版本的原因,個人希望檔案關聯等等的都保留在 x64 上。

因此希望可以用 potplayer32:// 來取代 potplayer:// 以在 x86 PotPlayer 上開啟連結。

URL Protocol Handler

在呼叫 URL Protocol Handler 的時候,如果註冊表有好好配置的話:
假設 myapp:// 會呼叫 myapp.exe

注意到我們開啟 myapp://payload 的時候,實際上是呼叫 myapp.exe myapp://payload而不是 myapp.exe payload
好的因為我沒看文件在這個地方浪費半小時

因此如果單純註冊 potplayer32:// 指向 PotPlayerMini.exe 的話,會導致 PotPlayerMini.exe 無法解析連結 (Expected potplayer://, got potplayer32://)

為此,我們需要一個 Middleware,藉由將 potplayer32:// 指向 Middleware, 由 Middleware代為開啟 PotPlayerMini.exe 的方式來解決這個問題。

PotPlayerMiddleware

#define UNICODE

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

std::wstring exeDirPath() {
    wchar_t buffer[MAX_PATH];
    GetModuleFileNameW( NULL, buffer, MAX_PATH );
    std::wstring::size_type pos = std::wstring( buffer ).find_last_of( L"\\/" );
    return std::wstring( buffer ).substr(0, pos);
}

int wmain(int argc, wchar_t *argv[]){
    std::wstring url(argv[1]);
    std::wstring p32 = L"potplayer32://";
    url.replace(0, p32.size(), L"potplayer://");

    std::wstring potplayerPath = exeDirPath() + L"\\PotPlayerMini.exe";
    LPCWSTR process = potplayerPath.c_str();

    std::wstring arg = potplayerPath + L" " + url + L"";
    LPWSTR args = &arg[0];

    STARTUPINFOW si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi));
    CreateProcessW(process, args, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

    return 0;
}
clang++ ./PotPlayerMiddleware.cpp -o ./PotPlayerMiddleware.exe -Wall -static --target=x86_64-w64-mingw64 -municode -O3

編譯後丟入 PotPlayer (x86) 根目錄。 ## 註冊表

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\potplayer32] @=URL:POTPLAYER Protocol URL Protocol= 
[HKEY_CLASSES_ROOT\potplayer32\shell] 
[HKEY_CLASSES_ROOT\potplayer32\shell\open] 
[HKEY_CLASSES_ROOT\potplayer32\shell\open\command] @=C:\\YOUR_DIR\\PotPlayerMiddleware.exe \%1\

修改插件

Chrome 擴充元件 下載下來之後,background.js 裡面 potplayer:// 全部改成 potplayer32:// ,載入未封裝擴充元件之後就成功啦!

按讚
  1. 可愛勝勝表示:
    Google Chrome Mac OS X 10.15.1
    耶蹦蹦雷雷
    1. leko表示:
      Google Chrome Windows 10
      笨料料 yay

發佈留言

電子郵件地址不會被公開。必填項已用 * 標註