IE10环境下基于纯C开发PyHook鼠标监听调用IShellWindows出现延迟问题求助
适配UI元素拾取的Pyhook鼠标监听器开发问题
项目开发目标
- 基于Pyhook库,使用纯C与Python混合开发全局鼠标事件监听器,核心需求是获取用户点击对应的UI元素相关信息
- 目前已通过UI Automation接口实现常规桌面控件的信息读取,但该接口无法获取网页内部的元素信息,因此计划针对IE浏览器做特殊适配:先校验当前鼠标所在窗口是否为Internet Explorer,若能成功获取对应IE实例对象,即可在DOM层创建监听器实现网页内元素的拾取
核心异常表现
- 鼠标在IE窗口(尤其是网页内容区域)移动时存在明显延迟,卡顿感显著
- 初步排查怀疑卡顿来源为
pShellWindows接口创建环节,猜测是否因多次重复调用CoCreateInstance造成性能损耗 - 后续进一步定位发现问题和
pShellWindows对象的释放环节相关,怀疑低层级鼠标事件触发频率过高,系统来不及完成对应资源的释放,需要额外增加延迟做缓冲处理 - 额外怀疑
Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS宏的实现逻辑干扰了IShellWindows接口的正常调用,多次尝试调试都未达成目标
附简化后核心逻辑代码
LRESULT CALLBACK cLLMouseCallback(int code, WPARAM wParam, LPARAM lParam){ ... IUIAutomation *pAutomation = NULL; IUIAutomationElement *element = NULL; CoInitialize(NULL); ... HRESULT hr = CoCreateInstance(&CLSID_CUIAutomation,NULL,CLSCTX_INPROC_SERVER,&IID_IUIAutomation,(void**)&pAutomation); ... if(wcsstr(process_name,IEName)!=NULL){ IShellWindows *pShellWindows = NULL; ... HRESULT hr = CoCreateInstance(&CLSID_ShellWindows,NULL,CLSCTX_ALL,&IDD_IShellWindows, (void**)&pShellWindows); ... IUnknown_Release(pShellWindows); } ... CoUninitialize(); } int cSetHook(int idHook, PyObject *pyfunc){ HINSTANCE hMod; if(idHook > WH_MAX || idHook < WH_MIN){ pyErr_SetString(PyExc_ValueError, "Hooking error: invalid hook ID"; } Py_BEGIN_ALLOW_THREADS hMod = GetModuleHandle(NULL); if(NULL==hMod) hMod = GetModuleHandle("_cpyHook.pyd"); Py_END_ALLOW_THREADS switch(idHook){ case WH_MOUSE_LL: if(callback_funcs[idHook]!=NULL) break; callback_funcs[idHook] = pyfunc; Py_INCREF(callback_funcs[idHook]); Py_BEGIN_ALLOW_THREADS hHooks[idHook] = setWindowsEx(WH_MOUSE_LL,cLLMouseCallback,(HINSTANCE) hMod,0); Py_END_ALLOW_THREADS break; case WH_KEYBOARD_LL: ... } if(!hHooks[idHook]){ PyErr_SetString(PyExc_TypeError, "Could not set hook"); } return 1; }
内容的提问来源于stack exchange,提问作者sergioMoreno
相关产品推荐
相关产品推荐

