sos 怎么拦截一个播放器控件鼠标事件!
时间:2011-10-08
来源:互联网
各位前辈好:
我找到一个播放器,他提供了一些接口。但是问题来了.
1)怎么拦截他的鼠标右键(让他弹出的不是自己的右键菜单而是我自己设置的菜单).
2)鼠标移动到上面的时候左上角会滑出一个小菜单(比如上面有1倍大小,2倍大小,全屏,色彩调整,置顶播放,等等。。)
我想让他不显示,还是显示我想设置的菜单.
///////虽然我是一个新手,但是我这几天还是学了很多,查了很多资料。想了很多办法。(不算伸手族,现在实在是没办法了)
开始我是通过老妖大虾的Spy4Win找到左上角这个滑出菜单控件的类名,再关闭他,但是有的时候能关闭,有的时候不能,(很郁闷)方法是在万一老师blog上看到的
Delphi(Pascal) code
////然后我找了一个和我类似的问题,屏蔽flash的右键菜单
但是我尝试了很久都没用。有一个能用,但是虽然能在替换弹出菜单,但是不管在哪里单击右键都会弹出菜单.
Delphi(Pascal) code
最后我自己想了个办法,(个人感觉不错,)就是找了一个透明的panel覆盖在这个播放器控件上面.这样我测试了一下,感觉很好。但是问题又来了,当播放控件全屏的时候,,又没用了,(好像现在这个控件处于激活而且窗口在最前面了,panel盖不住了,) 我试过让这个控件的align := alClient 然后让form1全屏显示,.但是这样这个播放控件就会停止播放。必须重新点击播放并且重头播放。
头皮都扣掉一层了,这么几天就是没有好办法,看到网上有说通过windows消息拦截,但是我弄了好久都没行。所以到这里来请教各位,希望能有大侠帮帮小弟,谢谢了。。
我找到一个播放器,他提供了一些接口。但是问题来了.
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.
在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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28