如何调用已运行的应用程序实例

How to invoke an already running instance of an application

本文关键字:运行 应用程序 实例 何调用 调用      更新时间:2023-10-16

我正在用c++开发一个BHO,用于识别任何网页上的电话号码,突出显示电话号码并在单击电话号码时调用实用程序。

我使用ihtmlxtrange::findtext来查找电话号码,并突出显示电话号码,我使用ihtmlxtrange::pastetext()向网页注入HTML的span标签。

我想调用一个已经运行的应用程序的相同实例,当点击网页上的电话号码。如何使用HTML span标签的onclick()实现这一点。

下面我给出了用于查找和突出显示电话号码的代码片段。

lpBody->createTextRange(&lpTxtRange);
lpBody->Release();
CComBSTR html;
CComBSTR newhtml;
long t;
VARIANT_BOOL bFound;
int i=0;
int size= findText.size();
for(int i=0;i<size;i++)
{   
    while(1)
    {
        CComBSTR str1= findText[i].c_str();
        lpTxtRange->findText(str1,0,lFlags,&bFound);
        if(bFound==-1)
        {
            newhtml.Empty();
            lpTxtRange->get_htmlText(&html);
            newhtml.Append("<span id='");
            newhtml.Append(L"begin_highlight");
            newhtml.Append("' title='");
            newhtml.Append(L"call this phone number ");
            newhtml.Append(str1);
            newhtml.Append("' style='");
            newhtml.Append(L"color: white; background-color: grey");
            newhtml.Append("'>");
            newhtml.AppendBSTR(html);
            newhtml.Append("</span>");
            lpTxtRange->pasteHTML(newhtml);
            lpTxtRange->moveStart((BSTR)CComBSTR("Character"),1,&t);
            lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
        }
        else
             break;
    }

}

lpTxtRange->Release();
findText.clear();

这可能会帮助你解决一半的问题。

您可以使用EnumWindows来查找正在运行的应用程序的窗口。要将窗口标识为您的应用程序,您可以使用窗口的类名(您可以使用GUID)。GetClassNameA应该从你的HWND得到这个。

在你要发送数据的应用程序中,确保在创建主窗口时设置这个类名。

要实际向它发送数据,您可以使用SendMessage和COPYDATASTRUCT向它发送WM_COPYDATA命令。然后,接收应用程序需要通过其消息循环接收此消息。

剩下的就是在BHO中获得回调,当您的项目被单击以完成所有这一切!

编辑:这可能是有用的:是否可以使用BHO (IE8)来跟踪用户点击的链接