在窗体中用alclient放了一个windowsmediaplayer9.0控件,
屏掉它本身的菜单后,
设成成自己的POPUP菜单,
可是当播放文件时,在播放文件的屏幕上点右键,没有菜单出来,右键点击在下面控制条上可以出来,
请问这是怎么回事?一开始解决不了,自己设置了onmousedown以后,在播放窗口上点可以出来,但是用button = mbright 判断右键点击又不行,说BUTTON没声明,同样的代码在别的控件上试很好,请问怎么解决这个问题?
屏掉它本身的菜单后,
设成成自己的POPUP菜单,
可是当播放文件时,在播放文件的屏幕上点右键,没有菜单出来,右键点击在下面控制条上可以出来,
请问这是怎么回事?一开始解决不了,自己设置了onmousedown以后,在播放窗口上点可以出来,但是用button = mbright 判断右键点击又不行,说BUTTON没声明,同样的代码在别的控件上试很好,请问怎么解决这个问题?
你可以参考一下flash中自定义popmenu的方法: private
{ Private declarations }
procedure AppMessage(var Msg:TMsg;var Handled:boolean);
var
Form1: TForm1;
sf:Tshockwaveflash;procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=AppMessage;
end;procedure TForm1.AppMessage(var Msg: TMsg; var Handled: boolean);
begin
if (Msg.message=WM_RBUTTONDOWN) and (sf=nil) then
begin
Handled:=false;
Caption:='No Flash';
end
else begin
if (Msg.message=WM_RBUTTONDOWN) and (Msg.hwnd=sf.Handle) then
begin
Handled:=true;
pn.Popup(mouse.CursorPos.X,mouse.CursorPos.y);
end;
end;
end;修改一下:var
mp:windowsmediaplayer9.0;
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: boolean);
begin
if (Msg.message=WM_RBUTTONDOWN) and (mp=nil) then
begin
Handled:=false;
Caption:='No Flash';
end
else begin
if (Msg.message=WM_RBUTTONDOWN) and (Msg.hwnd=mp.Handle) and (控制条.handle)then
begin
Handled:=true;
pn.Popup(mouse.CursorPos.X,mouse.CursorPos.y);
end;
end;
end;你最好用spy看看播放文件的屏幕和控制条的句柄
谢谢你这么晚了还回答我的问题,你给的代码中,有一些是设的全局变量,我的基础又差,ASP转过来的,有些实在是看不懂,不过我查好很久,好象没人提过些问题,会不会是哪里属性设置问题?realone和flash的右键应该比windowsmediaplayer的难办些,搜了好久,没人提过这问题,会不会是一个很简单的设置?
看来你用了ActiveX控件?为什么不用delphi7自带的MediaPlayer组件呢?很多人都用这个直接开发,网上的源代码也很多的,可以参考一下,www.2ccc.com就有不错的例子.
//以flash为目标的代码如下,我的意思是你得修改成适应mediaplayer的代码.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, StdCtrls, Buttons, ExtCtrls,
Menus;type
TForm1 = class(TForm)
Panel1: TPanel;
pn: TPopupMenu;
dddd1: TMenuItem;
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure dddd1Click(Sender: TObject);
private
{ Private declarations }
procedure AppMessage(var Msg:TMsg;var Handled:boolean);
public
{ Public declarations }
end;var
Form1: TForm1;
sf:Tshockwaveflash;//flash控件变量
implementation{$R *.dfm}//在你的程序中Application的消息处理中onmessage中拦截FLASH控件句柄的右键消息,直接返回就可以,//表示不要送入控件处理!procedure TForm1.FormCreate(Sender: TObject);
begin
//如果不这么处理,右键菜单总是flash自己的菜单,delphi5开发人员指南里边有这个消息的例子和说明
Application.OnMessage:=AppMessage;
end;
//sf.handle,意思就是说这个时候是flash控件在响应这个消息
//如果你是用mediaplayer就得传入mediaplayer.handle,么控制条也响应消息,我想可能得加
//控制条得句柄,控制条.handle,你得用spy看看控制条的name和handle
//if (Msg.message=WM_RBUTTONDOWN) and (Msg.hwnd=mediaplayer.Handle) 或者 (Msg.hwnd=控制条//.handle) then msg.message是指处理什么消息,,msg.hwnd响应谁的消息句柄
// 这里我没有分析过了,实在抱歉啊,用spy看看吧,实在不行,看看别的朋友是否有好方法,我帮你up...procedure TForm1.AppMessage(var Msg: TMsg; var Handled: boolean);
begin
if (Msg.message=WM_RBUTTONDOWN) and (sf=nil) then
begin
Handled:=false;
Caption:='No Flash';
end
else begin
if (Msg.message=WM_RBUTTONDOWN) and (Msg.hwnd=sf.Handle) then
begin
Handled:=true;
pn.Popup(mouse.CursorPos.X,mouse.CursorPos.y);
end;
end;
end;procedure TForm1.dddd1Click(Sender: TObject);
begin
Caption:='Borland Delphi 7';
end;end.我的电脑win98se装了Windows Media Player7.01.00.3055,我没有往delphi7里边导入,我用vc++6自带的工具spy看了,播放区的class是Internet Explorer_Server,handle是00000C4C,控制条区是class是CWmpControlCntr,handle是00000BE4,很显然是不一样的啊,我最早的Windows Media Player版本是6.4.07.1121,用spy一看是整体的,class是Media Player 2,我用的还是flash6,打开一个动画,来看看:
class是ShockwaveFlash,handle是00000F70,caption是"Macromedia Flash Player 6",导入到delphi7里边开发,class是MacromediaFlashPlayerActiveX,这个还是自己分析吧,一般的delphi给出什么,就用什么吧,所以说这个代码可能得这么写,才能响应共同得popmenuif (Msg.message=WM_RBUTTONDOWN) then
begin
if (Msg.hwnd=mediaplayer.Handle) or (Msg.hwnd=控制条.handle) then
...具体得类名我就不好说了,看看别的朋友的方法吧,友情up...
困的手发抖,写的很混乱,抱歉!
nShiftState: Smallint; fX, fY: Integer);
var
point: TPoint;
begin
if nButton = 2 then
begin
GetCursorPos(point);
PopupMenu4.Popup(point.X, point.Y);
end;
end;
这样做可以吗?我就是这样做的,没问题.