将IE的右键搬到opera里

原创 2007年10月06日 20:10:00

IE的右键大部分是去调用一个html文件,里面写了一个脚本来调用程序,本文通过研究脚本来使opera也可以调用程序.
一.迅雷
查找注册表"HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/使用迅雷下载"
其中   默认=D:/Program Files/Green Files/Thunder Network/Thunder/Program/geturl.htm
表明去调用 D:/Program Files/Green Files/Thunder Network/Thunder/Program/geturl.htm
打开,内容如下
<script language="javascript">


function AddLink(Url,Info,Location,strCID,strStatUrl,strCookie)
{
 if (Url != "")
 {
  if (Info == "")
  {
   Info = "unknown";
  }
  var ThunderAgent = new ActiveXObject("ThunderAgent.Agent");
  
  if (strCID != "")
  {
   if (strStatUrl != "")
   {
    
    ThunderAgent.AddTask5(Url, "", "", Info, Location, -1, 0, -1,  strCookie, strCID, strStatUrl, 1, "", -1);
   }
   else
   {
    ThunderAgent.AddTask5(Url, "", "", Info, Location, -1, 0, -1,  strCookie, strCID, "", 1, "", -1);
   }
  }
  else
  {
   ThunderAgent.AddTask5(Url, "", "", Info, Location,-1,0,-1,strCookie,"","", 1, "", -1);
  }
  ThunderAgent.CommitTasks2(1);
 }
}

function OnContextMenu()
{
 var srcEvent = external.menuArguments.event;
 var EventElement;
 
 if(typeof(srcEvent.clientX) == "undefined")
 {
  EventElement = external.menuArguments.document.elementFromPoint ( srcEvent.pointerX, srcEvent.pointerY );
 }
 else
 {
  EventElement = external.menuArguments.document.elementFromPoint ( srcEvent.clientX, srcEvent.clientY );
 }
  
  

 var strDownloadPage = external.menuArguments.location;
 var theDownloadPage = external.menuArguments.document.getElementById("thunder_down_pageurl");
 
 if (theDownloadPage != null)
 {
  strDownloadPage = theDownloadPage.value;
 }
 

 var strStatPage = "";
 var theStatPage = external.menuArguments.document.getElementById("thunder_stat_pageurl");
 if (theStatPage != null)
 {
  strStatPage = theStatPage.value;
 }

 var strCID = ""
 var theCID = external.menuArguments.document.getElementById("thunder_cid");
 if (theCID != null)
 {
  strCID = theCID.value;
 }
 var srcAnchor;

 if (srcEvent.type == "MenuExtAnchor")
 {

  srcAnchor = EventElement;

  do
  {
   srcAnchor=srcAnchor.parentElement;
  }while(typeof(srcAnchor)=="HTMLAnchorElement");
  
  AddLink(srcAnchor.href,srcAnchor.innerText,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
 }
 else if (srcEvent.type == "MenuExtImage")
 {
  if (typeof(EventElement) == "HTMLAreaElement")
  {
   AddLink(EventElement.href,EventElement.Alt,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
  }
  else
  {
   var srcImage = EventElement;
   var srcAnchor = srcImage.parentElement;
   do
   {
    srcAnchor=srcAnchor.parentElement;
    if (typeof(srcAnchor) == "undefined")
    {
     AddLink(srcImage.href,srcImage.Alt,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
     return;
    }
   }while(typeof(srcAnchor) == "HTMLAnchorElement");
   AddLink(srcAnchor.href,srcImage.Alt,strDownloadPage, strCID, strStatPage);
  }
 } 
 else if (srcEvent.type == "MenuExtUnknown")
 {
 srcAnchor = EventElement;
 if(srcAnchor != null && srcAnchor.tagName != null && srcAnchor.tagName.toLowerCase() == "a")
     {
         AddLink(srcAnchor.href,srcAnchor.innerText,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
     }
     else
     {
         while(srcAnchor != null && srcAnchor.tagName != null && srcAnchor.tagName.toLowerCase() != "a")
         {
             srcAnchor = srcAnchor.parentElement;
             if(srcAnchor != null && srcAnchor.tagName != null && srcAnchor.tagName.toLowerCase() == "a")
             {
                 AddLink(srcAnchor.href,srcAnchor.innerText,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
                 return;
             }
         }
   
         if(EventElement != null && EventElement.tagName != null)
         {
             AddLink(EventElement.href,EventElement.innerText,strDownloadPage, strCID, strStatPage,external.menuArguments.document.cookie);
         }
         else
         {
             alert("无法识别的超级链接信息");
         }
     }
 }
 else
 {
  
 }
}

 


OnContextMenu();

</script>

注意主要内容,它是先生成一个com对象名为"ThunderAgent ",com注册名称为"ThunderAgent.Agent"(很重要).
  var ThunderAgent = new ActiveXObject("ThunderAgent.Agent");
然后调用ThunderAgent 的函数AddTask5,CommitTasks2(很重要)
ThunderAgent.AddTask5(Url, "", "", Info, Location, -1, 0, -1,  strCookie, strCID, "", 1, "", -1);
ThunderAgent.CommitTasks2(1);
脚本分析完毕,开始编程
打开VC,新建一个win32控制台程序,设置为UNICODE环境
代码:
//author: hgyxb
//Email: xiaolan1980@gmail.com

#include "stdafx.h"
#include <windows.h>
using namespace std;
#ifdef   _UNICODE  
#define   tstring   wstring  
#else  
#define   tstring   string  
#endif 


//设置迅雷com路径
#define ActiveXPath "D:/Program Files/Green Files/Thunder Network/Thunder/ComDlls/ThunderAgent.dll"
#import  ActiveXPath no_namespace
//设置迅雷com的对象类型
typedef IAgent CActiveX;
//设置com的对象名称
tstring g_strObjName=L"ThunderAgent.Agent";

CActiveX* InitActiveX(tstring &strObjName)
{
 CLSID clsid;
 HRESULT hr = ::CLSIDFromProgID(strObjName.c_str(), &clsid);
 if(SUCCEEDED(hr))
 {

  CActiveX *pAgent = NULL;
  hr = ::CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,__uuidof(CActiveX),
   (void **)&pAgent);
  if(SUCCEEDED(hr))
  {
   return pAgent;
  }else
  {
   return NULL;
  }
 }else
 {
  return NULL;
 }
}


wstring ConvertAnsiToUnicode(const string strAnsi)
{
 wstring strUnicode;
 int len=MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, NULL,0);
 PWSTR wsz=new WCHAR[len+1];
 wsz[len]=0;
 MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, wsz, len);
 strUnicode=wsz;
 delete []wsz;
 return  strUnicode;
}

//获得剪切板内容
tstring GetClipboardText()
{
 tstring str=L"";
 CHAR  * pBuf;
 HWND hWnd;
 hWnd= GetDesktopWindow();
 if(OpenClipboard(hWnd))
 {
  if(IsClipboardFormatAvailable(CF_TEXT)) // 判定剪切板数据格式
  {
   HANDLE hClip;
   hClip=::GetClipboardData(CF_TEXT);
   pBuf=(char*)GlobalLock(hClip);
   GlobalUnlock(hClip);
   if (pBuf !=NULL)
   {
    str=ConvertAnsiToUnicode(string(pBuf));
   }
  }
  CloseClipboard();
 }
 return str;
}


#pragma comment( linker, "/subsystem:/"windows/" /entry:/"wmainCRTStartup/"" )//隐藏窗口
int _tmain(int argc, _TCHAR* argv[])
{
 ::CoInitialize(NULL);
 CActiveX *obj=InitActiveX(g_strObjName);
 if(obj == NULL)
 {
  ::CoUninitialize();
  MessageBox(NULL,L"无法启动程序,请检查程序是否安装正确!",L"警告",MB_YESNO);
  return 0;
 }
 /////////

 //在这里你可以添加你的代码了
 if (argc>1)
 {
  obj->AddTask(argv[1],"","","","",-1,0,-1);//argv[1]为程序接收到的参数
  obj->CommitTasks();
  obj->Release(); 
 }
 //添加代码结束

 /////////////
 ::CoUninitialize();
 return 0;
}

1.其中迅雷com的路径根据经验找,一般和com名相似.
2.com的对象名称从脚本中获得.
3.IAgent这个类型是在编译程序后,Debug目录下会出现thunderagent.tlh文件(import "ThunderAgent.dll"后会出现),打开thunderagent.tlh,里面全是
定义,定义类型为IAgent类,所以用IAgent.
4.以下代码根据脚本和thunderagent.tlh文件里的定义并且试验然后如此使用
obj->AddTask(argv[1],"","","","",-1,0,-1);//argv[1]为程序接收到的参数
obj->CommitTasks();
obj->Release(); 

将编译出的xunlei_opera.exe文件放到opera安装目录下.
编辑Opera/profile/menu/standard_menu (1).ini
在[Link Popup Menu]中添加
Item,"迅雷"=Execute Program,"xunlei_opera.exe","%l"
下载xunlei_opera.exe
http://www.91files.com/?GJMFXIT9UCJPFTL52DY1

下面再给一个案例,添加右键调用"文语通"朗读
ir_Link.htm(对应IE右键"使用“文语通”朗读链接")内容
<script language="VBScript">
'Great thanks to Vladimir Romanov(Author of ReGet Pro)
'Download selected link

Sub AddLink(Url,Info)
 On Error Resume Next
 set irComCache=CreateObject("IReaderCom.IReader")
 if err<>0 then
  MsgBox("FlashGet not properly installed!"+ vbCrLf+"Please install FlashGet again")
 else
  call irComCache.PlayUrl(Url)
        end if
end sub

Sub OnContextMenu()
 'set srcEvent = external.menuArguments.event
 set EventElement = external.menuArguments.document.elementFromPoint ( srcEvent.clientX, srcEvent.clientY )
 if srcEvent.type = "MenuExtAnchor" then
  set srcAnchor = EventElement
  do until TypeName(srcAnchor)="HTMLAnchorElement"
   set srcAnchor=srcAnchor.parentElement
  Loop
  Call AddLink(srcAnchor.href,srcAnchor.innerText)
 elseif srcEvent.type="MenuExtImage" then
  if TypeName(EventElement)="HTMLAreaElement" then
   Call AddLink(EventElement.href,EventElement.Alt)
  else
   set srcImage = EventElement
   set srcAnchor = srcImage.parentElement
   do until TypeName(srcAnchor)="HTMLAnchorElement"
    set srcAnchor=srcAnchor.parentElement
    if TypeName(srcAnchor)="Nothing" then
     call AddLink(srcImage.href,srcImage.Alt)
     exit sub
    end if
   Loop
   Call AddLink(srcAnchor.href,srcImage.Alt)
  end if
 elseif srcEvent.type="MenuExtUnknown" then
  set srcAnchor = EventElement
  do until TypeName(srcAnchor)="HTMLAnchorElement"
   set srcAnchor=srcAnchor.parentElement
   if TypeName(srcAnchor)="Nothing" then
    Call AddLink(EventElement.href,EventElement.innerText)
    exit sub
   end if
  Loop
  Call AddLink(srcAnchor.href,srcAnchor.innerText)
 elseif 1=1 then
  MsgBox("Unknown Event Source """ + srcEvent.type + """" + vbCrLf + "Please send description of error to http://support.iflytek.com/desktop")
 end if
end sub


call OnContextMenu()

</script>

ir_Select.htm(对应IE右键"使用“文语通”朗读选定内容")内容
 <SCRIPT LANGUAGE="JavaScript">
     var irComCache = new ActiveXObject("IReaderCom.IReader")
     var parentwin = external.menuArguments;
     var doc = parentwin.document;
     var sel = doc.selection;
     var rng = sel.createRange();
     var str = new String(rng.text);
   if( str!="")
   {
     irComCache.PlayContent(str);
   }
</SCRIPT>


VC代码:
//author: hgyxb
//Email: xiaolan1980@gmail.com

#include "stdafx.h"
#include <windows.h>
using namespace std;
#ifdef   _UNICODE  
#define   tstring   wstring  
#else  
#define   tstring   string  
#endif 


//将外部程序的com组件(即dll文件)路径代替D:/Program Files/iFly Info Tek/iReader2.0/IReaderCom.dll
#define ActiveXPath "D:/Program Files/iFly Info Tek/iReader2.0/IReaderCom.dll"
#import  ActiveXPath no_namespace
//将类型IIReader改为外部程序的类型
typedef IIReader CActiveX;
//将外部程序com组件的名称代替IReaderCom.IReader
tstring g_strObjName=L"IReaderCom.IReader";

CActiveX* InitActiveX(tstring &strObjName)
{
 CLSID clsid;
 HRESULT hr = ::CLSIDFromProgID(strObjName.c_str(), &clsid);
 if(SUCCEEDED(hr))
 {

  CActiveX *pAgent = NULL;
  hr = ::CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,__uuidof(CActiveX),
   (void **)&pAgent);
  if(SUCCEEDED(hr))
  {
   return pAgent;
  }else
  {
   return NULL;
  }
 }else
 {
  return NULL;
 }
}

wstring ConvertAnsiToUnicode(const string strAnsi)
{
 wstring strUnicode;
 int len=MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, NULL,0);
 PWSTR wsz=new WCHAR[len+1];//strUnicode.GetBufferSetLength(len+1);
 wsz[len]=0;
 MultiByteToWideChar(CP_ACP, 0, strAnsi.c_str(), -1, wsz, len);
 strUnicode=wsz;
 delete []wsz;
 return  strUnicode;
}

//获得剪切板内容
tstring GetClipboardText()
{
 tstring str=L"";
 CHAR  * pBuf;
 HWND hWnd;
 hWnd= GetDesktopWindow();
 if(OpenClipboard(hWnd))
 {
  if(IsClipboardFormatAvailable(CF_TEXT)) // 判定剪切板数据格式
  {
   HANDLE hClip;
   hClip=::GetClipboardData(CF_TEXT);
   pBuf=(char*)GlobalLock(hClip);
   GlobalUnlock(hClip);
   if (pBuf !=NULL)
   {
    str=ConvertAnsiToUnicode(string(pBuf));
   }
  }

  CloseClipboard();
 }
 return str;
}


#pragma comment( linker, "/subsystem:/"windows/" /entry:/"wmainCRTStartup/"" )//隐藏窗口
int _tmain(int argc, _TCHAR* argv[])
{
 ::CoInitialize(NULL);
 CActiveX *obj=InitActiveX(g_strObjName);
 if(obj == NULL)
 {
  ::CoUninitialize();
  MessageBox(NULL,L"无法启动程序,请检查程序是否安装正确!",L"警告",MB_YESNO);
  return 0;
 }
 /////////

 //在这里你可以添加你的代码了
           //如果有参数,那就播放网页链接,否则播放剪切板中的内容
 if (argc>1)
 {
  obj->PlayUrl(argv[1]);
 }else
 {
  tstring strContent=GetClipboardText();
  if (strContent.length() != 0)
  { 
   obj->PlayContent(strContent.c_str());
  }
 }

 //添加代码结束

 /////////////
 ::CoUninitialize();
 return 0;
}

将编译出的ireader_opera.exe文件放到opera安装目录下.
编辑Opera/profile/menu/standard_menu (1).ini
在[Link Popup Menu]中添加
Item,"朗读链接"=Execute program, "ireader_opera.exe","%l"
在[Hotclick Popup Menu]添加
Item,  "用iRead朗读"=Copy&Execute program,"ireader_opera.exe"
下载ireader_opera
http://www.91files.com/?9LG7WARNHCZGO98GZA7Y

 

IE屏蔽鼠标右键、禁止复制粘贴等功能

body oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforeco...
  • ufojoan
  • ufojoan
  • 2014年04月11日 12:05
  • 856

屏蔽浏览器右键菜单功能,自定义右键菜单(兼容IE8)

做了个自定义右键菜单的功能,和获取选中文本内容相关,一起记录一下。网上查阅尝试了很多方式,选择了一个较为简洁的方式实现,代码很少,进行细节调整后发现存在IE8兼容性问题,又查阅资料后进行了优化,目前可...
  • m0_37578731
  • m0_37578731
  • 2017年12月11日 15:58
  • 179

opera_12.17终结辉煌纪念版

opera_12.17终结辉煌纪念版 追加以下新功能: 一键获得获得taobao信息(方便得到买家名,宝贝名) 网购信息 记事软件 灌论坛 自动灌水   我们...
  • lovedeadyou
  • lovedeadyou
  • 2014年05月13日 09:34
  • 2441

手机web开发:使用Opera Dragonfly远程调试Opera Mobile页面

零散的学了些关于移动前端的东西,晚上生病好多了,爬起来写写。 平时我也不常用Opera的Dragonfly,基本上都是用Firebug,Chrome、IE 的developer tools。...
  • huanghailang
  • huanghailang
  • 2017年03月30日 09:51
  • 666

最全整理浏览器兼容性问题与解决方案

常见浏览器兼容性问题与解决方案   所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的...
  • u010427666
  • u010427666
  • 2016年05月25日 17:37
  • 10440

右键弹出菜单和快捷键的设置

写MFC,少不了用到菜单和快捷键,此处我用到了右键菜单。我的项目是一个播放器的实现,那么在屏幕中央右键点击,应该会弹出右键菜单,比如播放,暂停等,如我这样: 对应的每一个菜单应该还有相应的快捷键。那...
  • u013051748
  • u013051748
  • 2015年04月25日 13:53
  • 2564

Chrome firefox ie等浏览器空格&nbsp;宽度不一样怎么办

之前某个页面用了空格 ,但是在chrome firefox 和ie显示的宽度都不一样,无法对齐。 搜索了一下,很多人都转载了那篇设置成宋体的,可是仍然没对齐,要么ie对齐,要么ch...
  • u014802309
  • u014802309
  • 2015年09月15日 10:52
  • 1647

关于无边框EXE程序窗口嵌入IE浏览器WebBrowser右键属性窗口无法点击响应问题的解决

好久没写博客了,今天有空写点。最近遇到个问题,就是我有一个Delphi写的exe程序,主窗口没有边框(Style=bsNone),标题和边框都是自己画的,然后我嵌了一个TWebBrowser浏览器,一...
  • huzgd
  • huzgd
  • 2015年12月29日 15:32
  • 1960

怎么禁用Opera浏览器的自动更新功能

向Chrome看齐,新版Opera浏览器中加入了一个类似自动更新的特性,它会每隔一段时间与服务器进行通信,检查是否有新的Opera Release推送,有的话则会静默下载,并在用户重启浏览器之后进行覆...
  • k_shmily
  • k_shmily
  • 2016年07月12日 08:33
  • 1972

如何添加右键菜单命令

当遇到windows识别不了的文件时,我希望能直接点右键中的“用记事本打开”查看文件,请问如何实现?? 这个很简单的,跟着我做,  按开始-》运行-》输入regedit 打开注册表,在左面...
  • T_27080901
  • T_27080901
  • 2015年02月03日 22:34
  • 789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将IE的右键搬到opera里
举报原因:
原因补充:

(最多只允许输入30个字)