关于ie扩展的问题(在浏览网站的时候,QQ的工具可以在mouse停到图片上的时候显示出来并可以添加到qq表情里)

angelface 2005-11-13 10:49:04
如上所述,就是要搞一个类似上面的东西,
把mouse停到图片上会出现一个小小的工具条,可以选则保存图片等操作、我在www.2ccc.com上下载了 一个flashsave的程序,但是好像不行,请各位帮忙,谢谢了。
...全文
416 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelface 2005-11-16
  • 打赏
  • 举报
回复
嗯 , 确实不好用, 也确实是加载了,
kongguangming 2005-11-15
  • 打赏
  • 举报
回复
我也用了那个flashsaver,也不起作用,不过确实被系统载入了。
ly_liuyang 2005-11-14
  • 打赏
  • 举报
回复
呵呵,有现成的框架可用的

_____________________
http://lysoft.7u7.net
angelface 2005-11-13
  • 打赏
  • 举报
回复
是啊, 就是想要知道这个com的原理,我现在只是知道要implements IObjectWithSite接口,
angelface 2005-11-13
  • 打赏
  • 举报
回复
CreateObject("QQCPHelper.CPAdder")
create一个object你不是也要有一个已经写好的activex注册到系统中了么, 如果你没有这个ActiveX在系统, 怎么create?Create什么?
上面的CreateObject("QQCPHelper.CPAdder")也是create了一个QQ的ActiveX不是么?
angelface 2005-11-13
  • 打赏
  • 举报
回复
可能是你把这些东西禁止了。
windows好像也自带了一个这种东西,
http://www.2ccc.com/article.asp?articleid=2080
这里面有张图片,可以看看,
xingzhou 2005-11-13
  • 打赏
  • 举报
回复
忘了一点了,上面的CreateObject("QQCPHelper.CPAdder")这里处理的是菜单执行的操作,这个需要写一个COM来实现,

-----------------
行舟
欢迎使用CSDN论坛浏览器
http://blog.csdn.net/xingzhou/
xingzhou 2005-11-13
  • 打赏
  • 举报
回复
楼主是不是搞错了,是不是鼠标右击图像的时候,在菜单里多了一个把图像添加为表情?
如果这样,那网上很多例子。方法是:
1. 写一个htm脚本,QQ的是:
<script language="VBScript">

Sub AddEmotion(strUrl)
On Error Resume Next
set cpAdder = CreateObject("QQCPHelper.CPAdder")
if 0 = err then
call cpAdder.AddCustomEmotion(strUrl)
end if
end sub

Sub OnContextMenu()
set srcEvent = external.menuArguments.event
set EventElement = external.menuArguments.document.elementFromPoint(srcEvent.clientX, srcEvent.clientY)

if "HTMLImg" = TypeName(EventElement) then
Call AddEmotion(EventElement.href)
end if
end sub


call OnContextMenu()

</script>
上面的关键是: if "HTMLImg" = TypeName(EventElement) then,判断当前右击的是否图像

2. 在注册表中增加一项:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\添加到QQ表情]
@="C:\\Program Files\\Tencent\\qq\\AddEmotion.htm" 改成你的脚本文件的完整名字
"contexts"=dword:00000002 这里表示什么情况下添加到菜单中,如下定义:
对象 值
缺省  0x1
图片  0x2
控件  0x4
表单域  0x8
选择文本 0x10
锚点  0x20


-----------------
行舟
欢迎使用CSDN论坛浏览器
http://blog.csdn.net/xingzhou/
aiirii 2005-11-13
  • 打赏
  • 举报
回复
或者在 AddPanel.htm 中,
奇怪, AddEmotion.htm 里面比较简单,没看出什么
aiirii 2005-11-13
  • 打赏
  • 举报
回复
我在我的机子上,没有出现你说的:把mouse停到图片上会出现一个小小的工具条

奇怪,但关键应该在 QQ 目录下的 AddEmotion.htm, 当然,还有相关的IE ext ActiveX 控件
aiirii 2005-11-13
  • 打赏
  • 举报
回复
http://hubdog.csdn.net/UpdateList/ulIndex.htm

应该都是类似的注册方法
angelface 2005-11-13
  • 打赏
  • 举报
回复
procedure DoDocumentComplete(IEHELP: TIEBrowserHelper; const pDisp: IDispatch;
var URL: OleVariant);
var
we: IWebBrowser2;
doc: OleVariant;
i: Integer;
obj: IHTMLObjectElement;
em2: IHTMLElement2;
begin
we := pDisp as IWebBrowser2;
if we = nil then
exit;
doc := we.Document as IHTMLDocument2;
//这里判断Flash对象的方法比较粗简,可以优化
for i := 0 to doc.all.length - 1 do
begin
if Supports(doc.all.item(i), IID_IHTMLObjectElement, obj) then
begin
if sametext(obj.classid, 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000')
then
begin
//关联Flash对象的鼠标移入,移出事件
em2 := obj as IHTMLElement2;
em2.attachEvent('onmouseout', IEHELP.MouseOutSink);
em2.attachEvent('onmouseover', IEHELP.MouseOverSink);
end;
end;
end;

end;

procedure DoOnQuit;
begin

end;

procedure DoOnVisible(Visible: WordBool);
begin
end;

procedure DoOnToolBar(ToolBar: WordBool);
begin

end;

procedure DoOnMenuBar(MenuBar: WordBool);
begin

end;

procedure DoOnStatusBar(StatusBar: WordBool);
begin

end;

procedure DoOnFullScreen(FullScreen: WordBool);
begin

end;

procedure DoOnTheaterMode(TheaterMode: WordBool);
begin

end;

procedure DoWindowSetResizable(Resizable: WordBool);
begin

end;

procedure DoWindowSetLeft(Left: Integer);
begin

end;

procedure DoWindowSetTop(Top: Integer);
begin

end;

procedure DoWindowSetWidth(Width: Integer);
begin

end;

procedure DoWindowSetHeight(Height: Integer);
begin

end;

procedure DoWindowClosing(IsChildWindow: WordBool; var Cancel: WordBool);
begin

end;

procedure DoClientToHostWindow(var CX: Integer; var CY: Integer);
begin

end;

procedure DoSetSecureLockIcon(SecureLockIcon: Integer);
begin

end;

procedure DoFileDownload(var Cancel: WordBool);
begin

end;

procedure BuildPositionalDispIds(pDispIds: PDispIdList; const dps: TDispParams);
var
i: integer;
begin
Assert(pDispIds <> nil);
for i := 0 to dps.cArgs - 1 do
pDispIds^[i] := dps.cArgs - 1 - i;
if (dps.cNamedArgs <= 0) then
Exit;
for i := 0 to dps.cNamedArgs - 1 do
pDispIds^[dps.rgdispidNamedArgs^[i]] := i;
end;

function TIEBrowserHelper.Invoke(DispID: Integer; const IID: TGUID; LocaleID:
Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
type
POleVariant = ^OleVariant;
var
dps: TDispParams absolute Params;
bHasParams: boolean;
pDispIds: PDispIdList;
iDispIdsSize: integer;
begin
pDispIds := nil;
iDispIdsSize := 0;
bHasParams := (dps.cArgs > 0);

if (bHasParams) then
begin
iDispIdsSize := dps.cArgs * SizeOf(TDispId);
GetMem(pDispIds, iDispIdsSize);
end;
try
if (bHasParams) then
BuildPositionalDispIds(pDispIds, dps);
Result := S_OK;
case DispId of
DISPID_STATUSTEXTCHANGE:
DoStatusTextChange(dps.rgvarg^[pDispIds^[0]].bstrval);
DISPID_PROGRESSCHANGE: DoProgressChange(dps.rgvarg^[pDispIds^[0]].lval,
dps.rgvarg^[pDispIds^[1]].lval);
DISPID_COMMANDSTATECHANGE:
DoCommandStateChange(dps.rgvarg^[pDispIds^[0]].lval,
dps.rgvarg^[pDispIds^[1]].vbool);
DISPID_DOWNLOADBEGIN: DoDownloadBegin();
DISPID_DOWNLOADCOMPLETE: DoDownloadComplete();
DISPID_TITLECHANGE: DoTitleChange(dps.rgvarg^[pDispIds^[0]].bstrval);
DISPID_PROPERTYCHANGE:
DoPropertyChange(dps.rgvarg^[pDispIds^[0]].bstrval);
DISPID_BEFORENAVIGATE2:
DoBeforeNavigate2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval),
POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[2]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[3]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[4]].pvarval)^,
POleVariant(dps.rgvarg^[pDispIds^[5]].pvarval)^,
dps.rgvarg^[pDispIds^[6]].pbool^);
DISPID_NEWWINDOW2:
DoNewWindow2(IDispatch(dps.rgvarg^[pDispIds^[0]].pdispval^),
dps.rgvarg^[pDispIds^[1]].pbool^);
DISPID_NAVIGATECOMPLETE2:
DoNavigateComplete2(IDispatch(dps.rgvarg^[pDispIds^[0]].dispval),
POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
DISPID_DOCUMENTCOMPLETE: DoDocumentComplete(self,
IDispatch(dps.rgvarg^[pDispIds^[0]].dispval),
POleVariant(dps.rgvarg^[pDispIds^[1]].pvarval)^);
DISPID_ONVISIBLE: DoOnVisible(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_ONTOOLBAR: DoOnToolBar(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_ONMENUBAR: DoOnMenuBar(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_ONSTATUSBAR: DoOnStatusBar(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_ONFULLSCREEN: DoOnFullScreen(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_ONTHEATERMODE: DoOnTheaterMode(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_WINDOWSETRESIZABLE:
DoWindowSetResizable(dps.rgvarg^[pDispIds^[0]].vbool);
DISPID_WINDOWCLOSING: DoWindowClosing(dps.rgvarg^[pDispIds^[0]].vbool,
dps.rgvarg^[pDispIds^[1]].pbool^);
DISPID_WINDOWSETLEFT: DoWindowSetLeft(dps.rgvarg^[pDispIds^[0]].lval);
DISPID_WINDOWSETTOP: DoWindowSetTop(dps.rgvarg^[pDispIds^[0]].lval);
DISPID_WINDOWSETWIDTH: DoWindowSetWidth(dps.rgvarg^[pDispIds^[0]].lval);
DISPID_WINDOWSETHEIGHT: DoWindowSetHeight(dps.rgvarg^[pDispIds^[0]].lval);
DISPID_CLIENTTOHOSTWINDOW:
DoClientToHostWindow(dps.rgvarg^[pDispIds^[0]].plval^,
dps.rgvarg^[pDispIds^[1]].plval^);
DISPID_SETSECURELOCKICON:
DoSetSecureLockIcon(dps.rgvarg^[pDispIds^[0]].lval);
DISPID_FILEDOWNLOAD: DoFileDownload(dps.rgvarg^[pDispIds^[0]].pbool^);
DISPID_ONQUIT:
begin
DoOnQuit();
CP.Unadvise(Cookie);
end;
else
Result := DISP_E_MEMBERNOTFOUND;
end;
finally
if (bHasParams) then
FreeMem(pDispIds, iDispIdsSize);
end;
end;
angelface 2005-11-13
  • 打赏
  • 举报
回复
hoho 我笨了, 下面是代码
{*************************************************
Copyright (C), 2004, 风车工作室.
作者: 追风逐月
版本: 1.0
日期: 2005年04月11日
描述: 实现browser Helper Object 接口单元
修改历史:
追风逐月 2005/04/11 1.0 创建该文件
...
*************************************************}

//***********************************************************
// Browser Helper Object Demo 1.01 *
// (Jan. 14, 2000) *
// *
// For Delphi 4/5 *
// by *
// Per Linds?Larsen *
// per.lindsoe@larsen.dk *
// *
// Documentation and updated versions: *
// *
// http://www.euromind.com/iedelphi *
//***********************************************************

//procedure BuildPositionalDispIds and function Invoke
//is created using EventSinkImp, written by Binh Ly (bly@castle.net)
//You can download EventSinkImp from: http://www.techvanguard.com/

unit _IEBrowserHelper;

interface

uses
dialogs, sysutils, shdocvw, registry, Windows, ActiveX, Classes, ComObj,
mshtml;

const

DISPID_BEFORENAVIGATE = 100;
// this is sent before navigation to give a chance to abort
DISPID_NAVIGATECOMPLETE = 101;
// in async, this is sent when we have enough to show
DISPID_STATUSTEXTCHANGE = 102;
DISPID_QUIT = 103;
DISPID_DOWNLOADCOMPLETE = 104;
DISPID_COMMANDSTATECHANGE = 105;
DISPID_DOWNLOADBEGIN = 106;
DISPID_NEWWINDOW = 107; // sent when a new window should be created
DISPID_PROGRESSCHANGE = 108; // sent when download progress is updated
DISPID_WINDOWMOVE = 109; // sent when main window has been moved
DISPID_WINDOWRESIZE = 110; // sent when main window has been sized
DISPID_WINDOWACTIVATE = 111; // sent when main window has been activated
DISPID_PROPERTYCHANGE = 112; // sent when the PutProperty method is called
DISPID_TITLECHANGE = 113; // sent when the document title changes
DISPID_TITLEICONCHANGE = 114;
// sent when the top level window icon may have changed.
DISPID_FRAMEBEFORENAVIGATE = 200;
DISPID_FRAMENAVIGATECOMPLETE = 201;
DISPID_FRAMENEWWINDOW = 204;
DISPID_BEFORENAVIGATE2 = 250; // hyperlink clicked on
DISPID_NEWWINDOW2 = 251;
DISPID_NAVIGATECOMPLETE2 = 252; // UIActivate new document
DISPID_ONQUIT = 253;
DISPID_ONVISIBLE = 254; // sent when the window goes visible/hidden
DISPID_ONTOOLBAR = 255; // sent when the toolbar should be shown/hidden
DISPID_ONMENUBAR = 256; // sent when the menubar should be shown/hidden
DISPID_ONSTATUSBAR = 257; // sent when the statusbar should be shown/hidden
DISPID_ONFULLSCREEN = 258; // sent when kiosk mode should be on/off
DISPID_DOCUMENTCOMPLETE = 259; // new document goes ReadyState_Complete
DISPID_ONTHEATERMODE = 260; // sent when theater mode should be on/off
DISPID_ONADDRESSBAR = 261; // sent when the address bar should be shown/hidden
DISPID_WINDOWSETRESIZABLE = 262;
// sent to set the style of the host window frame
DISPID_WINDOWCLOSING = 263;
// sent before script window.close closes the window
DISPID_WINDOWSETLEFT = 264;
// sent when the put_left method is called on the WebOC
DISPID_WINDOWSETTOP = 265;
// sent when the put_top method is called on the WebOC
DISPID_WINDOWSETWIDTH = 266;
// sent when the put_width method is called on the WebOC
DISPID_WINDOWSETHEIGHT = 267;
// sent when the put_height method is called on the WebOC
DISPID_CLIENTTOHOSTWINDOW = 268;
// sent during window.open to request conversion of dimensions
DISPID_SETSECURELOCKICON = 269;
// sent to suggest the appropriate security icon to show
DISPID_FILEDOWNLOAD = 270;
// Fired to indicate the File Download dialog is opening

type
//鼠标移出事件处理
TMouseOutSink = class(TInterfacedObject, iDispatch)
private
Fie: IWebbrowser2;
public
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
end;

//鼠标移入事件处理
TMouseOverSink = class(TInterfacedObject, iDispatch)
private
Fie: IWebbrowser2;
public
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
end;

TIEBrowserHelperFactory = class(TComObjectFactory)
private
procedure AddKeys;
procedure RemoveKeys;
public
procedure UpdateRegistry(Register: Boolean); override;
end;

TIEBrowserHelper = class(TComObject, IDispatch, IObjectWithSite)
public
MouseOutSink: TMouseOutSink;
MouseOverSink: TMouseOverSink;
protected
function SetSite(const pUnkSite: IUnknown): HResult; stdcall;
function GetSite(const riid: TIID; out site: IUnknown): HResult; stdcall;

function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
virtual; stdcall;
end;

const
Class_IEBrowserHelper: TGUID = '{492B8F66-B8CF-4F7A-B0EE-B7383B92F5BA}';

implementation

uses IEHelperForm, ComServ, Controls;

{ TIEBrowserHelper }

var
Cookie: Integer;
CP: IConnectionPoint;
HelperForm: THelperForm;

procedure DoStatusTextChange(const Text: WideString);
begin
//HelperForm.Memo1.Lines.Add('Statustext: ' + TEXT);
end;

procedure DoProgressChange(Progress: Integer; ProgressMax: Integer);
begin
//HelperForm.Memo1.Lines.Add('ProgressChange: ' + InttoStr(Progress) + '/' + InttoStr(ProgressMax));
end;

procedure DoCommandStateChange(Command: Integer; Enable: WordBool);
begin
//HelperForm.Memo1.Lines.Add('CommandStateChange: COMMAND:' + InttoStr(Command));
end;

procedure DoDownloadBegin;
begin
//HelperForm.Memo1.Lines.Add('Download Begin');
end;

procedure DoDownloadComplete;
begin
//HelperForm.Memo1.Lines.Add('Download Complete');
end;

procedure DoTitleChange(const Text: WideString);
begin
//HelperForm.Memo1.Lines.Add('TitleChange: ' + TEXT);
end;

procedure DoPropertyChange(const szProperty: WideString);
begin
//HelperForm.Memo1.Lines.Add('PropertyChange: ' + szProperty);
end;

procedure DoBeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant; var
Flags: OleVariant; var TargetFrameName: OleVariant; var PostData: OleVariant; var
Headers: OleVariant; var Cancel: WordBool);
begin
end;

procedure DoNewWindow2(var ppDisp: IDispatch; var Cancel: WordBool);
begin
end;

procedure DoNavigateComplete2(const pDisp: IDispatch; var URL: OleVariant);
begin

end
angelface 2005-11-13
  • 打赏
  • 举报
回复
怎么来注册我的ActiveX呢?
RegSrvc注册过后在我mouse停上去的时候是没有效果的,没有出现我的window

蒋晟 2005-11-13
  • 打赏
  • 举报
回复
IE6里面那个是Rebar,QQ的没去看过。你可以捕获onmouseover事件。
参考
http://msdn.microsoft.com/workshop/browser/mshtml/tutorials/sink.asp

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧