关闭

将IE的右键搬到opera里

标签: operaienullstringlinkermenu
1342人阅读 评论(0) 收藏 举报

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19686次
    • 积分:397
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:10条
    我的独立博客
    文章分类
    最新评论