Python get windows handle

How can I get the main window’s handle in Python?

In python, I enumerate top-level windows through EnumWindows , and also I enumerate the processes through EnumProcesses .

Then in the python script, I put all the window handles which belongs to the same pid into one list (I did this through GetWindowThreadProcessId ).

Later I found out something: there are 3 window handles which belong to notepad.exe , but I only open one text file.

Besides, I tried to set the text window as the foreground window through SetForegroundWindow , I passed the three window handles to this function, and two work.

How could this be ?

2 Answers 2

Processes sometimes create invisible windows for their own purposes. You should ignore them (use IsWindowVisible function).

To investigate this kind of things your best friend is Spy++, that comes with several versions of Visual Studio, if you can get it.

According to it, notepad.exe creates three top-level windows:

  1. The visible main window, class name «Notepad», overlapped.
  2. A hidden, disabled, pop-up window, class name «MSCTFIME UI», caption «M».
  3. Another hidden, disabled, pop-up window, class name «IME», caption «Default IME».

The two hidden windows are used internally by notepad to implement the IME (Input Method Editor), the GUI to type complex scripts.

Many programs create top-level hidden windows for a lot of things. For what you intend, you can ignore them all and use only the visible ones.

Python pyautogui window handle

Using pyautogui is there a way to get a handle to a window so that I can ensure that a click is performed on that window only? In other words, if my window isn’t in focus, then the click does not occur. Additionally, if my window isn’t in focus then I bring it into focus and then perform the actions.

The way to identify a window could be an ID, window title etc similar to this https://autohotkey.com/docs/commands/WinGet.htm

Is there any other Python module that supports this kind of functionality?

3 Answers 3

Is there any other Python module that supports this kind of functionality?

PyAutoGui itself says, in its documentation’s FAQ section,

Q: Can PyAutoGUI figure out where windows are or which windows are visible? Can it focus, maximize, minimize windows? Can it read the window titles?

A: Unfortunately not, but these are the next features planned for PyAutoGUI. This functionality is being implemented in a Python package named PyGetWindow, which will be included in PyAutoGUI when complete.

Now, if you go on over to PyGetWindow’s repo, you’ll see there’s no code there yet, but there is a random_notes.txt file, with this pointer:

Finding window titles on Windows:

which has some interesting information. (I haven’t tried it yet.)

Selenium для Python. Глава 3. Навигация

Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.

Содержание:

3. Навигация

Предположительно, первое, что вы захотите сделать с помощью WebDriver, будет переход по ссылке. Обычно для таких целей используют метод get:

Метод driver.get перенаправляет к странице URL, поданной в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью. Если необходимо гарантировать полную загрузку страниц, вы можете использовать ожидания (англ. waits).

Читайте также:  Samsung ml 2160 series ������� mac os

3.1. Взаимодействие со страницей

Сама по себе возможность переходить по ссылке не так уж полезна. Что действительно хочется сделать, так это взаимодействовать со страницей, или, если быть точным, с элементами HTML на странице. Прежде всего необходимо найти их. WebDriver предоставляет ряд способов для поиска элементов. К примеру, на странице есть элемент, определенный таким образом:

Его можно найти, используя любой из следующих методов:

Также вы можете искать адрес гиперссылки по тексту гиперссылки, но будьте бдительны: текст должен совпадать в точности. Также будьте внимательны при использовании XPATH в WebDriver. Если существует больше одного элемента, удовлетворяющего условиям запроса, вернется только первый найденный. Если ничего не будет найдено, будет возбуждено исключение NoSuchElementException.

WebDriver имеет “Объекто-ориентированное” API [Интерфейс прикладного программирования (c англ. application programming interface) — набор готовых методов и свойств, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах. API позволяет пользоваться функционалом исходного приложения (библиотеки, сервиса), не вникая в тонкости реализации этого функционала. — Прим. пер.]; мы представляем все типы элементов используя один и тот же интерфейс. Это означает, что хоть вы и видите множество доступных методов, которые можно выбрать при нажатии комбинации клавиш автозаполнения в вашем IDE [Интегрированная среда разработки (англ. Integrated Development Environment) — система программных средств, используемая программистами для разработки программного обеспечения. — Прим. пер.], не все из них будут иметь для вас смысл или не все будут действующими. Не беспокойтесь! WebDriver попытается все исправить, так что если вы вызовете метод, используя его неправильно (например, используете “setSelected()” для “мета” тэга [Мета-теги (англ. meta tags) — HTML-теги, предназначенные для предоставления структурированных метаданных о веб-странице. Как правило, указываются в заголовке HTML-документа. — Прим. пер.]), WebDriver возбудит исключение.

Итак, мы получили элемент. Что вы можете с ним сделать? Первым делом вы захотите ввести какой-нибудь текст в текстовое поле:

Также вы можете имитировать нажатие клавиш-стрелок клавиатуры с помощью класса “Keys”:

Метод send_keys можно вызвать для любого элемента, который позволяет проверить сочетания клавиш, такие как те, что используются в GMail. Существует побочный эффект, заключающийся в том, что ввод в текстовое поле не очищает его автоматически. Вместо этого то, что вы набираете на клавиатуре, будет дописываться к уже вписанному в поле. Очистить содержимое тектового поля или текстовой области textarea легко — с помощью метода clear:

3.2. Заполнение форм

Мы уже рассмотрели ввод текста в текстовую область или текстовое поле, а как быть с другими элементами? Вы можете попробовать раскрыть раскрывающийся список, после чего можно использовать “setSelected” для выделения тэгов вроде OPTION. Работать с тэгами SELECT не так уж сложно:

Такой код найдет первый элемент “SELECT” на странице, и в цикле пройдет по всем тэгам OPTION поочередно, сообщая их значения и поочередно выделяя их.

Как можно заметить, это не самый быстрый способ работы с элементами SELECT. Поддерживаемые вебдрайвером классы содержат один, называющийся “Select”, он предоставляет более удобные способы взаимодействия:

Также WebDriver предоставляет возможность снятия выделения со всех элементов выпадающего списка:

Этот код снимает выделение со всех тегов OPTION первого тега SELECT на странице.

Допустим, для теста вам необходим список всех выделенных по умолчанию опций. Класс Select предоставляет такое свойство (возвращает список):

Для получения всех доступных опций используйте:

После того как с заполнением формы будет покончено, вы, вероятно, захотите “сохранить” изменения [submit — отправить, передать, подтвердить — Прим. пер.]. Одним из способов сделать это — найти кнопку “submit” и кликнуть по ней:

В качестве альтернативы первому методу можно использовать метод “submit”, доступный для каждого элемента. Если вызвать его для элемента внутри формы, WebDriver пробежится по всей структуре DOM, пока не найдет закрывающийся тег формы, и затем вызовет для нее submit. Если элемент находится не в форме, тогда возбудится исключение NoSuchElementException:

Читайте также:  Дисковые квоты windows server

3.3. Перетаскивание

Есть два варианта «перетаскивания» элементов: перемещение элемента на определенную величину, либо перетаскивание его на другой элемент:

3.4. Переключение между окнами и фрэймами

Современные веб-приложения редко обходятся без фреймов (frame) и редко когда ограничиваются одним окном. WebDriver поддерживает переключение между именованными окнами с помощью метода “switch_to_window”:

Все вызовы, начинающиеся с driver теперь будут истолкованы как обращенные к полученному окну. Но откуда вам знать имя окна? Взгляните на код javascript или ссылку, которые открывают окно:

Также вы можете послать “дескриптор окна” методу “switch_to_window()”. Пользуясь этой особенностью, вы можете использовать цикл для перебора всех открытых окон, к примеру, так:

Еще вы можете переходить между фрэймами (frame или iframes):

Можно получить доступ к подчиненным фреймам, подавая путь, разделяемый точкой, или можно получить фрейм по индексу:

Следующий код перенаправит к фрейму с именем “child”, который в свою очередь принадлежит первому подчиненному фрейму фрейма “frameName”. Пути к фреймам описываются полностью — от верхнего уровня:

Когда работа с фреймами будет завершена, необходимо переключиться обратно, к главному фрейму, что может быть сделано следующим образом:

3.5. Всплывающие окна

Selenium WebDriver из упаковки поддерживает управление всплывающими диалоговыми окнами. После того как вы инициируете запуск, откроется окно, управлять им можно так:

Код вернет объект текущего открытого окна. С этим объектом вы можете принять, отклонить вопрос окна, прочитать его содержимое или даже ввести текст по приглашению окна. Интерфейс взаимодействия со всплывающими окнами работает одинаково хорошо как для предупреждений (alerts), так и для запросов к подтверждению (confirms) и приглашений к вводу (prompts). За дополнительной информацией обратитесь к документации API.

3.6. Навигация: история и локация

Чуть раньше мы упомянули о навигации по ссылке с ипользованием комманды “get” ( driver.get(«www.example.com») ). Как вы уже могли заметить, WebDriver для отдельных случаев предоставляет узконаправленные, специализированные интерфейсы взаимодействия, и навигация не исключение. Чтобы перейти по ссылке, вы можете воспользоваться методом get:

Чтобы перейти вперед или назад по истории вкладки:

Имейте в виду, что этот функционал полностью зависит от используемого драйвера. Вы можете получить непредвиденный результат, если привыкли к поведению какого-либо конкретного браузера, а работаете с другим.

3.7. Куки (cookies)

Прежде, чем мы завершим эту главу, вам возможно будет интересно узнать как использовать куки. Прежде всего, вам необходим домен, использующий куки:

How to get a handle on Windows STDOUT handles (in python)?

I am trying to get a handle on Windows stdout handles.

I need to understand why there are different handles for STDOUT ( CONOUT$ ?) and how to interpret these differences. I know there are different output buffers used by the Windows API, but failt to understand (from the many MSDN docs) when and how to, use them.

Using ctypes and python3, I can get 2 of these by the script below. However, running the script in (Cygwin) mintty/bash , PowerShell (6.1.1), CMD or even ConEmu , all yield slightly different results.

In mintty all the stdout handles are the same, while in PowerShell they are different. What is going on?

Question:
Why are the stdout handles obtained by: _get_osfhandle and GetStdHandle different?

Here is my code:

Here is the output:

According to MSDN:

Retrieves the operating-system file handle that is associated with the specified file descriptor.

Retrieves a handle to the specified standard device (standard input, standard output, or standard error).

ADDENDUM: 2018-12-14

An instance of this class represents a loaded dll/shared library, exporting functions using the standard C calling convention (named ‘cdecl’ on Windows).

The exported functions can be accessed as attributes, or by indexing with the function name. Examples:

Читайте также:  Как скрытые файлы сделать видимыми linux

.qsort -> callable object

[‘qsort’] -> callable object

Calling the functions releases the Python GIL during the call and reacquires it afterwards.

This class represents the Python library itself. It allows accessing Python API functions. The GIL is not released, and Python exceptions are handled correctly.

Then if _os.name == «nt» :

This class represents a dll exporting functions using the Windows stdcall calling convention.

From the discussion comments:

stdcall :

The stdcall[4] calling convention is a variation on the Pascal calling convention in which the callee is responsible for cleaning up the stack, but the parameters are pushed onto the stack in right-to-left order, as in the _cdecl calling convention. Registers EAX, ECX, and EDX are designated for use within the function. Return values are stored in the EAX register.

stdcall is the standard calling convention for the Microsoft Win32 API and for Open Watcom C++.

Opening a handle to a device in Python on Windows

I’m trying to use the giveio.sys driver which requires a «file» to be opened before you can access protected memory. I’m looking at a C example from WinAVR/AVRdude that uses the syntax:

but this does not seem to work in Python — I just get a «The specified path is invalid» error, for both

Why doesn’t this do the same thing?

Edited to hopefully reduce confusion of ideas (thanks Will). I did verify that the device driver is running via the batch files that come with AVRdude.

Further edited to clarify SamB’s bounty.

6 Answers 6

Solution: in python you have to use win32file.CreateFile() instead of open(). Thanks everyone for telling me what I was trying to do, it helped me find the answer!

I don’t know anything about Python, but I do know a bit about drivers. You’re not trying to ‘open a file in kernel space’ at all — you’re just trying to open a handle to a device which happens to be made to look a bit like opening a file.

CreateFile is a user-mode function, and everything you’re doing here is user-mode, not kernel mode.

As xenon says, your call may be failing because you haven’t loaded the driver yet, or because whatever Python call you’re using to do the CreateFile is not passing the write parameters in.

I’ve never used giveio.sys myself, but personally I would establish that it was loaded correctly by using ‘C’ or C++ (or some pre-written app) before I tried to get it working via Python.

You’re question is very confusing to say the least.

1> The code you pasted is using a trick to communicate with the driver using its ‘DOSNAME’ i.e.

2> Have you created & loaded the ‘giveio’ driver ?

The reason the driver handles this calls is because of this

It sounds to me like you’re asking why os.open is not magically equal to calling CreateFile with a very specific set of parameters. Kostya’s answer is practical in that it tells you that you can use the Win32 python bindings to call CreateFile which is a Win32 API, directly.

Anything other than doing direct CreateFile/readFile/writeFile IO is going to introduce another layer on top (the python file objects and their behaviours) that restricts you to the parameters that os.open supports. os.open creates a python file object, which is not exactly the same thing, and not intended to provide all of Win32 CreateFile’s options.

That means, for example, that no exact analog of GENERIC_READ, or OPEN_EXISTING, or FILE_ATTRIBUTE_NORMAL are guaranteed to exist.

Оцените статью