首页 > 解决方案 > 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,但我没有实现。

标签: pythonccom

解决方案


推荐阅读