下面是我解決它的方法。基本上有兩個部分。或三個。
首先,應用程序需要在註冊表中註冊,就像這樣。它花費了一些Google搜索來了解如何使用Windows註冊函數,但它們非常簡單。通過將這添加到註冊表中,您的應用程序將在點擊與自定義url協議的鏈接時啓動。
其次,應用程序需要檢測到它已從瀏覽器啓動。顯然很瑣碎,只需檢查命令行中的「/ uri」,或者選擇自定義它。
三,你其實不想開始你的應用程序 - 它應該已經在運行了!相反,當您檢測到從超鏈接開始時,您需要檢測應用程序的另一個實例是否已在運行。之後,您需要將命令行傳遞給它。以下是我做的:
bool ShouldContinueStartEditor(const std::string& command_line)
{
// Check if this instance was spawned from a web browser
if (command_line.find("/uri") != std::string::npos)
{
// Try to find other instance of JustEdit
HWND wnd = FindWindow("AV_MainFrame", NULL);
if (wnd)
{
COPYDATASTRUCT cds;
NEditorCopyData::SCommandLine data_to_copy;
strncpy(data_to_copy.m_CommandLine, command_line.c_str(), sizeof(data_to_copy.m_CommandLine) - 2);
cds.dwData = NEditorCopyData::ECommandLine; // function identifier
cds.cbData = sizeof(data_to_copy); // size of data
cds.lpData = &data_to_copy; // data structure
SendMessage(wnd, WM_COPYDATA, NULL, (LPARAM) (LPVOID) &cds);
}
return false;
}
return true;
}
「AV_Mainframe」是hwnd的名稱。如果你碰巧在使用WTL,你可以像這樣聲明它。現在
DECLARE_FRAME_WND_CLASS("AV_MainFrame", IDR_MAINFRAME)
,在你的窗口類,你需要處理WM_COPYDATA消息是這樣的:
MESSAGE_HANDLER(WM_COPYDATA, OnCopyData);
LRESULT OnCopyData(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT CMainFrame::OnCopyData(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
PCOPYDATASTRUCT cds = (PCOPYDATASTRUCT) lParam;
if (cds->dwData == NEditorCopyData::ECommandLine)
{
NEditorCopyData::SCommandLine* command_line = static_cast(cds->lpData);
const char* internal_path = strstr(command_line->m_CommandLine, "/uri");
if (internal_path != NULL)
{
// Do your thang
}
}
return 0;
}
而這幾乎是所有有給它。哦,這就是複製數據名稱空間的樣子:
namespace NEditorCopyData
{
enum ECopyDataMessages
{
ECommandLine = 0
};
struct SCommandLine
{
char m_CommandLine[512];
};
}
使您可以檢查以前的實例(如果可用並傳遞命令行)。 – stevehipwell 2009-04-24 12:21:51