首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

自定義 URI Scheme 啟動本地程式:從 QQ tencent:// 協議到通用解決方案

     編輯:關於C++

前言

網頁點擊連結啟動本地應用程式 (如 QQ 聊天、迅雷下載) 是常見需求。本文解析 tencent:// 協議原理,演示如何註冊自定義 URI Scheme 讓瀏覽器啟動任意 Win32/MFC/.NET 程式並傳遞參數。

一、QQ 協議原理解析

網頁代碼



  點擊這裡給我發消息

註冊表機制

Windows 允許應用程式註冊為 URL 協議處理器:


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Tencent]
@="TencentProtocol"
"URL Protocol"="D:\Program Files\Tencent\QQ\Timwp.exe"

[HKEY_CLASSES_ROOT\Tencent\DefaultIcon]
@="D:\Program Files\Tencent\QQ\Timwp.exe,1"

[HKEY_CLASSES_ROOT\Tencent\shell\open\command]
@="\"D:\Program Files\Tencent\QQ\Timwp.exe\" \"%1\""
  • HKEY_CLASSES_ROOT\Tencent:協議名稱
  • URL Protocol:標記為 URL 協議 (值可空)
  • shell\open\command:啟動命令,%1 會被完整 URI 取代

瀏覽器遇到 tencent://... → 查註冊表 → 啟動 Timwp.exe "tencent://..." → 應用程式解析參數。

二、通用解決方案實現 (MFC Demo)

1. 協議名稱:helloworld://

2. 註冊表腳本 (register.reg)


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\HelloWorld]
@="HelloWorld Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\HelloWorld\DefaultIcon]
@="D:\Path\HelloWorld.exe,1"

[HKEY_CLASSES_ROOT\HelloWorld\shell\open\command]
@="\"D:\Path\HelloWorld.exe\" \"%1\""

3. MFC 程式參數解析


BOOL CHelloWorldApp::InitInstance() {
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);  // 解析命令列參數
    
    CHelloWorldDlg dlg;
    dlg.SetDisplayInfo(cmdInfo.m_strFileName);  // 傳遞完整 URI
    m_pMainWnd = &dlg;
    dlg.DoModal();
    return FALSE;
}

void CHelloWorldDlg::SetDisplayInfo(CString& strInfo) {
    m_strInfo = strInfo;
}

BOOL CHelloWorldDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    
    // 解析 "helloworld://hello world/"
    int pos = m_strInfo.Find("//");      // 找到協議分隔符
    m_strInfo = m_strInfo.Mid(pos + 2);  // 取參數部分
    m_strInfo.Delete(m_strInfo.GetLength() - 1);  // 移除尾部 '/'
    
    m_edit_info.SetWindowText(m_strInfo);  // 顯示到編輯框
    return TRUE;
}

三、測試驗證

  1. 雙擊 register.reg 匯入註冊表
  2. 瀏覽器地址列輸入:helloworld://hello world/ → 彈出對話框顯示「hello world」
  3. 網頁測試:<a href="helloworld://hello world">...</a> → 點擊啟動程式

四、關鍵細節與最佳實務

項目建議
協議名稱小寫、無特殊字元、唯一 (如公司縮寫+功能)
路徑含空格註冊表命令必須雙層引號:"\"Path\With Spaces\App.exe\" \"%1\""
參數解析完整 URI 傳入,自行解析 (移除 scheme://、URL Decode)
單實例啟動時檢查互斥體,若已運行則傳參數給現有實例 (WM_COPYDATA/管道/IPC)
安全性驗證參數來源、限制危險操作、避免任意命令注入
安裝程式在安裝腳本中寫入註冊表 (Inno Setup/NSIS/WiX)

五、.NET (WinForms/WPF) 實現要點


// Program.cs
static class Program {
    [STAThread]
    static void Main(string[] args) {
        if (args.Length > 0) {
            string uri = args[0];  // 完整 URI
            // 解析 uri...
        }
        Application.Run(new MainForm());
    }
}

註冊表命令:"\"Path\App.exe\" \"%1\"" (同原理)。

六、總結

自定義 URI Scheme 是瀏覽器啟動本地應用的標準機制:註冊表關聯協議 → 瀏覽器啟動可執行檔傳遞完整 URI → 應用程式解析參數執行業務邏輯。掌握此機制,可實現網頁與桌面應用無縫整合 (如一鍵登入、本地編輯、硬體設備控制等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved