前言
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://
,載入未封裝擴充元件之後就成功啦!