+ -
当前位置:首页 → 问答吧 → sos 怎么拦截一个播放器控件鼠标事件!

sos 怎么拦截一个播放器控件鼠标事件!

时间:2011-10-08

来源:互联网

各位前辈好:
  我找到一个播放器,他提供了一些接口。但是问题来了.
1)怎么拦截他的鼠标右键(让他弹出的不是自己的右键菜单而是我自己设置的菜单).
2)鼠标移动到上面的时候左上角会滑出一个小菜单(比如上面有1倍大小,2倍大小,全屏,色彩调整,置顶播放,等等。。)
我想让他不显示,还是显示我想设置的菜单.

///////虽然我是一个新手,但是我这几天还是学了很多,查了很多资料。想了很多办法。(不算伸手族,现在实在是没办法了)
开始我是通过老妖大虾的Spy4Win找到左上角这个滑出菜单控件的类名,再关闭他,但是有的时候能关闭,有的时候不能,(很郁闷)方法是在万一老师blog上看到的
Delphi(Pascal) code

procedure GetChildWindows(h: HWND);
var
  buf: array[0..255] of Char;  
begin
  h := GetWindow(h, GW_CHILD); 
  while h <> 0 do
  begin
    {下面两行是要执行的操作, 窗口类名为ATL:1006B2A0 而且换了播放器版本会改变}
    GetClassName(h, buf, Length(buf));
    if buf = 'ATL:1006B2A0' then ShowMessageFmt('%s:%d', [buf, h]);//我把这句改成 sendmessage(h,wm_close,0,0);
                                                              有的时候能关闭,有的时候不能, 
    h := GetWindow(h, GW_HWNDNEXT); 
    GetChildWindows(h);      
  end;
end;



////然后我找了一个和我类似的问题,屏蔽flash的右键菜单
但是我尝试了很久都没用。有一个能用,但是虽然能在替换弹出菜单,但是不管在哪里单击右键都会弹出菜单.

Delphi(Pascal) code

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
mPoint : TPoint;
begin
//if IsChild(Flash1.Handle, Msg.Hwnd) then
if   ((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP)) then
begin
    GetCursorPos(mPoint);
    //如果去掉下面这行就是屏蔽右键菜单,不去掉为自定义右键菜单
    PopupMenu1.Popup(mPoint.X, mPoint.Y);
    Handled:=True;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Application.OnMessage := ApplicationEvents1Message; //屏蔽Flash右键菜单,或弹出自定义右键菜单
end;



最后我自己想了个办法,(个人感觉不错,)就是找了一个透明的panel覆盖在这个播放器控件上面.这样我测试了一下,感觉很好。但是问题又来了,当播放控件全屏的时候,,又没用了,(好像现在这个控件处于激活而且窗口在最前面了,panel盖不住了,) 我试过让这个控件的align := alClient 然后让form1全屏显示,.但是这样这个播放控件就会停止播放。必须重新点击播放并且重头播放。

头皮都扣掉一层了,这么几天就是没有好办法,看到网上有说通过windows消息拦截,但是我弄了好久都没行。所以到这里来请教各位,希望能有大侠帮帮小弟,谢谢了。。

作者: hero_1989   发布时间: 2011-10-08

帮你顶顶帖子吧

作者: sgzhou12345   发布时间: 2011-10-08

用HOOK拦截修改消息鼠标,中间键与右键对换。
在N多程序上测试通过,但是在UGS上有些对换了,有些又不变,
如按下中间键和按下右键换了,点击中间键和点击右键就不变,

源码如下:

library MouseHookDLL;

uses WinTypes, WinProcs, Messages;

var
  IsHooked: Boolean;
  MHooked, MHooked2: Boolean;
  HookHandle: HHook;

function MouseHookProc(Code: integer; Msg: WPARAM; MouseHook: LPARAM): LRESULT; stdcall;
 var MouseStruct: TMOUSEHOOKSTRUCT;
begin
  if MHooked then
  begin
  MHooked:= FALSE;
  Result := CallNextHookEx(HookHandle, Code, Msg, MouseHook);
  end
  else
  begin
  MouseStruct := pMOUSEHOOKSTRUCT(MouseHook)^;
  case Msg of
  WM_RBUTTONDOWN: //右键
  begin
  mouse_event(MOUSEEVENTF_MIDDLEDOWN,MouseStruct.pt.X,MouseStruct.pt.Y,0,0);
  Result:=1;
  MHooked:= True;
  end;
  WM_RBUTTONUP: //右键
  begin
  mouse_event(MOUSEEVENTF_MIDDLEUP,MouseStruct.pt.X,MouseStruct.pt.Y,0,0);
  Result:=1;
  MHooked:= True;
  end; {
  WM_RBUTTONDBLCLK: //右键
  begin

  end; }
  WM_MBUTTONDOWN: //中键
  begin
  mouse_event(MOUSEEVENTF_RIGHTDOWN,MouseStruct.pt.X,MouseStruct.pt.Y,0,0);
  Result:=1;
  MHooked:= True;
  end;
  WM_MBUTTONUP: //中键
  begin
  mouse_event(MOUSEEVENTF_RIGHTUP,MouseStruct.pt.X,MouseStruct.pt.Y,0,0);
  Result:=1;
  MHooked:= True;
  end; {
  WM_MBUTTONDBLCLK: //中键
  begin

  end; }
  else
  Result := CallNextHookEx(HookHandle, Code, Msg, MouseHook);
  end;
  end;
end;

function SetHook: boolean; stdcall;
begin
  Result := FALSE;
  if IsHooked then Exit;
  HookHandle := SetWindowsHookEx(WH_MOUSE, MouseHookProc, HInstance, 0);
  Result:= HookHandle <> 0;
end;

function RemoveHook: boolean; stdcall;
begin
  Result := FALSE;
  if (not IsHooked) and (HookHandle <> 0) then
  Result := UnhookWindowsHookEx(HookHandle);
  IsHooked:= FALSE;
end;

exports
  SetHook,
  RemoveHook,
  MouseHookProc;

{ Initialize DLL data. }
begin
  IsHooked:= FALSE;
  MHooked:= FALSE;
  MHooked2:= FALSE;

end.

作者: jingtuzhong   发布时间: 2011-10-08