Ошибка IShellWindows с IE10 и простым C

#python #c #com

#python #c #com

Вопрос:

Я разрабатываю прослушиватель событий мыши с простым C и python на основе библиотеки Pyhook. Я делаю некоторые корректировки в этой библиотеке, чтобы получить информацию об элементе пользовательского интерфейса, который был нажат пользователем.

Я использую автоматизацию пользовательского интерфейса для получения информации об элементах, которые были нажаты пользователем. Однако, когда я хочу получить элемент внутри веб-страницы, этот интерфейс не позволяет мне делать это, насколько я знаю. Вот почему я решил проверить, является ли текущее окно Internet Explorer, а затем, если я получу объект IE, я мог бы создать прослушиватель внутри DOM.

Проблема возникает, когда я хочу получить объект Internet Explorer. Проблема заключается в том, что когда я навожу курсор мыши на окно Internet Explorer, мышь задерживается и не перемещается быстрее внутри содержимого веб-страницы. У меня длинный код, но я решил немного обобщить то, что у меня есть. У меня сложилось впечатление, когда я создаю интерфейс pShellWindows. Возможно, я не мог использовать CoCreateInstance много раз. Кто-нибудь может помочь мне с моей целью. Если вам нужна более подробная информация, я рад поделиться больше. Tks заранее.

 LRESULT CALLBACK cLLMouseCallback(int code, WPARAM wParam, LPARAM lParam){

...

IUIAutomation *pAutomation = NULL;
IUIAutomationElement *element = NULL;

CoInitialize(NULL);
...
HRESULT hr = CoCreateInstance(amp;CLSID_CUIAutomation,NULL,CLSCTX_INPROC_SERVER,amp;IID_IUIAutomation,(void**)amp;pAutomation);
...

  if(wcsstr(process_name,IEName)!=NULL){

    IShellWindows *pShellWindows = NULL;
    ...
    HRESULT hr = CoCreateInstance(amp;CLSID_ShellWindows,NULL,CLSCTX_ALL,amp;IDD_IShellWindows, (void**)amp;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. Я не знаю, почему у меня возникла эта проблема. Может быть, события происходят так быстро, и система не может освободить объект, и для этого системе требуется некоторая задержка ?.
ПРАВКА2:
Я добавил больше информации о том, как вызывается cLLMouseCallback. Насколько я понял, Py_BEGIN_ALLOW_THREADS макрос открывает новый блок и объявляет скрытую локальную переменную; Py_END_ALLOW_THREADS макрос закрывает блок. Мне было интересно, влияют ли эти макросы на способ использования IShellWindows. Простите меня, если я пишу что-то глупое, но я много чего перепробовал, чтобы использовать IShellWindows, и я этого не достиг.

Комментарии:

1. IShellWindows не имеет ничего общего с IUIAutomation, вы можете вызывать CoCreateInstance столько раз, сколько захотите, я не понимаю вашего вопроса. Вы возвращаете ошибки?

2. @SimonMourier Спасибо, что уделили время чтению моего поста. Моя цель — получить информацию об элементе, на который нажимает пользователь, когда пользователь нажимает на кнопку на веб-сайте (например, кнопка поиска на Amazon). Когда я запускаю свой код для прослушивания событий и навожу курсор мыши на веб-сайт с помощью Internet Explorer, кажется, что мышь не может двигаться должным образом, и она останавливается на несколько секунд. Я подумал, что, возможно, когда я перемещаю мышь, я создаю этот интерфейс, и это задерживает скорость мыши.

3. В общем случае автоматизация пользовательского интерфейса не влияет на автоматическое приложение (на самом деле это может произойти в редких случаях, но я не думаю, что это имеет место здесь). Вы можете автоматизировать IE с помощью МАУ, но вам не нужны IShellWindows.

4. Tks Я думал, что не могу извлечь информацию об элементе, который принадлежит DOM с помощью UIAutomation. Используя IUIAutomationelement, он всегда возвращает мне все окно Internet Explorer вместо кнопки в DOM, например. Вы знаете, как я должен это сделать ?.

5. Использовать «Inspect.exe » инструмент из Windows SDK. Это определенно покажет вам, что вы можете получить от МАУ. Если что-то не отображается при проверке, это, вероятно, невозможно. Вполне возможно, что вы не можете получить элемент DOM из UIA. В этом случае перейдите к другим технологиям, таким как selenium.