c#怎么监听程序窗体外的鼠标点击事件啊?

问题描述

我在网上找到一个例子,自己试了一下,鼠标的移动监听可以实现,点击监听实现不了。具体代码如下:第一个类:publicclassWin32Api{[StructLayout(LayoutKind.Sequential)]publicclassPOINT{publicintx;publicinty;}[StructLayout(LayoutKind.Sequential)]publicclassMouseHookStruct{publicPOINTpt;publicinthwnd;publicintwHitTestCode;publicintdwExtraInfo;}publicdelegateintHookProc(intnCode,IntPtrwParam,IntPtrlParam);//安装钩子[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternintSetWindowsHookEx(intidHook,HookProclpfn,IntPtrhInstance,intthreadId);//卸载钩子[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternboolUnhookWindowsHookEx(intidHook);//调用下一个钩子[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternintCallNextHookEx(intidHook,intnCode,IntPtrwParam,IntPtrlParam);}

第二个类:publicclassMouseHook{privatePointpoint;privatePointPoint{get{returnpoint;}set{if(point!=value){point=value;if(MouseMoveEvent!=null){vare=newMouseEventArgs(MouseButtons.Left,0,point.X,point.Y,0);MouseMoveEvent(this,e);}}}}privateinthHook;publicconstintWH_MOUSE_LL=14;publicWin32Api.HookProchProc;publicMouseHook(){this.Point=newPoint();}publicintSetHook(){hProc=newWin32Api.HookProc(MouseHookProc);hHook=Win32Api.SetWindowsHookEx(WH_MOUSE_LL,hProc,IntPtr.Zero,0);returnhHook;}publicvoidUnHook(){Win32Api.UnhookWindowsHookEx(hHook);}privateintMouseHookProc(intnCode,IntPtrwParam,IntPtrlParam){Win32Api.MouseHookStructMyMouseHookStruct=(Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam,typeof(Win32Api.MouseHookStruct));if(nCode<0){returnWin32Api.CallNextHookEx(hHook,nCode,wParam,lParam);}else{this.Point=newPoint(MyMouseHookStruct.pt.x,MyMouseHookStruct.pt.y);returnWin32Api.CallNextHookEx(hHook,nCode,wParam,lParam);}}//委托+事件(把钩到的消息封装为事件,由调用者处理)publicdelegatevoidMouseMoveHandler(objectsender,MouseEventArgse);publiceventMouseMoveHandlerMouseMoveEvent;publicdelegatevoidMouseClickHandler(objectsender,MouseEventArgse);publiceventMouseClickHandlerMouseClickEvent;}

操作:publicpartialclassgetLocationForm:Form{publicgetLocationForm(int[]location){InitializeComponent();}MouseHookmh;privatevoidgetLocationForm_Load(objectsender,EventArgse){mh=newMouseHook();mh.SetHook();mh.MouseMoveEvent+=mh_MouseMoveEvent;mh.MouseClickEvent+=mh_MouseClickEvent;}privatevoidmh_MouseClickEvent(objectsender,MouseEventArgse){MessageBox.Show(e.X+"-"+e.Y);}privatevoidmh_MouseMoveEvent(objectsender,MouseEventArgse){intx=e.Location.X;inty=e.Location.Y;textBox1.Text=x+"";textBox2.Text=y+"";}privatevoidForm1_FormClosed(objectsender,FormClosedEventArgse){mh.UnHook();}}

也就是说移动鼠标时能执行privatevoidmh_MouseMoveEvent(objectsender,MouseEventArgse)这个函数里的内容,但鼠标点击时不能执行privatevoidmh_MouseClickEvent(objectsender,MouseEventArgse)这个函数的内容。问题就是怎么改才能实现鼠标点击监听呢?

解决方案

解决方案二:
你在privatePointPoint中只执行了move委托,你在哪执行了click委托啊
解决方案三:
你MouseHook类里对MouseMoveEvent事件处理了,没对MouseClickEvent事件处理
解决方案四:
你应该在hook的回调中判断是否有鼠标按下,然后执行click委托
解决方案五:
提示一下:MouseHookProc(intnCode,IntPtrwParam,IntPtrlParam)中的wParam就是鼠标动作,可以是WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_MOUSEWHEEL等等。如果你志在搬代码而不求甚解,...
解决方案六:
楼上各位,在哪儿加语句啊,怎么加,求赐教啊,楼主是菜鸟
解决方案七:
我发现越是菜鸟,越喜欢研究些高大上的东西,比如IE直接操作客户机,修改其他程序的内存变量,进程通信,截获系统鼠标事件什么的就不敢先从基础开始研究嘛
解决方案八:
hHook=Win32Api.SetWindowsHookEx(WH_MOUSE_LL,hProc,IntPtr.Zero,0);你只写了hook鼠标移动
解决方案九:
错了,是这里Win32Api.MouseHookStructMyMouseHookStruct=(Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam,typeof(Win32Api.MouseHookStruct));看了一晚上的帖子了···
解决方案十:
你的代码里面,我上面赋值的那句话你就处理了this.Point=newPoint(MyMouseHookStruct.pt.x,MyMouseHookStruct.pt.y);之触发了move的event
解决方案十一:
改了改MouseEventArgs(MouseButtons.None,再加个MouseClickEvent(this,e);就行publicclassMouseHook{privatePointpoint;privatePointPoint{get{returnpoint;}set{if(point!=value){point=value;if(MouseMoveEvent!=null){vare=newMouseEventArgs(MouseButtons.None,0,point.X,point.Y,0);MouseMoveEvent(this,e);}}}}privateinthHook;privateconstintWM_LBUTTONDOWN=0x201;publicconstintWH_MOUSE_LL=14;publicWin32Api.HookProchProc;publicMouseHook(){this.Point=newPoint();}publicintSetHook(){hProc=newWin32Api.HookProc(MouseHookProc);hHook=Win32Api.SetWindowsHookEx(WH_MOUSE_LL,hProc,IntPtr.Zero,0);returnhHook;}publicvoidUnHook(){Win32Api.UnhookWindowsHookEx(hHook);}privateintMouseHookProc(intnCode,IntPtrwParam,IntPtrlParam){Win32Api.MouseHookStructMyMouseHookStruct=(Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam,typeof(Win32Api.MouseHookStruct));if(nCode<0){returnWin32Api.CallNextHookEx(hHook,nCode,wParam,lParam);}else{if(MouseClickEvent!=null){MouseButtonsbutton=MouseButtons.None;intclickCount=0;switch((Int32)wParam){caseWM_LBUTTONDOWN:button=MouseButtons.Left;clickCount=1;break;}vare=newMouseEventArgs(button,clickCount,point.X,point.Y,0);MouseClickEvent(this,e);}this.Point=newPoint(MyMouseHookStruct.pt.x,MyMouseHookStruct.pt.y);returnWin32Api.CallNextHookEx(hHook,nCode,wParam,lParam);}}publicdelegatevoidMouseMoveHandler(objectsender,MouseEventArgse);publiceventMouseMoveHandlerMouseMoveEvent;publicdelegatevoidMouseClickHandler(objectsender,MouseEventArgse);publiceventMouseClickHandlerMouseClickEvent;}

解决方案十二:
再指定MouseButtons.Leftprivatevoidmh_MouseClickEvent(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left){MessageBox.Show(e.X+"-"+e.Y);}}

解决方案十三:
MouseClickEvent的方法没写对吧
解决方案十四:
!!!!!!!

时间: 2024-11-01 15:35:03

c#怎么监听程序窗体外的鼠标点击事件啊?的相关文章

界面点击按键-sd卡监听,listview数据动态显示,点击事件

问题描述 sd卡监听,listview数据动态显示,点击事件 大家好!!请教下界面点击按键显示AlertDialog,AlertDialog里面的listview显示sd卡的文件, 请教下怎么编写?? 解决方案 ListView点击事件监听失效ListView长按事件和点击事件监听 解决方案二: 什么应用?单机程序?运行环境是什么?

javaweb-怎么用javascript监听父页面里的iframe点击事件

问题描述 怎么用javascript监听父页面里的iframe点击事件 怎么用javascript监听父页面里的iframe点击事件 解决方案 window.document.parent.iframeName/*你的frame的名称*/.click(); //可以自己在clcick里面写方法 解决方案二: 要给iframe添加click事件,而且iframe不能跨域..给父页添加的onclick事件点击iframe是不会响应的 window.onload = function () { var

C#父窗体监听子窗体关闭事件

问题描述 父窗体打开一个子窗体同时改变父窗体大小已经会写了,结果关闭一个子窗体后如何后面还有子窗体就不会改变父窗体大小,用foreach语句让父窗体读取当前激活的子窗体又不行,怎么改 解决方案 解决方案二:打开的时候用变量存储,解决方案三:这问题问得完全看不懂解决方案四:我有使用bool型变量判断开没开,但是我是需要在子窗体关闭事件后触发父窗体重新用foreach语句找到当前被激活(就是已经被打开的最顶层子窗体)的其余子窗体的事件,然后根据是哪个子窗体被激活调整父窗体大小,结果foreach语句

计算机改名引发的ORA-12541: TNS无监听程序错误

 近期上班时,由于开机时老是提示" 局域网出现计算机重名冲突",于是把计算机名字给改了,从PC2010081312zeo改为了CXBIKKKKKKK,结果第二天来的时候,用 PL/SQL连接我本地机子的ORACLE实例时,弹出ORA-12541:TNS无监听程序错误的提示,当时也没想到是计算机改名引起的问题,以为是相 关服务没有启动缘故,于是我打开服务面板,如图所示,发现 OracleOraDb10g_home1TNSListener服务没有启动,于是启动这个服务,结果等我启动后,出现

oracle-ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程

问题描述 ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程 ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程 解决方案 这是要修改客户端配置tnnames.ora文件,你试一下如下的修改 demo = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 主机名)(PORT = 端口号)) ) (CONNECT_DATA = (SERVER = SHARED) (SID=de

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务解决

环境:Oracle 11g R2 + PL SQL Developer + SQL Plus 问题:Oracle主服务和监听器服务已经启 动,使用SQL Plus能够正常连接,使用PL SQL Developer连接报次错误:ORA-12514: TNS: 监听程序当前无法 识别连接描述符中请求的服务.如图: 解决: 打开H:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN(不同机器目录可能不同 )目录下的listener.ora文件,发现此文件内容如下

ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程

    今天使用PL/SQL Developer连接到一台新的测试服务器时,遇到ORA错误:ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程.对应的监听日志文件里面错误为TNS-12523: TNS:listener could not find instance appropriate for the client connection   首先使用oerr命令查看ORA-12523错误提示的详细内容 [oracle@DB-Server admin]$ oerr ora

Oracle无法启动1——ORA-12541:TNS:无监听程序

登录oracle,使用sqlplus可以而使用pl/sql developer不行,报ORA-12541:TNS:无监听程序的错,解决办法如下 1.去Net Managet查看监听器,配置的监听字符串是否正确 2.右击我的电脑-->管理-->服务,查看tnslistener是否启动,如果启动尝试重启 说到底还是监听器的问题.有一篇文章谈如何配置监听器http://blog.csdn.net/tianlesoftware/article/details/4861572

ORACLE监听程序打开后自动关闭,一个很常见却很棘手的问题

问题描述 ORACLE监听程序打开后自动关闭,一个很常见却很棘手的问题 这个是打开监听时候报的错误. 命令行启动报错 现在主机名 listener.ora tnsnames.ora 问题出在哪里了? 我自己也在找办法解决,c币有限,只是希望遇到过类似问题的朋友分享下自己的经验.问题解决之后希望可以给大家带来便利