Delphiを使用してIE右クリックメニュー拡張を開発する

9713 ワード

Delphiを使用してIE右クリックメニュー拡張を開発する
紹介する
IEは、カスタマイズされたメインメニューの追加に加えて、右クリックメニューにカスタマイズされたメニューの追加を許可します.多くの有名なネットソフト、例えばネットアリ、インターネット急行などは右クリックメニューにファイルをダウンロードできるショートカットメニューを追加しています.IEの右クリックメニュー拡張は他のCOM拡張とは異なり、他の拡張はレジストリに一定の構成情報を記入すれば使用できますが、右クリックメニュー拡張はJavaScriptスクリプトによって作成され、呼び出される必要があります.我々のCOMコンポーネントはスクリプト言語から作成できる必要があるため、右クリックメニュー拡張はAutomation(自動化)コンポーネントでなければならない.すなわち、IUnknownインタフェースのほかにIDispatchインタフェースもサポートしなければならない.幸いなことに、Delphiは内蔵の自動化COMコンポーネントのサポートを提供しており、標準的なTComObjectではなくTAutoObjectからCOMコンポーネントを派生させるだけでいいです.
IEを使ってウェブページの情报をコピーして贴り付けて、私はIEの右ボタンのメニューの中のコピーのコマンドがとても便利ではないことを発见して、例えば1つのハイパーリンクの上で右ボタンのメニューをアクティブにする时、コピーのショートカットだけが使うことができることを発见して、コピーのメニューは灰色で使用禁止の状态で、ある时私はハイパーリンクの自身をコピーしたいだけではなくて、またそのテキストをコピーしたいですこの場合、リンクのテキストを選択してからコピーするしかありません.これは不便です.次に、ハイパーリンクのテキストをコピーできる右クリックメニュー拡張子を作成します.
COMコンポーネントの作成
ActiveX Libraryプロジェクトを新規作成し、IEContextとして保存します.dprは、コマンドFile|New...|ActiveX|Automation Objectを使用してTIEContextMenuという自動化オブジェクトを作成し、CIEContextMenuとして保存する.pasファイル.次にTools|Environment Optionsコマンドを選択し、IDE構成管理インタフェースをアクティブにし、Type Libraryページに切り替え、タイプライブラリ言語をPascalに設定します.下図を参照してください.
LanguageオプションをPascalに設定すると、Type LibraryエディタはIDL言語ではなく、おなじみのPascal言語を使用してCOMのインタフェース定義を記述します.
次に、View|Type Libraryを使用してCOMコンポーネントのタイプライブラリエディタをアクティブにし、次の図のようにインタフェースメソッドCopyUrlTextを追加します.
 
CopyUrlTextは、接続に1つのパラメータしかないUrlTextとして使用されます.このパラメータは、後で作成したスクリプト文から渡されます.完成したCOMコンポーネントは以下のように実現される.
type
  TIEContextMenu = class(TAutoObject, IIEContextMenu)
  protected
    procedure CopyUrlText(const UrlText: WideString); safecall;
  end;
 
implementation
 
uses ComServ, Clipbrd, Dialogs, Sysutils, Windows, Registry;
 
procedure TIEContextMenu.CopyUrlText(const UrlText: WideString);
begin
  //            
  Clipboard.AsText:=UrlText;
end;

 
登録拡張
 
右クリックメニュー拡張を有効にするには、次のレジストリ・アイテムを入力する必要があります.
1.HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExtキーワードの下に、作成する右クリック拡張メニュー項目のタイトルテキストキーワードを追加します.テキストには、メニューのショートカットを指定するために&文字を含めることができます.
2.タイトルテキストキーワードのデフォルト値をスクリプト文を含むhtmlファイルに設定し、ユーザーがメニュー項目をクリックすると、IEはhtmlファイルのスクリプトを実行し、スクリプトに自動化オブジェクトを作成し、リンクテキストをパラメータとして自動化オブジェクトを呼び出す方法.
3.リンクテキストのコピーはリンクにのみ意味がありますが、他のhtmlページの要素には意味がありません.レジストリでHKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMenuExt<メニュータイトル>キーの下に、オプションのバイナリ値Contexts値を追加して、メニュー拡張表示のコンテキストを指定します.次の表は、コンテキストのリストです.
コンテキスト
値(16進)
デフォルト
0x1
画像
0x2
コントロール
0x4

0x8
テキスト選択
0x10
アンカーポイント
0x20
ハイパーリンクはコンテキスト内のアンカーポイントに属するため、contextsの値を32(16進数の20に等しい)に設定する必要があります.
 
次に、登録されたクラスファクトリの実装について説明します.
type
  TIEContextMenuFactory = class(TAutoObjectFactory)
  public
    procedure UpdateRegistry(Register: Boolean); override;
  end;
 
procedure AddExtMenuItem(MenuText, Url: string; Contexts:DWord);
var
  reg: TRegistry;
begin
  Reg := TRegistry.Create;
  with Reg do try
    RootKey := HKEY_CURRENT_USER;
    OpenKey('\Software\Microsoft\Internet Explorer\MenuExt\' + MenuText, True);
    WriteString('', Url);
    WriteInteger('contexts', contexts);
    CloseKey;
  finally
    Free;
  end;
end;
 
procedure RemoveExtMenuItem(MenuText: string);
var
  reg: TRegistry;
begin
  Reg := TRegistry.Create;
  with Reg do try
    RootKey := HKEY_CURRENT_USER;
    DeleteKey('\Software\Microsoft\Internet Explorer\MenuExt\' + MenuText);
  finally
    Free;
  end;
end;
 
procedure TIEContextMenuFactory.UpdateRegistry(Register: Boolean);
begin
  inherited;
  if Register then
    AddExtMenuItem('¸′      ', ExtractFilePath(GetDllName)+'copyurl.htm',32)
  else
    RemoveExtMenuItem('¸′      ');
end;
 
initialization
  TIEContextMenuFactory.Create(ComServer, TIEContextMenu, Class_IEContextMenu,
    ciMultiInstance, tmApartment);
end.

 
スクリプト文
 
COMコンポーネントの作成を完了し、残りのタスクはCOMコンポーネントを駆動するVBScript文の作成です.以下はcopyurlです.htmlの内のVBScriptの内容:

 
Sub CopyLink(UrlText)
       On Error Resume Next
       set CopyUrl=CreateObject("IEContext.IEContextMenu")
       if err<>0 then
              MsgBox("CopyUrl not properly installed!"+ vbCrLf+"Please register CopyUrl ")
       else
              call CopyUrl.CopyUrlText(UrlText)
        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 CopyLink(srcAnchor.innerText)
       elseif srcEvent.type="MenuExtUnknown"then
              set srcAnchor = EventElement
              do until TypeName(srcAnchor)="HTMLAnchorElement"
                     set srcAnchor=srcAnchor.parentElement
                     if TypeName(srcAnchor)="Nothing"then
                            Call CopyLink(EventElement.innerText)
                            exit sub
                     end if
              Loop
              Call CopyLink(srcAnchor.innerText)
       elseif 1=1 then
              MsgBox("Unknown Event Source """+ srcEvent.type + """"+ vbCrLf + "Please send description of error to [email protected]")
       end if
end sub
 
call OnContextMenu()
 

簡単にスクリプトの処理の流れを紹介して、IEがcopyurlをロードする時.htmでは、OnContextMenuプロシージャが自動的に呼び出されます.このプロシージャでは、変数externalを使用できます.menuArgumentsはIEのIDispatchインタフェースを取得し、externalを通過する.menuArguments.eventは、ユーザがクリックした位置を含むIEのクリックイベントの情報をさらに取得することができる(X、Y座標はClientXおよびClientY属性によって取得することができる).同時にIEの現在のページからexternalを通過することができる.menuArguments.document.ElementFromPointメソッドは、ポイント内のHTML要素を取得します.要素タイプがHTML AnchorElementの場合、それがリンクオブジェクトであることを示します.要素のinnerText属性は、対応するリンクのタイトルテキストであり、CopyLinkサブプロシージャを呼び出し、CopyLinkでCreateObject(「IEContext.IEContextMenu」)を呼び出して、私たちのメニュー拡張オブジェクトを作成します.ここでIEContext.IEContextMenuは、拡張オブジェクトのProgIDであり、プロジェクト名+Tを除く拡張オブジェクトのクラス名からなる.最後に取得したUrlテキストをパラメータとして拡張オブジェクトのCopyUrlTextを呼び出すと、メニューオブジェクトはシステムのクリップボードにテキストを配置する作業を完了します.
まとめ
メニューコマンドRun|Register ActiveX Serverを使用してレプリケーションリンクのテキスト拡張子を登録し、CDのdownloadを開きます.htmテキスト、リンクを選択し、右クリックメニューをクリックし、「リンクテキストのコピー」を実行した後、コピーした結果を手帳に貼り付け、コピーショートカットを実行し、コピーした結果をクリップボードに貼り付けた結果を下図に示す.
原文:http://www.codesky.net/article/doc/200801/2008011610823724.htm






『Android開発完全講義(第2版)』(本書の著作権は台湾に輸出されている)
http://product.dangdang.com/product.aspx?product_id=22741502



『Android高給の道:Androidプログラマー面接宝典』http://book.360buy.com/10970314.html

新浪微博:http://t.sina.com.cn/androidguyニックネーム:李寧Lining