前言

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}
1
clang++ ./PotPlayerMiddleware.cpp -o ./PotPlayerMiddleware.exe -Wall -static --target=x86_64-w64-mingw64 -municode -O3

編譯後丟入 PotPlayer (x86) 根目錄。

註冊表

1
2
3
4
5
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:// ,載入未封裝擴充元件之後就成功啦!