读书人

实现瑞星狮子或office助手功能解决方案

发布时间: 2012-02-06 15:52:44 作者: rapoo

实现瑞星狮子或office助手功能
我想实现我的主界面向瑞星的狮子或office小助手那样的效果,同时图标随鼠标拖动而动,主界面就是一个图标

[解决办法]
Windows有这个ActiveX好象。叫什么精灵我忘了。

下面这个Demo是我给你写的,用的是Image和透明窗体。供参考。

// 单元名称:模拟瑞星狮子
// 作 者:LihuaSoft 2007-2-9

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus;

type
TForm1 = class(TForm)
Image1: TImage; //图片Image
PopupMenu1: TPopupMenu; //Form上放一个弹出菜单
ShowMsg: TMenuItem; //在在PopupMenu1上创建菜单项ShowMsg
Exit: TMenuItem; //在PopupMenu1上创建菜单项Exit
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure ShowMsgClick(Sender: TObject); //菜单项ShowMsg的单击事件
procedure ExitClick(Sender: TObject); //菜单项Exit的单击事件
private
{ Private declarations }
procedure DoInvisible; //注意
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
FullRgn, ClientRgn, CtlRgn : THandle;
bMouseDown : boolean = false;
Opos, Cpos: Tpoint;
Pic : TBitmap;

procedure TForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin
Margin := ( Width - ClientWidth ) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
for A := 0 to ControlCount - 1 do begin
AControl := Controls[A];
if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
deleteobject(fullrgn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
self.BorderStyle := bsNone; //无边框窗体
Pic := TBitmap.Create; //注意,下面几句,创建了一块绿色内存位图,给Image
Pic.Width := Image1.Width; //你可以去掉这个Pic,用自己的图片给Image
Pic.Height := Image1.Height;
Pic.Canvas.Brush.Color := clGreen;
Pic.Canvas.FillRect(Rect(0,0,Pic.Width,Pic.Height));
Image1.Picture.Bitmap := Pic;
Image1.Top := self.Top;
Image1.Left := self.Left;
Image1.PopupMenu := PopupMenu1;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);//隐藏任务栏按钮
DoInvisible;//透明窗体
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bMouseDown := true;
Opos.X := X;
Opos.Y := Y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bMouseDown := false;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if bMouseDown then
begin


Cpos.X := X;
Cpos.y := Y;
Left := Left + Cpos.X - Opos.X;
Top := Top + Cpos.Y - Opos.Y;
end;
end;

procedure TForm1.ShowMsgClick(Sender: TObject);
begin
ShowMessage( '假设这是打开了一个功能窗口 ');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Pic.Free; //释放Pic这块位图
end;

procedure TForm1.ExitClick(Sender: TObject);
begin
Application.Terminate; //退出程序
end;

end.
[解决办法]
Windows中把这个叫做精灵动画,网上代码很多的。
1.导入类型库TAgent:
a. 执行菜单 delphi6--project--import type library
b. 选择Microsoft Agent Control 2.0(Version 2.0), (注:只有安装了office才有C:\winnt\msagent\agentctl.dll)
c. 按install...按钮,选择into new package页面,file name随便输一个,如C:\Program Files\Borland\Delphi6\Agent20\Agent20.dpk
d. 按ok,并同意创建目录和安装控件,最后save all


注:Delphi导入的AgentObjects_TLB.pas中没有IEnumVariant的定义,需要自己加(从ActiveX单元中拷贝过来),定义如下:
type IEnumVariant = interface(IUnknown)
[ '{00020404-0000-0000-C000-000000000046} ']
function Next(celt: LongWord; var rgvar : OleVariant; pceltFetched: Cardinal): HResult; stdcall;
function Skip(celt: LongWord): HResult; stdcall;
function Reset: HResult; stdcall;
function Clone(out Enum: IEnumVariant): HResult; stdcall;
end;

2. 使用:先扔一个Agent1到窗口上,然后:
(*
Procedure TForm1.PlayCharacters_Raving();
var
myCharacter: IagentCtlCharacter;
Request1 : IagentCtlRequest ;
begin
try
Agent1.Characters.Unload( 'Agent ');
except
end;
Request1 := Agent1.Characters.Load( 'Agent ',gv.m_strExePath + 'acs\ ' + 'RsAgent.acs ');//读入瑞星狮子
myCharacter := Agent1.Characters.Character( 'Agent ');
//myCharacter.Top := 500; //隐藏木马本身程序
myCharacter.Show(0);//调出瑞星狮子
myCharacter.SoundEffectsOn:=TRUE;//打开声音
myCharacter.MoveTo(self.Left+75,self.Top+420,1);


//myCharacter.MoveTo((mouse.CursorPos.x-myCharacter.Get_Width), (mouse.CursorPos.y-myCharacter.Get_Height),1);
//myCharacter.Commands.Add( '提取windows密码 ', '提取windows密码 ', '提取windows密码 ',True,True);//添加菜单
//myCharacter.Speak( '本狮子现已不再是瑞星助手了,已经改户口为:TML超级叮当,QQ48505,群号:1787781。 ', ' ');//控制狮子说话
myCharacter.Play( 'Blink ');
myCharacter.Play( 'Show1 ');
myCharacter.Play( 'Show2 ');
myCharacter.Play( 'Bye1 ');
myCharacter.Play( 'iAmScaning ');
myCharacter.Play( 'Stand ');
myCharacter.Play( 'StartScan ');
myCharacter.Play( 'StopScan ');
myCharacter.Play( 'Blink ');
myCharacter.Play( 'StartSleep ');
myCharacter.Play( 'StopSleep ');
myCharacter.Play( 'Snarl ');
myCharacter.Play( 'HandStand ');
myCharacter.Play( 'Gally ');
myCharacter.Play( 'KillVirus ');
myCharacter.Play( 'FindVirus ');
myCharacter.Play( 'StartFindVirus ');
myCharacter.Play( 'StopFindVirus ');
myCharacter.Play( 'DeleteFile ');
myCharacter.Play( 'IgnoreVirus ');
myCharacter.Play( 'Sleeping ');
myCharacter.Play( 'Bye2 ');
myCharacter.Play( 'EatWatermelon ');
myCharacter.Play( 'Prevent ');
myCharacter.Play( 'Sleeping ');
myCharacter.Play( 'You ');
myCharacter.Play( 'Look ');
myCharacter.Play( 'Grimace ');
myCharacter.Play( 'Sorry ');
myCharacter.Play( '2003_1_Drink ');


myCharacter.Play( '2003_2_PlayComputer ');
myCharacter.Play( '2003_3_ChopTree ');
//myCharacter.Play( '2004_4_PlayFootBall ');
myCharacter.Play( '2003_5_Jump ');
myCharacter.Play( '2003_6_Knife ');
myCharacter.Play( '2003_7_Bike ');
myCharacter.Play( '2003_8_FixComputer ');
myCharacter.Play( '2003_9_Rest ');
myCharacter.Play( '2003_10_Climb ');
myCharacter.Hide(0);
//Agent1.Characters.Unload( 'Agent ');
end;
*)

Procedure TForm1.PlayCharacters();
var
strAcsFileName : string;
myCharacter: IagentCtlCharacter;
Request1 : IagentCtlRequest ;

ACharIntf :IagentCtlCharacterEx;
Enum: IEnumVariant;
VAnimName: OleVariant;
Fetched: Cardinal;
begin
try
Agent1.Characters.Unload( 'Agent ');
except
end;
//从acs目录随机取出一个.acs文件
//strAcsFileName := gv.m_strExePath + 'acs\ ' + 'RsAgent.acs ';
strAcsFileName := self.GetAcsFileName();
Request1 := Agent1.Characters.Load( 'Agent ', strAcsFileName);//读入瑞星狮子
myCharacter := Agent1.Characters.Character( 'Agent ');
myCharacter.Show(0);
myCharacter.SoundEffectsOn:=TRUE;
myCharacter.MoveTo(self.Left+75,self.Top+420,1);
ACharIntf := myCharacter as IagentCtlCharacterEx;
Enum := ACharIntf.AnimationNames.Enum as IEnumVariant;
while Enum.Next(1, VAnimName, Fetched) = S_OK do
myCharacter.Play(VAnimName);
myCharacter.Hide(0);
end;

[解决办法]
Active X、Agent
实现起来不是很难,盒子有代码
[解决办法]
Windows Agent
在Delphi中添加Agent控件
在Delphi IDE中选择菜单Component,Import ActiveX Control ,在Import ActiveX下
的列表框中选择Microsoft Agent Control 2.0(Version 2.0),点击按钮Install,
在Install对话框中点击按钮OK 在Confirm对话框中点击按钮Yes 在对话框中点击按钮OK。
至此,Agent控件被添加到Delphi组件板ActiveX页上。

读书人网 >.NET

热点推荐