VS2010扩展之天一搜索

来源:互联网 发布:学软件的网站 编辑:程序博客网 时间:2024/04/19 13:14

我在编码遇到不懂得API时往往需要求助于百度、google、csdn,卖药的百度对于码农来讲简直是个鸡肋:优势时有很多中文,不需要我们翻译就能看懂;劣势是基本搜不到有用的信息,因此我建议不懂的时候优先级是MSDN,再google最后百度。360个疯子我就不用它了。

一、软件功能:

在VS2010中可以将选中的文本用百度、google、msdn搜索。界面中红色圈中的工具栏即为这个插件生成的。

下载地址:http://pan.baidu.com/share/link?shareid=275611&uk=990160893 

查看更多精彩图片

 

二、开发相关

该插件是在VS2010平台上用ATL开发的,利用向导建立一个ATL插件工程

核心代码如下,如果你需要修改,将位图ID修改成你了就可以了:

// Connect.cpp : Implementation of CConnect
#include "stdafx.h"
#include "AddIn.h"
#include "Connect.h"

extern CAddInModule _AtlModule;
#define MSDN_SEARCH_COMMAND L"tianyiSearch.Connect.MSDN搜索"
#define BAIDU_SEARCH_COMMAND L"tianyiSearch.Connect.百度搜索"
#define GOOGLE_SEARCH_COMMAND L"tianyiSearch.Connect.谷歌搜索"
#define BAIDU_SEARCH _T("百度搜索")
#define MSDN_SEARCH _T("MSDN搜索")
#define GOOGLE_SEARCH L"谷歌搜索"
// CConnect
STDMETHODIMP CConnect::OnConnection(IDispatch *pApplication, ext_ConnectMode ConnectMode, IDispatch *pAddInInst, SAFEARRAY ** /*custom*/ )
{
 HRESULT hr = S_OK;
 pApplication->QueryInterface(__uuidof(DTE2), (LPVOID*)&m_pDTE);
 pAddInInst->QueryInterface(__uuidof(AddIn), (LPVOID*)&m_pAddInInstance);
 if ( ConnectMode == 5 )
 {
  CComQIPtr<_CommandBars> spCommandBars;
  CComQIPtr<IDispatch> spDispatch;
  CComQIPtr< Commands >spCommands;
  CComQIPtr<Commands2> spCommands2;
  m_pDTE->get_Commands(&spCommands);
  spCommands2 = spCommands;
  m_pDTE->get_CommandBars(&spDispatch);
  spCommandBars = spDispatch;
  CComQIPtr<CommandBar> spToolbar;
  _variant_t strName( _T("天一搜索") );
  spCommandBars->get_Item(strName, &spToolbar);
  if ( NULL != spToolbar )
  {
   spCommands->RemoveCommandBar(spToolbar);
  }
  //添加工具栏
  CComQIPtr<IDispatch> spDispatchToolBar;
  spCommands2->AddCommandBar( strName.bstrVal, vsCommandBarTypeToolbar, NULL, msoBarTop, &spDispatchToolBar);
  spToolbar = spDispatchToolBar;
  IfFailGoCheck( S_OK, spToolbar );
  _variant_t vCommandId( BAIDU_SEARCH_COMMAND );
  //百度搜索
  CComPtr<EnvDTE::Command> spCommandBaidu;
  spCommands->Item(vCommandId, 0, &spCommandBaidu);
  {
   if ( spCommandBaidu == NULL )
   {
    _variant_t vtBitmap( IDB_BITMAP_BAIDU );
    HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(BAIDU_SEARCH), CComBSTR(BAIDU_SEARCH),
     CComBSTR(BAIDU_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
     vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandBaidu);
    IfFailGoCheck( hr, spCommandBaidu );
   }  
   CComQIPtr<IDispatch> spDispDest;   
   hr = spCommandBaidu->AddControl(spToolbar, 1, &spDispDest);
   IfFailGoCheck( hr, spDispDest );
  }
  //google搜索
  CComPtr<EnvDTE::Command> spCommandGoogle;
  _variant_t googleId( GOOGLE_SEARCH_COMMAND );
  spCommands->Item( googleId, 0, &spCommandGoogle );
  {
   if ( spCommandGoogle == NULL )
   {
    _variant_t vtBitmap( IDB_BITMAP_GOOGLE );
    HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(GOOGLE_SEARCH), CComBSTR(GOOGLE_SEARCH),
     CComBSTR(GOOGLE_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
     vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandGoogle);
    IfFailGoCheck( hr, spCommandGoogle  );
   }   
   CComQIPtr<IDispatch> spDispDest;
   hr = spCommandGoogle->AddControl(spToolbar,1, &spDispDest);
   IfFailGoCheck( hr, spDispDest );
  }

  //MSDN
  //google搜索
  CComPtr<EnvDTE::Command> spCommandMSDN;
  _variant_t msdnId( MSDN_SEARCH_COMMAND );
  spCommands->Item( msdnId, 0, &spCommandMSDN );
  {
   if ( spCommandMSDN == NULL )
   {
    _variant_t vtBitmap( IDB_BITMAP_MSDN );
    HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(MSDN_SEARCH), CComBSTR(MSDN_SEARCH),
     CComBSTR(MSDN_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
     vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandMSDN);
    IfFailGoCheck( hr, spCommandMSDN  );
   }   
   CComQIPtr<IDispatch> spDispDest;
   hr = spCommandMSDN->AddControl(spToolbar,1, &spDispDest);
   IfFailGoCheck( hr, spDispDest );
  }
  return S_OK;
 }
Error:
 return hr;
}

STDMETHODIMP CConnect::OnDisconnection(ext_DisconnectMode /*RemoveMode*/, SAFEARRAY ** /*custom*/ )
{
 m_pDTE = NULL;
 m_pAddInInstance = NULL;
 return S_OK;
}

STDMETHODIMP CConnect::OnAddInsUpdate (SAFEARRAY ** /*custom*/ )
{
 return S_OK;
}

STDMETHODIMP CConnect::OnStartupComplete (SAFEARRAY ** /*custom*/ )
{
 return S_OK;
}

STDMETHODIMP CConnect::OnBeginShutdown (SAFEARRAY ** /*custom*/ )
{
 return S_OK;
}

STDMETHODIMP CConnect::QueryStatus(BSTR bstrCmdName, vsCommandStatusTextWanted NeededText, vsCommandStatus *pStatusOption, VARIANT *pvarCommandText)
{
  if(NeededText == vsCommandStatusTextWantedNone)
 {
   if(!_wcsicmp(bstrCmdName, BAIDU_SEARCH_COMMAND ) ||
    !_wcsicmp(bstrCmdName, MSDN_SEARCH_COMMAND ) ||!_wcsicmp(bstrCmdName, GOOGLE_SEARCH_COMMAND ))
   {
    *pStatusOption = (vsCommandStatus)(vsCommandStatusEnabled+vsCommandStatusSupported);
   }
  }
 return S_OK;
}

STDMETHODIMP CConnect::Exec(BSTR bstrCmdName, vsCommandExecOption ExecuteOption, VARIANT * /*pvarVariantIn*/, VARIANT * /*pvarVariantOut*/, VARIANT_BOOL *pvbHandled)
{
 *pvbHandled = VARIANT_FALSE;
 if(ExecuteOption == vsCommandExecOptionDoDefault)
 {
  CComQIPtr<Document> spActiveDoc;
  HRESULT hr = m_pDTE->get_ActiveDocument(&spActiveDoc);
  if ( S_OK != hr || NULL == spActiveDoc )
  {
   MessageBox( NULL, _T("没有打开的窗口"), _T("提示"), MB_OK );
   return S_OK;
  }

  //获得选中文本
  CComQIPtr<IDispatch> spDisptach;
  CComQIPtr<TextSelection> spTextSel;
  hr = spActiveDoc->get_Selection(&spDisptach); 
  spTextSel = spDisptach;
  //获得字符串
  _bstr_t bstrText;
  spTextSel->get_Text(bstrText.GetAddress());
  if(!_wcsicmp(bstrCmdName, BAIDU_SEARCH_COMMAND ) )
  {
   *pvbHandled = VARIANT_TRUE;
   _bstr_t strUrl = _T("http://www.baidu.com/s?wd=");
   strUrl  += bstrText;   
   ShellExecute( NULL, _T("Open"), strUrl,NULL,NULL, SW_SHOW );
   return S_OK;
  }
  else if ( !_wcsicmp(bstrCmdName, MSDN_SEARCH_COMMAND ) )
  {
   *pvbHandled = VARIANT_TRUE;
   keybd_event( VK_F1, 0, 0, 0 );
   return S_OK;
  }
  else if ( !_wcsicmp(bstrCmdName, GOOGLE_SEARCH_COMMAND ) )
  {
   *pvbHandled = VARIANT_TRUE;
   _bstr_t strGoogle = _T("http://www.google.com.hk/search?sourceid=chrome&ie=UTF-8&q=");
   strGoogle += bstrText;
   ShellExecute( NULL, _T("Open"), strGoogle,NULL,NULL, SW_SHOW );
   return S_OK;
  }
 }
 return S_OK;
}