网页按钮启动应用程序

from:http://blog.csdn.net/wxl1986622/article/details/7323832

当你点击网页上的按钮启动QQ的时候,你是否和想知道他是如何找到你的QQ的呢,其实不难想象,《注册表》成为了找你程序的关键,好的废话不多说了先看代码:

Windows Registry Editor Version 5.00  声明注册表编辑器5.0版本

[HKEY_CLASSES_ROOT\DDIT]      在注册表HKEY_CLASSES_ROOT目录下建立DDIT项(这个就是你的协议名字,下面会讲到用处)。
@="IMHelpProtocol"    DDIT项里面的默认键的值(随意起)
"URL Protocol"="要启动的程序的绝对路径"

[HKEY_CLASSES_ROOT\DDIT\DefaultIcon]
@="要启动的程序的绝对路径,2"(后面的数字控制的是当你点击按钮启动本地程序的时候弹出的提示框上边显示的你的程序的ICO 图标)。

[HKEY_CLASSES_ROOT\DDIT\shell]

 

[HKEY_CLASSES_ROOT\DDIT\shell\open]

 

[HKEY_CLASSES_ROOT\DDIT\shell\open\command]


@="\"要启动的程序的绝对路径" \"%1\""
把这些东西写好到记事本里面,修改他的扩展名为.reg 这样你就在注册表里面注册了一个DDIT://开头的协议了

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

然后开始写html 代码<a href=ddit://123&456&789&0123>Click   Here  </a> 建立一个这样的连接,然后打开网页点击超连接,当注册表检测到ddit://开头的协议以后就回去注册表里面找他对应的打开项,然后ddit://123&456&789&0123这一整段话就会被传递到程序里面,程序打开。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是这是需要用户点击注册表文件才能使文件注册到注册表里面,但是怎么才能实现不点击注册文件就实现呢,那我们只能把这段修改注册表的代码写入到要启动的程序,的初始化部门。具体代码如下:

HKEY RegKey=NULL;
CString fullName="IMHelpProtocol";
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());
fullName="要启动的文件的绝对路径";
RegSetValueEx(RegKey,"URL Protocol",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());

fullName="要启动的文件的绝对路径,1"; 设置图标的
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\DefaultIcon",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());

RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell",&RegKey);
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell\\open",&RegKey);
fullName="\"要启动的文件的绝对路径" \"%1\"";
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell\\open\\command",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength()); 

下面的的代码为MFC 内代码等同于上边的注册表文件代码。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是还有一些变态的 客户需要获取网页上的数据,传递给程序,这时候ddit://123&456&789&0123就是你发送的参数你可以需改//后面的字符串作为参数传递进来 中间可以用特殊符号标识,但是怎么接收呢,当然需要强大的API拉:CString text=AfxGetApp()->m_lpCmdLine;

其中的text的值就等于ddit://123&456&789&0123拉

剩下就截取拉 懒人请继续往下看:由于作为初学者代码写的比较麻烦,高手请路过,代码如下

 CString* listmessage =new CString[4]();

int p1,p2,p3,p4;
   p4=a.GetLength();
   p1=a.Find("&");
   
   listmessage[0]=a.Mid(8,p1-8);
   p2=a.Find("&",p1+1);

   listmessage[1]=a.Mid(p1+1,p2-p1-1);
   p3=a.Find("&",p2+1);
   listmessage[2]=a.Mid(p2+1,p3-p2-1);
   listmessage[3]=a.Mid(p3+1,p4-p3-3);
   AfxMessageBox(listmessage[0]);
   AfxMessageBox(listmessage[1]);
   AfxMessageBox(listmessage[2]);
   AfxMessageBox(listmessage[3]);

这个就写把用&特殊符号隔开的字符串获取出来分别存放在数组listmessage[0]到listmessage[3]中应为只用了4个参数所以长度只定义4个。

补充一点:可以使用一下代码获取当前程序的绝对路径

TCHAR szPath[MAX_PATH];

GetModuleFileName( NULL, szPath, MAX_PATH )

CString load=(CString)szPath;

load就是程序的绝对路径。    看了这些还有不明白的请联系QQ729839976

 

 

from:http://www.vckbase.com/index.php/wv/1500

 如果你电脑中装有QQ,在IE地址栏输入:“tencent://Message/?menu=yes&exe=&uin=13231462”然后[回车],立即可以与我的QQ建立临时会话,

Skype也有类似的功能。到底是如何实现的呢?看MSDN中有这么一段话:

  The IURLSearchHook interface is used by the browser to translate the address of an unknown URL protocol. When attempting to browse to a URL address that does not contain a protocol, the browser will first attempt to determine the correct protocol from the address. If this is not successful, the browser will create URL Search Hook objects and call each object's Translate method until the address is translated or all of the hooks have been queried.

  IURLSearchHook接口被浏览器用来转换一个未知的URL协议地址。当浏览器企图去打开一个未知协议的URL地址时,浏览器首先尝试从这个地址得到当前的协议,如果不成功,浏览器将创建在系统中注册的URL Search Hook对象并调用每一个对象的Translate方法,直到地址被转换或所有的URL Search Hook都尝试过。
  也就是说,我们可以注册一种目前不存在的协议(类似HTTP),当浏览器遇到新的协议时会自动调用Translate方法来翻译我们的协议,甚至激活我们自己的程序。

以下源代码将实现注册一个新的自定义的Web协议:

//
// 注册自定义的Web协议
// return : ------------------------------------------------------------------------
//        0    -    失败
//        1    -    成功
//        2    -    已经存在
//
int RegWebProtocol ( LPCTSTR lpszProtocolName, LPCTSTR lpszAssociatedApp, int nIconIndex/*=0*/ )
{
    if ( !lpszProtocolName ||
         lstrlen(lpszProtocolName) < 1 ||
         !lpszAssociatedApp ||
         lstrlen(lpszAssociatedApp) < 1 )  
        return 0;

    CString csSubKey;
    DWORD dwBufSize = 0;

    // 该协议已经存在
    HKEY hKey = NULL;
    if ( RegOpenKeyEx ( HKEY_CLASSES_ROOT,
                lpszProtocolName,
,
                KEY_ALL_ACCESS,
                &hKey ) == ERROR_SUCCESS )
    {
        return 2;
    }
    else hKey = NULL;

    // 创建协议子键
    if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, lpszProtocolName ) )
        return 0;

    // 设置协议描述字符串
    CString csProtocolDesc; csProtocolDesc.Format ( _T("%sProtocol"), lpszProtocolName );
    dwBufSize = csProtocolDesc.GetLength();
    if ( !WriteRegister ( HKEY_CLASSES_ROOT, lpszProtocolName,
        _T(""), REG_EXPAND_SZ, (PUCHAR)csProtocolDesc.GetBuffer(0),&dwBufSize) )
        return 0;
    CString csAppFile; csAppFile.Format ( _T("%s"), lpszAssociatedApp );
    dwBufSize = csAppFile.GetLength();
    if ( !WriteRegister ( HKEY_CLASSES_ROOT, lpszProtocolName,
        _T("URL Protocol"), REG_EXPAND_SZ, (PUCHAR)csAppFile.GetBuffer(0),&dwBufSize) )
        return 0;

    // DefaultIcon 子键
    csSubKey.Format ( _T("%s\\DefaultIcon"), lpszProtocolName );
    if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
        return 0;
    CString csIconParameter; csIconParameter.Format ( _T("%s,%d"), lpszAssociatedApp, nIconIndex );
    dwBufSize = csIconParameter.GetLength();
    if ( !WriteRegister ( HKEY_CLASSES_ROOT, csSubKey,
        _T(""), REG_EXPAND_SZ, (PUCHAR)csIconParameter.GetBuffer(0),&dwBufSize) )
        return 0;

    // shell\open\command 子键
    csSubKey.Format ( _T("%s\\shell\\open\\command"), lpszProtocolName );
    if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
        return 0;
    CString csCommand; csCommand.Format ( _T("\"%s\" \"%%1\""), lpszAssociatedApp );
    dwBufSize = csCommand.GetLength();
    if ( !WriteRegister ( HKEY_CLASSES_ROOT, csSubKey,
        _T(""), REG_EXPAND_SZ, (PUCHAR)csCommand.GetBuffer(0),&dwBufSize) )
        return 0;

    return 1;
}

以下源代码将删除自定义的Web协议:
//
// 卸载自定义的Web协议
//
BOOL UnRegWebProtocol ( LPCTSTR lpszProtocolName )
{  
    if ( !lpszProtocolName || lstrlen(lpszProtocolName) < 1 )
        return FALSE;

    return RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, lpszProtocolName );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值