python - IE10 和纯 C 的 IShellWindows 错误
问题描述
我正在开发一个基于名为 Pyhook 的库的纯 C 和 python 鼠标事件侦听器。我正在对该库进行一些调整,以检索有关用户单击的 UI 元素的信息。
我正在使用界面 UI 自动化来检索有关用户单击的元素的信息。但是,当我想在 Webside 中检索元素时,据我所知,此界面不允许我这样做。这就是为什么我决定验证当前窗口是否是 Internet Explorer,然后如果我检索 IE 的对象,我可以在 DOM 中创建一个侦听器。
当我想检索 Internet Explorer 对象时,问题就出现了。问题是当我将鼠标移动到 Internet Explorer 窗口上时,鼠标会延迟,并且它不会在网页内容内移动得更快。我的代码很长,但我决定总结一下我所拥有的。我的印象是当我创建接口 pShellWindows 时。也许我不能多次使用 CoCreateInstance。有人可以帮助我实现我的目标。如果您需要更详细的信息,我很乐意分享更多信息。提前谢谢。
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;
}
编辑:
检查代码后,我意识到问题出在我想释放对象 pShellWindows 时。我不知道为什么我会遇到这个问题。也许事件发生得太快,系统无法释放对象,系统需要一些延迟才能做到?
EDIT2:
我添加了有关如何调用 cLLMouseCallback 的更多信息。据我了解,Py_BEGIN_ALLOW_THREADS
宏打开一个新块并声明一个隐藏的局部变量;Py_END_ALLOW_THREADS
宏关闭块。我想知道这些宏是否会影响使用 IShellWindows 的方式。如果我在写一些愚蠢的东西,请原谅我,但我尝试了很多事情来使用 IShellWindows,但我没有实现。
解决方案
推荐阅读
- powerbi - 如何使用相同的过滤器分别过滤两个重复的列?
- python - Django Form 无法正确保存
- reactjs - React-如何将反应图标添加到根据 Formik / Yup 验证更改的输入字段?
- android - Gradle 构建卡住了
- python-3.x - 根据元素以不同顺序对列表进行排序
- python - 在 Python 中将多个文件夹(在目录中)压缩到单个文件(在新目录中)
- java - Spring boot application.properties 如何读取日文或片假名字符
- image - 如何在 Sphinx 的图像指令中替换:target:?
- kiwi-tcms - 将测试用例数据从 Kiwi 数据库导出到我们的系统
- php - 在另一个中使用一个 php 文件的 URL 参数