#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.