在窗体中用alclient放了一个windowsmediaplayer9.0控件,
屏掉它本身的菜单后,
设成成自己的POPUP菜单,
可是当播放文件时,在播放文件的屏幕上点右键,没有菜单出来,右键点击在下面控制条上可以出来,
请问这是怎么回事?一开始解决不了,自己设置了onmousedown以后,在播放窗口上点可以出来,但是用button = mbright 判断右键点击又不行,说BUTTON没声明,同样的代码在别的控件上试很好,请问怎么解决这个问题?

解决方案 »

  1.   

    我没有编写过类似代码,我估计是播放文件的屏幕和控制条不是一体的,句柄不同的,
    你可以参考一下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看看播放文件的屏幕和控制条的句柄
      

  2.   

    to: rouqing(*冰雨&双子座奇缘*)
    谢谢你这么晚了还回答我的问题,你给的代码中,有一些是设的全局变量,我的基础又差,ASP转过来的,有些实在是看不懂,不过我查好很久,好象没人提过些问题,会不会是哪里属性设置问题?realone和flash的右键应该比windowsmediaplayer的难办些,搜了好久,没人提过这问题,会不会是一个很简单的设置?
      

  3.   

    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...
    困的手发抖,写的很混乱,抱歉!
      

  4.   

    谢谢你,我晕了,windowsmeidaplayer6.0和7.0的都不一样,而且还有8.0,9.0,10.0版本,这个还真是难办啊,而且我刚好正是要用这个ActiveX,叫我怎么办啊,spy是什么我都不知道啊!
      

  5.   

    procedure TF_main.wmpMouseDown(ASender: TObject; nButton,
      nShiftState: Smallint; fX, fY: Integer);
    var
      point: TPoint;
    begin
      if nButton = 2 then
      begin
        GetCursorPos(point);
        PopupMenu4.Popup(point.X, point.Y);
      end;
    end;
    这样做可以吗?我就是这样做的,没问题.