下面是我解决它的方法。基本上有两个部分。或三个。
首先,应用程序需要在注册表中注册,就像这样。它花费了一些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