import win.ui; /*DSG{{*/ var winform = win.form(text="鼠标钩子演示 - 请按下鼠标键测试";right=438;bottom=396;max=false;topmost=1) winform.add( edit={cls="edit";left=13;top=12;right=426;bottom=382;edge=1;multiline=1;z=1} ) /*}}*/ import mouse.hook; var mouseHook = mouse.hook(); //鼠标钩子回调函数 mouseHook.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){ if( injected ) return; //不处理模拟鼠标事件 select(msg) { case 0x201/*_WM_LBUTTONDOWN*/{ winform.edit.print("左键按下",x,y) } case 0x202/*_WM_LBUTTONUP*/{ winform.edit.print("左键弹起",x,y) } case 0x204/*_WM_RBUTTONDOWN*/{ winform.edit.print("右键按下",x,y) } case 0x205/*_WM_RBUTTONUP*/{ winform.edit.print("右键弹起",x,y) } case 0x207/*_WM_MBUTTONDOWN*/{ winform.edit.print("中键按下",x,y) } case 0x208/*_WM_MBUTTONUP*/{ winform.edit.print("中键弹起",x,y) } case 0x20B/*_WM_XBUTTONDOWN*/{ winform.edit.print("侧键按下",x,y,::HIWORD(mouseData) == 1 ? "XBUTTON1" : "XBUTTON2") } case 0x20C/*_WM_XBUTTONUP*/{ winform.edit.print("侧键弹起",x,y,::HIWORD(mouseData) == 1 ? "XBUTTON1" : "XBUTTON2") } case 0x20A/*_WM_MOUSEWHEEL*/{ var distance = mouseData>>16 / 120/*_WHEEL_DELTA*/ winform.edit.print("鼠标滚轮",x,y,distance>0?"向上滚动":"向下滚动") } } } winform.wndproc = function(hwnd,message,wparam,lparam){ if( message = 0xA1/*_WM_NCLBUTTONDOWN*/ ){ if( wparam == 20/*_HTCLOSE*/ ){ //鼠标按下关闭按钮、释放鼠标以前及时关闭钩子,避免 XP 系统关闭窗体时出现的卡顿 mouseHook.close() } } } /**details(限制) 低级鼠标钩子回调函数不要做耗时操作, 如果耗时超过一秒或超过注册表限制的更小时间,系统会直接删除钩子。 没有任何方法可以检查到删除操作,应当遵守规则避免滥用。 耗时操作建议在钩子回调中创建线程,或使用 winform.setTimeout 延时异步执行。 在超级热键回调函数中,如果返回一个函数也可以不阻塞异步执行。 如果仍然出现过一段时间键盘钩子失效。 建议检查一下是否安装了什么特别的软件导致了这样的问题。 end details**/ winform.show(true) win.loopMessage();