diff --git a/Orchestrator/Web/Index.xhtml b/Orchestrator/Web/Index.xhtml
index 4d6c7213..da14bb22 100644
--- a/Orchestrator/Web/Index.xhtml
+++ b/Orchestrator/Web/Index.xhtml
@@ -83,6 +83,28 @@
});
}
+
+ mGlobal.Info.TablePlanLogListRefresh=function() {
+ ///Обнулить таблицу
+ $(".openrpa-info-table-planloglist").html("")
+ $.ajax({
+ type: "POST",
+ url: 'ProcessingRun',
+ data: '{"actionList":[{"type":"PlanLogListGet"}]}',
+ success:
+ function(lData,l2,l3)
+ {
+ var lResponseJSON=JSON.parse(lData)
+ lResponseJSON["actionListResult"][0]["result"].forEach(function(lItem){lItem["processPathName"]=("processPath" in lItem ? lItem["processPath"] : lItem["processName"])})
+ ///Отправить запрос на формирование таблицы
+ lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-info-table-planloglist",lResponseJSON["actionListResult"][0]);
+ ///Установить HTML код
+ $(".openrpa-info-table-planloglist").html(lHTMLCode)
+ },
+ dataType: "text"
+ });
+ }
+
//////////////////////////
/////Controller JS module
//////////////////////////
@@ -198,6 +220,7 @@
///Инициализация страницы
////////////////////////////////////
mGlobal.Info.TableActivityLogScheduleListRefresh();
+ mGlobal.Info.TablePlanLogListRefresh();
})
;
@@ -299,8 +322,41 @@
-
-
+
+
+
+
+
+
+
+
@@ -320,7 +376,7 @@
Look machine screenshot
diff --git a/Orchestrator/orchestratorConfiguration.json b/Orchestrator/orchestratorConfiguration.json
index ce9932ff..bbc684e9 100644
--- a/Orchestrator/orchestratorConfiguration.json
+++ b/Orchestrator/orchestratorConfiguration.json
@@ -57,7 +57,7 @@
{
"activityType":"loopActivity",
"loopSeconds":6,
- "loopTimeStart":"10:45",
+ "loopTimeStart":"21:45",
"loopTimeEnd":"21:46",
"pythonPackageName":"CheckActivity",
"pythonFunctionName":"test_activity",
diff --git a/Orchestrator/orchestratorMain.py b/Orchestrator/orchestratorMain.py
index 8a00f01b..aa8a7aff 100644
--- a/Orchestrator/orchestratorMain.py
+++ b/Orchestrator/orchestratorMain.py
@@ -77,7 +77,7 @@ while True:
#Запустить процесс
lItemArgs=[lItem["processPath"]]
lItemArgs.extend(lItem["processArgs"])
- subprocess.Popen(lItemArgs,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
+ subprocess.Popen(lItemArgs,shell=True)
#Определить вид активности
if lItem["activityType"]=="processStop":
#Вид активности - остановка процесса
diff --git a/Orchestrator/orchestratorProcessor.py b/Orchestrator/orchestratorProcessor.py
index 4e914add..baf84345 100644
--- a/Orchestrator/orchestratorProcessor.py
+++ b/Orchestrator/orchestratorProcessor.py
@@ -62,6 +62,10 @@ def ProcessingRun(inConfigurationDict):
if lItem["type"]=="ActivityLogScheduleListGet":
#pdb.set_trace()
lResult["actionListResult"][-1] = {**lResult["actionListResult"][-1], **{"result":mGlobalDict["ActivityLogScheduleList"]}}
+ #Обработка команды PlanLogListGet
+ if lItem["type"]=="PlanLogListGet":
+ #pdb.set_trace()
+ lResult["actionListResult"][-1] = {**lResult["actionListResult"][-1], **{"result":mGlobalDict["JSONConfigurationDict"]["activityList"]}}
#Обработка команды ActivityCMDRun
if lItem["type"]=="ActivityCMDRun":
lCMDCode="cmd /c "+lItem["code"]
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/LICENSE.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/LICENSE.txt
new file mode 100644
index 00000000..105aea99
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/LICENSE.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2014, Al Sweigart
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the PyAutoGUI nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/METADATA
new file mode 100644
index 00000000..912231bd
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/METADATA
@@ -0,0 +1,138 @@
+Metadata-Version: 2.1
+Name: PyAutoGUI
+Version: 0.9.44
+Summary: A cross-platform module for GUI automation for human beings. Control the keyboard and mouse from a Python script.
+Home-page: https://github.com/asweigart/pyautogui
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: gui automation test testing keyboard mouse cursor click press keystroke control
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: X11 Applications
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Description-Content-Type: text/markdown
+Requires-Dist: pymsgbox
+Requires-Dist: PyTweening (>=1.0.1)
+Requires-Dist: Pillow
+Requires-Dist: pyscreeze (>=0.1.21)
+Requires-Dist: pygetwindow (>=0.0.5)
+
+PyAutoGUI
+=========
+
+PyAutoGUI is a cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.
+
+`pip install pyautogui`
+
+Full documentation available at https://pyautogui.readthedocs.org
+
+Simplified Chinese documentation available at https://muxuezi.github.io/posts/doc-pyautogui.html
+
+Source code available at https://github.com/asweigart/pyautogui
+
+Dependencies
+============
+
+PyAutoGUI supports Python 2 and 3. If you are installing PyAutoGUI from PyPI using pip:
+
+Windows has no dependencies. The Win32 extensions do not need to be installed.
+
+OS X needs the pyobjc-core and pyobjc module installed (in that order).
+
+Linux needs the python3-xlib (or python-xlib for Python 2) module installed.
+
+Pillow needs to be installed, and on Linux you may need to install additional libraries to make sure Pillow's PNG/JPEG works correctly. See:
+
+ https://stackoverflow.com/questions/7648200/pip-install-pil-e-tickets-1-no-jpeg-png-support
+
+ http://ubuntuforums.org/showthread.php?t=1751455
+
+If you want to do development and contribute to PyAutoGUI, you will need to install these modules from PyPI:
+
+* pyscreeze
+* pymsgbox
+* pytweening
+
+Example Usage
+=============
+
+Keyboard and Mouse Control
+--------------------------
+```python
+ >>> import pyautogui
+ >>> screenWidth, screenHeight = pyautogui.size()
+ >>> currentMouseX, currentMouseY = pyautogui.position()
+ >>> pyautogui.moveTo(100, 150)
+ >>> pyautogui.click()
+ >>> pyautogui.moveRel(None, 10) # move mouse 10 pixels down
+ >>> pyautogui.doubleClick()
+ >>> pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.tweens.easeInOutQuad) # use tweening/easing function to move mouse over 2 seconds.
+ >>> pyautogui.typewrite('Hello world!', interval=0.25) # type with quarter-second pause in between each key
+ >>> pyautogui.press('esc')
+ >>> pyautogui.keyDown('shift')
+ >>> pyautogui.typewrite(['left', 'left', 'left', 'left', 'left', 'left'])
+ >>> pyautogui.keyUp('shift')
+ >>> pyautogui.hotkey('ctrl', 'c')
+```
+
+Display Message Boxes
+---------------------
+```python
+ >>> import pyautogui
+ >>> pyautogui.alert('This is an alert box.')
+ 'OK'
+ >>> pyautogui.confirm('Shall I proceed?')
+ 'Cancel'
+ >>> pyautogui.confirm('Enter option.', buttons=['A', 'B', 'C'])
+ 'B'
+ >>> pyautogui.prompt('What is your name?')
+ 'Al'
+ >>> pyautogui.password('Enter password (text will be hidden)')
+ 'swordfish'
+```
+Screenshot Functions
+--------------------
+
+(PyAutoGUI uses Pillow for image-related features.)
+```python
+ >>> import pyautogui
+ >>> im1 = pyautogui.screenshot()
+ >>> im1.save('my_screenshot.png')
+ >>> im2 = pyautogui.screenshot('my_screenshot2.png')
+```
+You can also locate where an image is on the screen:
+```python
+ >>> import pyautogui
+ >>> button7location = pyautogui.locateOnScreen('button.png') # returns (left, top, width, height) of matching region
+ >>> button7location
+ (1416, 562, 50, 41)
+ >>> buttonx, buttony = pyautogui.center(button7location)
+ >>> buttonx, buttony
+ (1441, 582)
+ >>> pyautogui.click(buttonx, buttony) # clicks the center of where the button was found
+```
+The locateCenterOnScreen() function returns the center of this match region:
+```python
+ >>> import pyautogui
+ >>> buttonx, buttony = pyautogui.locateCenterOnScreen('button.png') # returns (x, y) of matching region
+ >>> buttonx, buttony
+ (1441, 582)
+ >>> pyautogui.click(buttonx, buttony) # clicks the center of where the button was found
+```
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/RECORD
new file mode 100644
index 00000000..41b52786
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/RECORD
@@ -0,0 +1,26 @@
+PyAutoGUI-0.9.44.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyAutoGUI-0.9.44.dist-info/LICENSE.txt,sha256=rNMjpKuy_R62UDcXVGvAbRWA3qmJw7EzjRdrp8N8Zl0,1509
+PyAutoGUI-0.9.44.dist-info/METADATA,sha256=K2mubdEMFXv_Opkrn5f9Ax140-njnxIRCEpFClBe6YU,4964
+PyAutoGUI-0.9.44.dist-info/RECORD,,
+PyAutoGUI-0.9.44.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98
+PyAutoGUI-0.9.44.dist-info/top_level.txt,sha256=YztmWux-iPoF3Dv9x530vZvae0kMBsGbPAoKgWRGAvk,10
+pyautogui/__init__.py,sha256=RlRUdaTYdsfwwLXCANjBSCJGZhssrguuUoSJQ9g7auI,45305
+pyautogui/__main__.py,sha256=P8Ny3OScHrutsXUz-UsqKamaFihW-Yuq0YzKHkRGADI,58
+pyautogui/__pycache__/__init__.cpython-37.pyc,,
+pyautogui/__pycache__/__main__.cpython-37.pyc,,
+pyautogui/__pycache__/_pyautogui_java.cpython-37.pyc,,
+pyautogui/__pycache__/_pyautogui_osx.cpython-37.pyc,,
+pyautogui/__pycache__/_pyautogui_win.cpython-37.pyc,,
+pyautogui/__pycache__/_pyautogui_x11.cpython-37.pyc,,
+pyautogui/__pycache__/_window_win.cpython-37.pyc,,
+pyautogui/__pycache__/screenshotUtil.cpython-37.pyc,,
+pyautogui/__pycache__/test1.cpython-37.pyc,,
+pyautogui/__pycache__/tweens.cpython-37.pyc,,
+pyautogui/_pyautogui_java.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pyautogui/_pyautogui_osx.py,sha256=LwG6oFs9-MUxxga7Pj15B2UcGFxBJieuoH6yx5jHnSo,15647
+pyautogui/_pyautogui_win.py,sha256=qAwFfQk5G1kF8EI5wWa5MVewYuCMZQQnnM-xPCbtQhk,21294
+pyautogui/_pyautogui_x11.py,sha256=_g7VOXO6HjFvrhEr9bt2R1o1un3s-VzOmTkkPqTvCoE,15634
+pyautogui/_window_win.py,sha256=ReLnzdOoS-hlsTWkD2dQ-qyU_yuOEplJYHcZNtZxA04,3902
+pyautogui/screenshotUtil.py,sha256=S6pwcQZV7wMPvplAsp_pkcENcjIQdXqLqxBP926Z-OA,8363
+pyautogui/test1.py,sha256=hNr3BL5Dv2JSZNzXd_h-NkixMWbrm3EPB10MnB3-iUA,106
+pyautogui/tweens.py,sha256=NqjZcusP6jcxfQxa3zsMVft5PZrpouxlpDhOy_kd8s8,1440
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/WHEEL
new file mode 100644
index 00000000..03075056
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: cp37-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/top_level.txt
new file mode 100644
index 00000000..1f21f990
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyAutoGUI-0.9.44.dist-info/top_level.txt
@@ -0,0 +1 @@
+pyautogui
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/METADATA
new file mode 100644
index 00000000..ab3153ef
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/METADATA
@@ -0,0 +1,99 @@
+Metadata-Version: 2.1
+Name: PyGetWindow
+Version: 0.0.5
+Summary: A simple, cross-platform module for obtaining GUI information on application's windows.
+Home-page: https://github.com/asweigart/pygetwindow
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: gui window geometry resize minimize maximize close title
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: X11 Applications
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Description-Content-Type: text/markdown
+Requires-Dist: pyrect
+
+PyGetWindow
+===========
+
+A simple, cross-platform module for obtaining GUI information on and controlling application's windows.
+
+
+Still under development. Currently only the Windows platform is implemented. If you want to help contribute, please contact al@inventwithpython.com!
+
+
+Install
+-------
+
+ pip install pygetwindow
+
+
+Examples
+--------
+
+(For this example, I'm using Winodws and opened the Notepad application, which has a title of "Untitled - Notepad". Most of the effects of these functions can't be seen in text.)
+
+PyGetWindow has functions for obtaining ``Window`` objects from a place on the screen, from the window title, or just getting all windows. (``hWnd`` is specific to the Windows platform.)
+
+ >>> import pygetwindow as gw
+ >>> gw.getAllTitles()
+ ('', 'C:\\WINDOWS\\system32\\cmd.exe - pipenv shell - python', 'C:\\github\\PyGetWindow\\README.md • - Sublime Text', "asweigart/PyGetWindow: A simple, cross-platform module for obtaining GUI information on application's windows. - Google Chrome", 'Untitled - Notepad', 'C:\\Users\\Al\\Desktop\\xlibkey.py • - Sublime Text', 'https://tronche.com/gui/x/xlib/ - Google Chrome', 'Xlib Programming Manual: XGetWindowAttributes - Google Chrome', 'Generic Ubuntu Box [Running] - Oracle VM VirtualBox', 'Oracle VM VirtualBox Manager', 'Microsoft Edge', 'Microsoft Edge', 'Microsoft Edge', '', 'Microsoft Edge', 'Settings', 'Settings', 'Microsoft Store', 'Microsoft Store', '', '', 'Backup and Sync', 'Google Hangouts - asweigart@gmail.com', 'Downloads', '', '', 'Program Manager')
+ >>> gw.getAllWindows()
+ (Win32Window(hWnd=131318), Win32Window(hWnd=1050492), Win32Window(hWnd=67206), Win32Window(hWnd=66754), Win32Window(hWnd=264354), Win32Window(hWnd=329210), Win32Window(hWnd=1114374), Win32Window(hWnd=852550), Win32Window(hWnd=328358), Win32Window(hWnd=66998), Win32Window(hWnd=132508), Win32Window(hWnd=66964), Win32Window(hWnd=66882), Win32Window(hWnd=197282), Win32Window(hWnd=393880), Win32Window(hWnd=66810), Win32Window(hWnd=328466), Win32Window(hWnd=132332), Win32Window(hWnd=262904), Win32Window(hWnd=65962), Win32Window(hWnd=65956), Win32Window(hWnd=197522), Win32Window(hWnd=131944), Win32Window(hWnd=329334), Win32Window(hWnd=395034), Win32Window(hWnd=132928), Win32Window(hWnd=65882))
+ >>> gw.getWindowsWithTitle('Untitled')
+ (Win32Window(hWnd=264354),)
+ >>> gw.getFocusedWindow()
+ Win32Window(hWnd=1050492)
+ >>> gw.getFocusedWindow().title
+ 'C:\\WINDOWS\\system32\\cmd.exe - pipenv shell - python'
+ >>> gw.getWindowsAt(10, 10)
+ (Win32Window(hWnd=67206), Win32Window(hWnd=66754), Win32Window(hWnd=329210), Win32Window(hWnd=1114374), Win32Window(hWnd=852550), Win32Window(hWnd=132508), Win32Window(hWnd=66964), Win32Window(hWnd=66882), Win32Window(hWnd=197282), Win32Window(hWnd=393880), Win32Window(hWnd=66810), Win32Window(hWnd=328466), Win32Window(hWnd=395034), Win32Window(hWnd=132928), Win32Window(hWnd=65882))
+
+
+``Window`` objects can be minimized/maximized/restored/focused/resized/moved/closed and also have attributes for their current position, size, and state.
+
+ >>> notepadWindow = gw.getWindowsWithTitle('Untitled')[0]
+ >>> notepadWindow.isMaximized
+ False
+ >>> notepadWindow.maximize()
+ >>> notepadWindow.isMaximized
+ True
+ >>> notepadWindow.restore()
+ >>> notepadWindow.minimize()
+ >>> notepadWindow.restore()
+ >>> notepadWindow.focus()
+ >>> notepadWindow.resize(10, 10) # increase by 10, 10
+ >>> notepadWindow.resizeTo(100, 100) # set size to 100x100
+ >>> notepadWindow.move(10, 10) # move 10 pixels right and 10 down
+ >>> notepadWindow.moveTo(10, 10) # move window to 10, 10
+ >>> notepadWindow.size
+ (132, 100)
+ >>> notepadWindow.width
+ 132
+ >>> notepadWindow.height
+ 100
+ >>> notepadWindow.topleft
+ (10, 10)
+ >>> notepadWindow.top
+ 10
+ >>> notepadWindow.left
+ 10
+ >>> notepadWindow.bottomright
+ (142, 110)
+ >>> notepadWindow.close()
+ >>>
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/RECORD
new file mode 100644
index 00000000..4e2f90aa
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/RECORD
@@ -0,0 +1,13 @@
+PyGetWindow-0.0.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyGetWindow-0.0.5.dist-info/METADATA,sha256=70cWMr8QUNChH2OwlIYwRKwGkMhXsrNwQh3FWK3PciY,5094
+PyGetWindow-0.0.5.dist-info/RECORD,,
+PyGetWindow-0.0.5.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98
+PyGetWindow-0.0.5.dist-info/top_level.txt,sha256=WxTIgZWkYIMB1QQE7SO_vCL5q-sSKu5Fv0rJ0U7pWZk,12
+pygetwindow/__init__.py,sha256=Oaj5OilD9O6OP0BoAfivUdBOvkmPKFXAZ5vyIvlhw3I,1730
+pygetwindow/__pycache__/__init__.cpython-37.pyc,,
+pygetwindow/__pycache__/_pygetwindow_macos.cpython-37.pyc,,
+pygetwindow/__pycache__/_pygetwindow_win.cpython-37.pyc,,
+pygetwindow/__pycache__/foo.cpython-37.pyc,,
+pygetwindow/_pygetwindow_macos.py,sha256=P_JfzLkZNzDtOvpjdFLwngS_YWlWqZd0clpLyTH32OE,12976
+pygetwindow/_pygetwindow_win.py,sha256=evD-OUlMQTUb6S96--LlzvGnHaZSNUBeAT8R6F4u7IM,17937
+pygetwindow/foo.py,sha256=sYZ4q36T_IhSQrPKUdfW-kXMcJ_j4yHkxi9S2fRvpvU,8
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/WHEEL
new file mode 100644
index 00000000..03075056
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: cp37-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/top_level.txt
new file mode 100644
index 00000000..392e30fc
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyGetWindow-0.0.5.dist-info/top_level.txt
@@ -0,0 +1 @@
+pygetwindow
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/METADATA
new file mode 100644
index 00000000..8c3e8bc6
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/METADATA
@@ -0,0 +1,31 @@
+Metadata-Version: 2.1
+Name: PyMsgBox
+Version: 1.0.6
+Summary: A simple, cross-platform, pure Python module for JavaScript-like message boxes.
+Home-page: https://github.com/asweigart/PyMsgBox
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: gui msgbox message box dialog confirmation confirm password alert
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: X11 Applications
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+
+UNKNOWN
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/RECORD
new file mode 100644
index 00000000..da90935c
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/RECORD
@@ -0,0 +1,17 @@
+PyMsgBox-1.0.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyMsgBox-1.0.6.dist-info/METADATA,sha256=ecN1wrniIim5bOm7r8WTwWhjn_LFHwfK6HFjJHJgYDU,1178
+PyMsgBox-1.0.6.dist-info/RECORD,,
+PyMsgBox-1.0.6.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98
+PyMsgBox-1.0.6.dist-info/top_level.txt,sha256=VhumxHbRDo-rZSH_txL41DQO4DCaSDI0lz2AIhwUHbk,9
+pymsgbox/__init__.py,sha256=o_NGGc3p9hn3glO7X1QWq3ZUWZgLR_C8BUZa4aS40M0,13415
+pymsgbox/__pycache__/__init__.cpython-37.pyc,,
+pymsgbox/__pycache__/_native_java.cpython-37.pyc,,
+pymsgbox/__pycache__/_native_osx.cpython-37.pyc,,
+pymsgbox/__pycache__/_native_win.cpython-37.pyc,,
+pymsgbox/__pycache__/_native_x11.cpython-37.pyc,,
+pymsgbox/__pycache__/native.cpython-37.pyc,,
+pymsgbox/_native_java.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pymsgbox/_native_osx.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pymsgbox/_native_win.py,sha256=sbuilTAPOvGpn8wIklnxWzGuVbEfQeMKRqowyUVn5Ss,1982
+pymsgbox/_native_x11.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pymsgbox/native.py,sha256=QfDD2vsE9pW2MkHhAnLtg6yW62VL2iwXRCREmDCJ56Q,862
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/WHEEL
new file mode 100644
index 00000000..03075056
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: cp37-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/top_level.txt
new file mode 100644
index 00000000..97c034c3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyMsgBox-1.0.6.dist-info/top_level.txt
@@ -0,0 +1 @@
+pymsgbox
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/METADATA
new file mode 100644
index 00000000..705dd594
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/METADATA
@@ -0,0 +1,127 @@
+Metadata-Version: 2.1
+Name: PyRect
+Version: 0.1.4
+Summary: PyRect is a simple module with a Rect class for Pygame-like rectangular areas.
+Home-page: https://github.com/asweigart/pyrect
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: pygame rect rectangular rectangle area
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+
+======
+PyRect
+======
+PyRect is a simple module with a Rect class for Pygame-like rectangular areas.
+
+This module is like a stand-alone version of Pygame's Rect class. It is similar to the Rect module by Simon Wittber, but compatible with both Python 2 and 3.
+
+Currently under development, though the basic features work.
+
+Installation
+============
+
+ ``pip install rect``
+
+Quickstart Guide
+================
+
+First, create a Rect object by providing the XY coordinates of its top-left corner, and then the width and height:
+
+ >>> import pyrect
+ >>> r = pyrect.Rect(0, 0, 10, 20)
+
+There are several attributes that are automatically calculated (they have the same names as Pygame's Rect objects):
+
+ >>> r.width, r.height, r.size
+ (10, 20, (10, 20))
+ >>> r. left
+ 0
+ >>> r.right
+ 10
+ >>> r.top
+ 0
+ >>> r.bottom
+ 20
+ >>> r.center
+ (5, 10)
+ >>> r.topleft
+ (0, 0)
+ >>> r.topright
+ (10, 0)
+ >>> r.midleft
+ (0, 10)
+
+Changing these attributes re-calculates the others. The top-left corner is anchored for any growing or shrinking that takes place.
+
+ >>> r.topleft
+ (0, 0)
+ >>> r.left = 100
+ >>> r.topleft
+ (100, 0)
+ >>> r.topright
+ (110, 0)
+ >>> r.width = 30
+ >>> r.topright
+ (130, 0)
+
+Rect objects are locked to integers, unless you set `enableFloat` to `True`:
+
+ >>> r = pyrect.Rect(0, 0, 10, 20)
+ >>> r.width = 10.5
+ >>> r.width
+ 10
+ >>> r.enableFloat = True
+ >>> r.width = 10.5
+ >>> r.width
+ 10.5
+ >>> r2 = pyrect.Rect(0, 0, 10.5, 20.5, enableFloat=True)
+ >>> r2.size
+ (10.5, 20.5)
+
+Rect Attributes
+===============
+
+Rect objects have several attributes that can be read or modified. They are identical to Pygame's Rect objects:
+
+ ``x, y``
+
+ ``top, left, bottom, right``
+
+ ``topleft, bottomleft, topright, bottomright``
+
+ ``midtop, midleft, midbottom, midright``
+
+ ``center, centerx, centery``
+
+ ``size, width, height``
+
+ ``w, h``
+
+There are a couple other attributes as well:
+
+ ``box (a tuple (left, top, width, height))``
+
+ ``area (read-only)``
+
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/RECORD
new file mode 100644
index 00000000..7197390d
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/RECORD
@@ -0,0 +1,7 @@
+PyRect-0.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyRect-0.1.4.dist-info/METADATA,sha256=qviGiMu-arb3aBayzBqGbFt3OUPfnLnWtLgWbr6IP3k,3325
+PyRect-0.1.4.dist-info/RECORD,,
+PyRect-0.1.4.dist-info/WHEEL,sha256=05Ahrak1u2K61DpLp9CDNSbUImLTITCMom_cqTFk6pE,116
+PyRect-0.1.4.dist-info/top_level.txt,sha256=zRKhS2KGlJmow_PYupJ21SKCmAyorrFofAC7QGsXt5g,7
+pyrect/__init__.py,sha256=pRHUn6NZRI8NJtM7J5vjuBN3RpfnQcp7547xybl17mI,47934
+pyrect/__pycache__/__init__.cpython-37.pyc,,
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/WHEEL
new file mode 100644
index 00000000..c8240f03
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/top_level.txt
new file mode 100644
index 00000000..f2b11004
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyRect-0.1.4.dist-info/top_level.txt
@@ -0,0 +1 @@
+pyrect
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/LICENSE.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/LICENSE.txt
new file mode 100644
index 00000000..c6cc9a94
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/LICENSE.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2014, Al Sweigart
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of PyScreeze nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/METADATA
new file mode 100644
index 00000000..c3a7711e
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/METADATA
@@ -0,0 +1,156 @@
+Metadata-Version: 2.1
+Name: PyScreeze
+Version: 0.1.21
+Summary: A simple, cross-platform screenshot module for Python 2 and 3.
+Home-page: https://github.com/asweigart/pyscreeze
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: screenshot screen screencap capture scrot screencapture image
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: X11 Applications
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.1
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Requires-Dist: Pillow
+
+PyScreeze
+=========
+
+PyScreeze is a simple, cross-platform screenshot module for Python 2 and 3.
+
+About
+-----
+
+PyScreeze can take screenshots, save them to files, and locate images within the screen. This is useful if you have a small image of, say, a button that needs to be clicked and want to locate it on the screen.
+
+Screenshot functionality requires the Pillow module. OS X uses the `screencapture` command, which comes with the operating system. Linux uses the `scrot` command, which can be installed by running `sudo apt-get install scrot`.
+
+Special Notes About Ubuntu
+==========================
+
+Unfortunately, Ubuntu seems to have several deficiencies with installing Pillow. PNG and JPEG support are not included with Pillow out of the box on Ubuntu. The following links have more information
+
+The screenshot() Function
+=========================
+
+Calling `screenshot()` will return an Image object (see the Pillow or PIL module documentation for details). Passing a string of a filename will save the screenshot to a file as well as return it as an Image object.
+
+ >>> import pyscreeze
+ >>> im1 = pyscreeze.screenshot()
+ >>> im2 = pyscreeze.screenshot('my_screenshot.png')
+
+On a 1920 x 1080 screen, the `screenshot()` function takes roughly 100 milliseconds - it's not fast but it's not slow.
+
+There is also an optional `region` keyword argument, if you do not want a screenshot of the entire screen. You can pass a four-integer tuple of the left, top, width, and height of the region to capture:
+
+ >>> import pyscreeze
+ >>> im = pyscreeze.screenshot(region=(0,0, 300, 400))
+
+The Locate Functions
+====================
+
+You can visually locate something on the screen if you have an image file of it. You can call the `locateOnScreen('calc7key.png')` function to get the screen coordinates of the 7 button for a calculator app. The return value is a 4-integer tuple: (left, top, width, height). This tuple can be passed to `center()` to get the X and Y coordinates at the center of this region. If the image can't be found on the screen, `locateOnScreen()` returns `None`.
+
+ >>> import pyscreeze
+ >>> button7location = pyscreeze.locateOnScreen('calc7key.png')
+ >>> button7location
+ (1416, 562, 50, 41)
+ >>> button7x, button7y = pyscreeze.center(button7location)
+ >>> button7x, button7y
+ (1441, 582)
+ >>> pyscreeze.click(button7x, button7y) # clicks the center of where the 7 button was found
+
+The `locateCenterOnScreen()` function is probably the one you want to use most often:
+
+ >>> import pyscreeze
+ >>> x, y = pyscreeze.locateCenterOnScreen('calc7key.png')
+ >>> pyscreeze.click(x, y)
+
+On a 1920 x 1080 screen, the locate function calls take about 1 or 2 seconds. This may be too slow for action video games, but works for most purposes and applications.
+
+If speed is important, install the optional opencv library (`pip install cv2`). The `locateAll` computation will use it if available, and take less than 1 millisecond to find all matches in a full-screen search. (This does not include the time required to capture a screenshot.)
+
+There are several "locate" functions. They all start looking at the top-left corner of the screen (or image) and look to the left and then down. The arguments can either be a
+
+- `locateOnScreen(image, grayscale=False)` - Returns (left, top, width, height) coordinate of first found instance of the `image` on the screen. Returns None if not found on the screen.
+
+- `locateCenterOnScreen(image, grayscale=False)` - Returns (x, y) coordinates of the center of the first found instance of the `image` on the screen. Returns None if not found on the screen.
+
+- `locateAllOnScreen(image, grayscale=False)` - Returns a generator that yields (left, top, width, height) tuples for where the image is found on the screen.
+
+- `locate(needleImage, haystackImage, grayscale=False)` - Returns (left, top, width, height) coordinate of first found instance of `needleImage` in `haystackImage`. Returns None if not found on the screen.
+
+- `locateAll(needleImage, haystackImage, grayscale=False)` - Returns a generator that yields (left, top, width, height) tuples for where `needleImage` is found in `haystackImage`.
+
+The "locate all" functions can be used in for loops or passed to `list()`:
+
+ >>> import pyscreeze
+ >>> for pos in pyscreeze.locateAllOnScreen('someButton.png')
+ ... print(pos)
+ ...
+ (1101, 252, 50, 50)
+ (59, 481, 50, 50)
+ (1395, 640, 50, 50)
+ (1838, 676, 50, 50)
+ >>> list(pyscreeze.locateAllOnScreen('someButton.png'))
+ [(1101, 252, 50, 50), (59, 481, 50, 50), (1395, 640, 50, 50), (1838, 676, 50, 50)]
+
+Grayscale Matching
+------------------
+
+Optionally, you can pass `grayscale=True` to the locate functions to give a slight speedup (about 30%-ish). This desaturates the color from the images and screenshots, speeding up the locating but potentially causing false-positive matches.
+
+ >>> import pyscreeze
+ >>> button7location = pyscreeze.locateOnScreen('calc7key.png', grayscale=True)
+ >>> button7location
+ (1416, 562, 50, 41)
+
+Pixel Matching
+--------------
+
+To obtain the RGB color of a pixel in a screenshot, use the Image object's `getpixel()` method:
+
+ >>> import pyscreeze
+ >>> im = pyscreeze.screenshot()
+ >>> im.getpixel((100, 200))
+ (130, 135, 144)
+
+Or as a single function, call the `pixel()` PyScreeze function, which is a wrapper for the previous calls:
+
+ >>> import pyscreeze
+ >>> pyscreeze.pixel(100, 200)
+ (130, 135, 144)
+
+If you just need to verify that a single pixel matches a given pixel, call the `pixelMatchesColor()` function, passing it the X coordinate, Y coordinate, and RGB tuple of the color it represents:
+
+ >>> import pyscreeze
+ >>> pyscreeze.pixelMatchesColor(100, 200, (130, 135, 144))
+ True
+ >>> pyscreeze.pixelMatchesColor(100, 200, (0, 0, 0))
+ False
+
+The optional `tolerance` keyword argument specifies how much each of the red, green, and blue values can vary while still matching:
+
+ >>> import pyscreeze
+ >>> pyscreeze.pixelMatchesColor(100, 200, (130, 135, 144))
+ True
+ >>> pyscreeze.pixelMatchesColor(100, 200, (140, 125, 134))
+ False
+ >>> pyscreeze.pixelMatchesColor(100, 200, (140, 125, 134), tolerance=10)
+ True
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/RECORD
new file mode 100644
index 00000000..c3293d8d
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/RECORD
@@ -0,0 +1,8 @@
+PyScreeze-0.1.21.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyScreeze-0.1.21.dist-info/LICENSE.txt,sha256=XcpFE3U9k1S0c5N8Taxr3a_LXnlT4mpnKf4eJu7EUXc,1505
+PyScreeze-0.1.21.dist-info/METADATA,sha256=wVTgkGZEKE6RHotcA5XYTXeIjzJy6mdY4o7DDVPqxFc,7418
+PyScreeze-0.1.21.dist-info/RECORD,,
+PyScreeze-0.1.21.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98
+PyScreeze-0.1.21.dist-info/top_level.txt,sha256=ExHe4LVkQVDYcMxwsJMTH01lHyk4GLzRxiPv4hGDRjA,10
+pyscreeze/__init__.py,sha256=s418376u9o_LTVgNb8awm8LyqWkGS7qkOufkS8N6Vic,20522
+pyscreeze/__pycache__/__init__.cpython-37.pyc,,
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/WHEEL
new file mode 100644
index 00000000..03075056
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: cp37-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/top_level.txt
new file mode 100644
index 00000000..db860da3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyScreeze-0.1.21.dist-info/top_level.txt
@@ -0,0 +1 @@
+pyscreeze
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/METADATA
new file mode 100644
index 00000000..e49be4d2
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/METADATA
@@ -0,0 +1,26 @@
+Metadata-Version: 2.1
+Name: PyTweening
+Version: 1.0.3
+Summary: A collection of tweening / easing functions.
+Home-page: https://github.com/asweigart/pytweening
+Author: Al Sweigart
+Author-email: al@inventwithpython.com
+License: BSD
+Keywords: 2D animation tween tweening easing
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: X11 Applications
+Classifier: Environment :: MacOS X
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+
+UNKNOWN
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/RECORD
new file mode 100644
index 00000000..930c40d9
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/RECORD
@@ -0,0 +1,7 @@
+PyTweening-1.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+PyTweening-1.0.3.dist-info/METADATA,sha256=j2Mc5ESJwRYqGY5D_NbLOJiDsiVZ9RwSryRGKORkv1M,854
+PyTweening-1.0.3.dist-info/RECORD,,
+PyTweening-1.0.3.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98
+PyTweening-1.0.3.dist-info/top_level.txt,sha256=R8O2tKT6wD9sQ2kol4zYmcnqUOfgA9MMsswf3T9zRIo,11
+pytweening/__init__.py,sha256=IykpXFitgL3pv36qy-rFa8OQwhy5A-QK_FF1JCMPLTs,16939
+pytweening/__pycache__/__init__.cpython-37.pyc,,
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/WHEEL
new file mode 100644
index 00000000..03075056
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.33.1)
+Root-Is-Purelib: true
+Tag: cp37-none-any
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/top_level.txt
new file mode 100644
index 00000000..34400c8b
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/PyTweening-1.0.3.dist-info/top_level.txt
@@ -0,0 +1 @@
+pytweening
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__init__.py
new file mode 100644
index 00000000..c972d511
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__init__.py
@@ -0,0 +1,1156 @@
+# PyAutoGUI: Cross-platform GUI automation for human beings.
+# BSD license
+# Al Sweigart al@inventwithpython.com (Send me feedback & suggestions!)
+
+"""
+IMPORTANT NOTE!
+
+To use this module on Mac OS X, you need the PyObjC module installed.
+For Python 3, run:
+ sudo pip3 install pyobjc-core
+ sudo pip3 install pyobjc
+For Python 2, run:
+ sudo pip install pyobjc-core
+ sudo pip install pyobjc
+(There's some bug with their installer, so install pyobjc-core first or else
+the install takes forever.)
+
+To use this module on Linux, you need Xlib module installed.
+For Python 3, run:
+ sudo pip3 install python3-Xlib
+For Python 2, run:
+ sudo pip install Xlib
+
+To use this module on Windows, you do not need anything else.
+
+You will need PIL/Pillow to use the screenshot features.
+"""
+
+
+from __future__ import absolute_import, division, print_function
+
+
+__version__ = '0.9.44'
+
+import sys
+import time
+
+
+if sys.version_info[0] == 2 or sys.version_info[0:2] in ((3, 1), (3,2)):
+ # Python 2 and 3.1 and 3.2 uses collections.Sequence
+ import collections
+ collectionsSequence = collections.Sequence
+else:
+ # Python 3.3+ uses collections.abc.Sequence
+ import collections.abc
+ collectionsSequence = collections.abc.Sequence
+
+
+try:
+ import pytweening
+ from pytweening import (easeInQuad, easeOutQuad, easeInOutQuad,
+ easeInCubic, easeOutCubic, easeInOutCubic, easeInQuart, easeOutQuart,
+ easeInOutQuart, easeInQuint, easeOutQuint, easeInOutQuint, easeInSine,
+ easeOutSine, easeInOutSine, easeInExpo, easeOutExpo, easeInOutExpo,
+ easeInCirc, easeOutCirc, easeInOutCirc, easeInElastic, easeOutElastic,
+ easeInOutElastic, easeInBack, easeOutBack, easeInOutBack, easeInBounce,
+ easeOutBounce, easeInOutBounce)
+ # getLine is not needed.
+ # getPointOnLine has been redefined in this file, to avoid dependency on pytweening.
+ # linear has also been redefined in this file.
+except ImportError:
+ def couldNotImportPyTweening():
+ raise Exception('PyAutoGUI was unable to import pytweening. Please install this module.')
+ easeInQuad = easeOutQuad = easeInOutQuad = \
+ easeInCubic = easeOutCubic = easeInOutCubic = easeInQuart = easeOutQuart = \
+ easeInOutQuart = easeInQuint = easeOutQuint = easeInOutQuint = easeInSine = \
+ easeOutSine = easeInOutSine = easeInExpo = easeOutExpo = easeInOutExpo = \
+ easeInCirc = easeOutCirc = easeInOutCirc = easeInElastic = easeOutElastic = \
+ easeInOutElastic = easeInBack = easeOutBack = easeInOutBack = easeInBounce = \
+ easeOutBounce = easeInOutBounce = couldNotImportPyTweening
+
+
+try:
+ import pymsgbox
+ from pymsgbox import alert, confirm, prompt, password
+except ImportError:
+ # If pymsgbox module is not found, those methods will not be available.
+ def couldNotImportPyMsgBox():
+ raise Exception('PyAutoGUI was unable to import pymsgbox. Please install this module.')
+ alert = confirm = prompt = password = couldNotImportPyMsgBox
+
+
+try:
+ import pyscreeze
+ from pyscreeze import (center, grab, locate, locateAll, locateAllOnScreen,
+ locateCenterOnScreen, locateOnScreen, pixel, pixelMatchesColor,
+ screenshot)
+except ImportError:
+ # If pyscreeze module is not found, screenshot-related features will simply not work.
+ def couldNotImportPyScreeze():
+ raise Exception('PyAutoGUI was unable to import pyscreeze. Please install this module.')
+ center = grab = locate = locateAll = locateAllOnScreen = locateCenterOnScreen = locateOnScreen = pixel = pixelMatchesColor = screenshot = couldNotImportPyScreeze
+
+
+def useImageNotFoundException(value=None):
+ if value is None:
+ value = True
+ pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION = value
+
+
+
+if sys.platform == 'win32': # PyGetWindow currently only supports Windows.
+ try:
+ import pygetwindow
+ from pygetwindow import Window, getActiveWindow, getWindowsAt, getWindowsWithTitle, getAllWindows, getAllTitles
+ except ImportError:
+ # If pygetwindow module is not found, those methods will not be available.
+ def couldNotImportPyGetWindow():
+ raise Exception('PyAutoGUI was unable to import pygetwindow. Please install this module.')
+ Window = getActiveWindow = getWindowsAt = getWindowsWithTitle = getAllWindows = getAllTitles = couldNotImportPyGetWindow
+
+
+KEY_NAMES = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
+ ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`',
+ 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
+ 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
+ 'browserback', 'browserfavorites', 'browserforward', 'browserhome',
+ 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
+ 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
+ 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
+ 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
+ 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
+ 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
+ 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
+ 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
+ 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
+ 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
+ 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
+ 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
+ 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
+ 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
+ 'command', 'option', 'optionleft', 'optionright']
+KEYBOARD_KEYS = KEY_NAMES # keeping old KEYBOARD_KEYS for backwards compatibility
+
+
+def isShiftCharacter(character):
+ """Returns True if the key character is uppercase or shifted."""
+ return character.isupper() or character in '~!@#$%^&*()_+{}|:"<>?'
+
+
+# The platformModule is where we reference the platform-specific functions.
+if sys.platform.startswith('java'):
+ #from . import _pyautogui_java as platformModule
+ raise NotImplementedError('Jython is not yet supported by PyAutoGUI.')
+elif sys.platform == 'darwin':
+ from . import _pyautogui_osx as platformModule
+elif sys.platform == 'win32':
+ from . import _pyautogui_win as platformModule
+else:
+ from . import _pyautogui_x11 as platformModule
+
+
+# TODO: Having module-wide user-writable global variables is bad. It makes
+# restructuring the code very difficult. For instance, what if we decide to
+# move the mouse-related functions to a separate file (a submodule)? How that
+# file will access this module vars? It will probably lead to a circular
+# import.
+
+# In seconds. Any duration less than this is rounded to 0.0 to instantly move
+# the mouse.
+MINIMUM_DURATION = 0.1
+# If sleep_amount is less than MINIMUM_DURATION, time.sleep() will be a no-op and the mouse cursor moves there instantly.
+# TODO: This value should vary with the platform. http://stackoverflow.com/q/1133857
+MINIMUM_SLEEP = 0.05
+PAUSE = 0.1 # The number of seconds to pause after EVERY public function call. Useful for debugging.
+FAILSAFE = True
+FAILSAFE_POINT = (0, 0) # If the mouse is here and FAILSAFE is True, the FailSafeException is raised.
+
+
+Point = collections.namedtuple('Point', 'x y')
+Size = collections.namedtuple('Size', 'width height')
+
+
+# General Functions
+# =================
+
+def getPointOnLine(x1, y1, x2, y2, n):
+ """Returns the (x, y) tuple of the point that has progressed a proportion
+ n along the line defined by the two x, y coordinates.
+
+ Copied from pytweening module.
+ """
+ x = ((x2 - x1) * n) + x1
+ y = ((y2 - y1) * n) + y1
+ return (x, y)
+
+
+def linear(n):
+ """Trivial linear tweening function.
+
+ Copied from pytweening module.
+ """
+
+ # We use this function instead of pytweening.linear for the default tween function just in case pytweening couldn't be imported.
+ if not 0.0 <= n <= 1.0:
+ raise ValueError('Argument must be between 0.0 and 1.0.')
+ return n
+
+
+def _autoPause(pause, _pause):
+ if _pause:
+ if pause is not None:
+ time.sleep(pause)
+ elif PAUSE != 0:
+ time.sleep(PAUSE)
+
+
+def _unpackXY(x, y):
+ """If x is a sequence and y is None, returns x[0], y[0]. Else, returns x, y.
+
+ On functions that receive a pair of x,y coordinates, they can be passed as
+ separate arguments, or as a single two-element sequence.
+ """
+ if isinstance(x, str):
+ # x parameter is the string of an image filename to find and click on:
+ x, y = center(locateOnScreen(x))
+
+ elif isinstance(x, collectionsSequence):
+ if len(x) == 2:
+ # x is a two-integer tuple: (x, y)
+ if y is None:
+ x, y = x
+ else:
+ raise ValueError('When passing a sequence as the x argument, the y argument must not be passed (received {0}).'.format(repr(y)))
+ elif len(x) == 4:
+ # x is a four-integer tuple: (left, top, width, height)
+ if y is None:
+ x, y = center(x)
+ else:
+ raise ValueError('When passing a sequence as the x argument, the y argument must not be passed (received {0}).'.format(repr(y)))
+ else:
+ raise ValueError('The supplied sequence must have exactly 2 or exactly 4 elements ({0} were received).'.format(len(x)))
+ else:
+ pass # x and y are just number values
+
+ return x, y
+
+
+def position(x=None, y=None):
+ """Returns the current xy coordinates of the mouse cursor as a two-integer
+ tuple.
+
+ Args:
+ x (int, None, optional) - If not None, this argument overrides the x in
+ the return value.
+ y (int, None, optional) - If not None, this argument overrides the y in
+ the return value.
+
+ Returns:
+ (x, y) tuple of the current xy coordinates of the mouse cursor.
+ """
+ posx, posy = platformModule._position()
+ posx = int(posx)
+ posy = int(posy)
+ if x is not None: # If set, the x parameter overrides the return value.
+ posx = int(x)
+ if y is not None: # If set, the y parameter overrides the return value.
+ posy = int(y)
+ return Point(posx, posy)
+
+
+def size():
+ """Returns the width and height of the screen as a two-integer tuple.
+
+ Returns:
+ (width, height) tuple of the screen size, in pixels.
+ """
+ return Size(*platformModule._size())
+
+
+def onScreen(x, y=None):
+ """Returns whether the given xy coordinates are on the screen or not.
+
+ Args:
+ Either the arguments are two separate values, first arg for x and second
+ for y, or there is a single argument of a sequence with two values, the
+ first x and the second y.
+ Example: onScreen(x, y) or onScreen([x, y])
+
+ Returns:
+ bool: True if the xy coordinates are on the screen at its current
+ resolution, otherwise False.
+ """
+ x, y = _unpackXY(x, y)
+ x = int(x)
+ y = int(y)
+
+ width, height = platformModule._size()
+ return 0 <= x < width and 0 <= y < height
+
+
+# Mouse Functions
+# ===============
+
+def mouseDown(x=None, y=None, button='left', duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs pressing a mouse button down (but not up).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ mouse down happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ mouse down happens. None by default.
+ button (str, int, optional): The mouse button pressed down. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+
+ Raises:
+ ValueError: If button is not one of 'left', 'middle', 'right', 1, 2, or 3
+ """
+ if button not in ('left', 'middle', 'right', 1, 2, 3):
+ raise ValueError("button argument must be one of ('left', 'middle', 'right', 1, 2, 3), not %s" % button)
+
+ _failSafeCheck()
+ x, y = _unpackXY(x, y)
+
+ _mouseMoveDrag('move', x, y, 0, 0, duration=0, tween=None)
+
+ x, y = platformModule._position() # TODO - this isn't right. We need to check the params.
+ if button == 1 or str(button).lower() == 'left':
+ platformModule._mouseDown(x, y, 'left')
+ elif button == 2 or str(button).lower() == 'middle':
+ platformModule._mouseDown(x, y, 'middle')
+ elif button == 3 or str(button).lower() == 'right':
+ platformModule._mouseDown(x, y, 'right')
+
+ _autoPause(pause, _pause)
+
+
+def mouseUp(x=None, y=None, button='left', duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs releasing a mouse button up (but not down beforehand).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ mouse up happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ mouse up happens. None by default.
+ button (str, int, optional): The mouse button released. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+
+ Raises:
+ ValueError: If button is not one of 'left', 'middle', 'right', 1, 2, or 3
+ """
+ if button not in ('left', 'middle', 'right', 1, 2, 3):
+ raise ValueError("button argument must be one of ('left', 'middle', 'right', 1, 2, 3), not %s" % button)
+
+ _failSafeCheck()
+ x, y = _unpackXY(x, y)
+
+ _mouseMoveDrag('move', x, y, 0, 0, duration=0, tween=None)
+
+ x, y = platformModule._position()
+ if button == 1 or str(button).lower() == 'left':
+ platformModule._mouseUp(x, y, 'left')
+ elif button == 2 or str(button).lower() == 'middle':
+ platformModule._mouseUp(x, y, 'middle')
+ elif button == 3 or str(button).lower() == 'right':
+ platformModule._mouseUp(x, y, 'right')
+
+ _autoPause(pause, _pause)
+
+def click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs pressing a mouse button down and then immediately releasing it.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, str, optional): The x position on the screen where
+ the click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+ clicks (int, optional): The number of clicks to perform. 1 by default.
+ For example, passing 2 would do a doubleclick.
+ interval (float, optional): The number of seconds in between each click,
+ if the number of clicks is greater than 1. 0.0 by default, for no
+ pause in between clicks.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+
+ Raises:
+ ValueError: If button is not one of 'left', 'middle', 'right', 1, 2, 3
+ """
+ if button not in ('left', 'middle', 'right', 1, 2, 3):
+ raise ValueError("button argument must be one of ('left', 'middle', 'right', 1, 2, 3)")
+
+ _failSafeCheck()
+ x, y = _unpackXY(x, y)
+
+ _mouseMoveDrag('move', x, y, 0, 0, duration, tween)
+
+ x, y = platformModule._position()
+ for i in range(clicks):
+ _failSafeCheck()
+ if button == 1 or str(button).lower() == 'left':
+ platformModule._click(x, y, 'left')
+ elif button == 2 or str(button).lower() == 'middle':
+ platformModule._click(x, y, 'middle')
+ elif button == 3 or str(button).lower() == 'right':
+ platformModule._click(x, y, 'right')
+ else:
+ # These mouse buttons for hor. and vert. scrolling only apply to x11:
+ platformModule._click(x, y, button)
+
+ time.sleep(interval)
+
+ _autoPause(pause, _pause)
+
+def rightClick(x=None, y=None, duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs a right mouse button click.
+
+ This is a wrapper function for click('right', x, y).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+
+ click(x, y, 1, 0.0, 'right', _pause=False)
+
+ _autoPause(pause, _pause)
+
+
+def middleClick(x=None, y=None, duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs a middle mouse button click.
+
+ This is a wrapper function for click('right', x, y).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+
+ click(x, y, 1, 0.0, 'middle', _pause=False)
+
+ _autoPause(pause, _pause)
+
+
+def doubleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs a double click.
+
+ This is a wrapper function for click('left', x, y, 2, interval).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+ interval (float, optional): The number of seconds in between each click,
+ if the number of clicks is greater than 1. 0.0 by default, for no
+ pause in between clicks.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+
+ Raises:
+ ValueError: If button is not one of 'left', 'middle', 'right', 1, 2, 3, 4,
+ 5, 6, or 7
+ """
+ _failSafeCheck()
+
+ # Multiple clicks work different in OSX
+ if sys.platform == 'darwin':
+ x, y = _unpackXY(x, y)
+ _mouseMoveDrag('move', x, y, 0, 0, duration=0, tween=None)
+ x, y = platformModule._position()
+ platformModule._multiClick(x, y, button, 2)
+ else:
+ click(x, y, 2, interval, button, _pause=False)
+
+ _autoPause(pause, _pause)
+
+
+def tripleClick(x=None, y=None, interval=0.0, button='left', duration=0.0, tween=linear, pause=None, _pause=True):
+ """Performs a triple click..
+
+ This is a wrapper function for click('left', x, y, 3, interval).
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+ interval (float, optional): The number of seconds in between each click,
+ if the number of clicks is greater than 1. 0.0 by default, for no
+ pause in between clicks.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+
+ Raises:
+ ValueError: If button is not one of 'left', 'middle', 'right', 1, 2, 3, 4,
+ 5, 6, or 7
+ """
+ _failSafeCheck()
+
+ # Multiple clicks work different in OSX
+ if sys.platform == 'darwin':
+ x, y = _unpackXY(x, y)
+ _mouseMoveDrag('move', x, y, 0, 0, duration=0, tween=None)
+ x, y = platformModule._position()
+ platformModule._multiClick(x, y, button, 3)
+ else:
+ click(x, y, 2, interval, button, _pause=False)
+ _autoPause(pause, _pause)
+
+
+def scroll(clicks, x=None, y=None, pause=None, _pause=True):
+ """Performs a scroll of the mouse scroll wheel.
+
+ Whether this is a vertical or horizontal scroll depends on the underlying
+ operating system.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ clicks (int, float): The amount of scrolling to perform.
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+ if type(x) in (tuple, list):
+ x, y = x[0], x[1]
+ x, y = position(x, y)
+
+ platformModule._scroll(clicks, x, y)
+
+ _autoPause(pause, _pause)
+
+
+def hscroll(clicks, x=None, y=None, pause=None, _pause=True):
+ """Performs an explicitly horizontal scroll of the mouse scroll wheel,
+ if this is supported by the operating system. (Currently just Linux.)
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ clicks (int, float): The amount of scrolling to perform.
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+ if type(x) in (tuple, list):
+ x, y = x[0], x[1]
+ x, y = position(x, y)
+
+ platformModule._hscroll(clicks, x, y)
+
+ _autoPause(pause, _pause)
+
+
+def vscroll(clicks, x=None, y=None, pause=None, _pause=True):
+ """Performs an explicitly vertical scroll of the mouse scroll wheel,
+ if this is supported by the operating system. (Currently just Linux.)
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ clicks (int, float): The amount of scrolling to perform.
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+ if type(x) in (tuple, list):
+ x, y = x[0], x[1]
+ x, y = position(x, y)
+ platformModule._vscroll(clicks, x, y)
+
+ _autoPause(pause, _pause)
+
+
+def moveTo(x=None, y=None, duration=0.0, tween=linear, pause=None, _pause=True):
+ """Moves the mouse cursor to a point on the screen.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): The x position on the screen where the
+ click happens. None by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): The y position on the screen where the
+ click happens. None by default.
+ duration (float, optional): The amount of time it takes to move the mouse
+ cursor to the xy coordinates. If 0, then the mouse cursor is moved
+ instantaneously. 0.0 by default.
+ tween (func, optional): The tweening function used if the duration is not
+ 0. A linear tween is used by default. See the tweens.py file for
+ details.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+ x, y = _unpackXY(x, y)
+
+ _mouseMoveDrag('move', x, y, 0, 0, duration, tween)
+
+ _autoPause(pause, _pause)
+
+
+def moveRel(xOffset=None, yOffset=None, duration=0.0, tween=linear, pause=None, _pause=True):
+ """Moves the mouse cursor to a point on the screen, relative to its current
+ position.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): How far left (for negative values) or
+ right (for positive values) to move the cursor. 0 by default. If tuple, this is used for x and y.
+ y (int, float, None, optional): How far up (for negative values) or
+ down (for positive values) to move the cursor. 0 by default.
+ duration (float, optional): The amount of time it takes to move the mouse
+ cursor to the new xy coordinates. If 0, then the mouse cursor is moved
+ instantaneously. 0.0 by default.
+ tween (func, optional): The tweening function used if the duration is not
+ 0. A linear tween is used by default. See the tweens.py file for
+ details.
+
+ Returns:
+ None
+ """
+
+ _failSafeCheck()
+
+ xOffset, yOffset = _unpackXY(xOffset, yOffset)
+
+ _mouseMoveDrag('move', None, None, xOffset, yOffset, duration, tween)
+
+ _autoPause(pause, _pause)
+
+
+move = moveRel # For PyAutoGUI 1.0, move() replaces moveRel().
+
+
+def dragTo(x=None, y=None, duration=0.0, tween=linear, button='left', pause=None, _pause=True, mouseDownUp=True):
+ """Performs a mouse drag (mouse movement while a button is held down) to a
+ point on the screen.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): How far left (for negative values) or
+ right (for positive values) to move the cursor. 0 by default. If tuple, this is used for x and y.
+ If x is a str, it's considered a filename of an image to find on
+ the screen with locateOnScreen() and click the center of.
+ y (int, float, None, optional): How far up (for negative values) or
+ down (for positive values) to move the cursor. 0 by default.
+ duration (float, optional): The amount of time it takes to move the mouse
+ cursor to the new xy coordinates. If 0, then the mouse cursor is moved
+ instantaneously. 0.0 by default.
+ tween (func, optional): The tweening function used if the duration is not
+ 0. A linear tween is used by default. See the tweens.py file for
+ details.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+ mouseDownUp (True, False): When true, the mouseUp/Down actions are not perfomed.
+ Which allows dragging over multiple (small) actions. 'True' by default.
+
+ Returns:
+ None
+ """
+ _failSafeCheck()
+ x, y = _unpackXY(x, y)
+
+ if mouseDownUp:
+ mouseDown(button=button, _pause=False)
+ _mouseMoveDrag('drag', x, y, 0, 0, duration, tween, button)
+ if mouseDownUp:
+ mouseUp(button=button, _pause=False)
+
+ _autoPause(pause, _pause)
+
+
+def dragRel(xOffset=0, yOffset=0, duration=0.0, tween=linear, button='left', pause=None, _pause=True, mouseDownUp=True):
+ """Performs a mouse drag (mouse movement while a button is held down) to a
+ point on the screen, relative to its current position.
+
+ The x and y parameters detail where the mouse event happens. If None, the
+ current mouse position is used. If a float value, it is rounded down. If
+ outside the boundaries of the screen, the event happens at edge of the
+ screen.
+
+ Args:
+ x (int, float, None, tuple, optional): How far left (for negative values) or
+ right (for positive values) to move the cursor. 0 by default. If tuple, this is used for xOffset and yOffset.
+ y (int, float, None, optional): How far up (for negative values) or
+ down (for positive values) to move the cursor. 0 by default.
+ duration (float, optional): The amount of time it takes to move the mouse
+ cursor to the new xy coordinates. If 0, then the mouse cursor is moved
+ instantaneously. 0.0 by default.
+ tween (func, optional): The tweening function used if the duration is not
+ 0. A linear tween is used by default. See the tweens.py file for
+ details.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+ mouseDownUp (True, False): When true, the mouseUp/Down actions are not perfomed.
+ Which allows dragging over multiple (small) actions. 'True' by default.
+
+ Returns:
+ None
+ """
+ if xOffset is None:
+ xOffset = 0
+ if yOffset is None:
+ yOffset = 0
+
+ if type(xOffset) in (tuple, list):
+ xOffset, yOffset = xOffset[0], xOffset[1]
+
+ if xOffset == 0 and yOffset == 0:
+ return # no-op case
+
+ _failSafeCheck()
+
+ mousex, mousey = platformModule._position()
+ if mouseDownUp:
+ mouseDown(button=button, _pause=False)
+ _mouseMoveDrag('drag', mousex, mousey, xOffset, yOffset, duration, tween, button)
+ if mouseDownUp:
+ mouseUp(button=button, _pause=False)
+
+ _autoPause(pause, _pause)
+
+
+drag = dragRel # For PyAutoGUI 1.0, we want drag() to replace dragRel().
+
+
+def _mouseMoveDrag(moveOrDrag, x, y, xOffset, yOffset, duration, tween=linear, button=None):
+ """Handles the actual move or drag event, since different platforms
+ implement them differently.
+
+ On Windows & Linux, a drag is a normal mouse move while a mouse button is
+ held down. On OS X, a distinct "drag" event must be used instead.
+
+ The code for moving and dragging the mouse is similar, so this function
+ handles both. Users should call the moveTo() or dragTo() functions instead
+ of calling _mouseMoveDrag().
+
+ Args:
+ moveOrDrag (str): Either 'move' or 'drag', for the type of action this is.
+ x (int, float, None, optional): How far left (for negative values) or
+ right (for positive values) to move the cursor. 0 by default.
+ y (int, float, None, optional): How far up (for negative values) or
+ down (for positive values) to move the cursor. 0 by default.
+ xOffset (int, float, None, optional): How far left (for negative values) or
+ right (for positive values) to move the cursor. 0 by default.
+ yOffset (int, float, None, optional): How far up (for negative values) or
+ down (for positive values) to move the cursor. 0 by default.
+ duration (float, optional): The amount of time it takes to move the mouse
+ cursor to the new xy coordinates. If 0, then the mouse cursor is moved
+ instantaneously. 0.0 by default.
+ tween (func, optional): The tweening function used if the duration is not
+ 0. A linear tween is used by default. See the tweens.py file for
+ details.
+ button (str, int, optional): The mouse button clicked. Must be one of
+ 'left', 'middle', 'right' (or 1, 2, or 3) respectively. 'left' by
+ default.
+
+ Returns:
+ None
+ """
+
+ # The move and drag code is similar, but OS X requires a special drag event instead of just a move event when dragging.
+ # See https://stackoverflow.com/a/2696107/1893164
+ assert moveOrDrag in ('move', 'drag'), "moveOrDrag must be in ('move', 'drag'), not %s" % (moveOrDrag)
+
+ if sys.platform != 'darwin':
+ moveOrDrag = 'move' # Only OS X needs the drag event specifically.
+
+ xOffset = int(xOffset) if xOffset is not None else 0
+ yOffset = int(yOffset) if yOffset is not None else 0
+
+ if x is None and y is None and xOffset == 0 and yOffset == 0:
+ return # Special case for no mouse movement at all.
+
+ startx, starty = position()
+
+ x = int(x) if x is not None else startx
+ y = int(y) if y is not None else starty
+
+ # x, y, xOffset, yOffset are now int.
+ x += xOffset
+ y += yOffset
+
+ width, height = size()
+
+ # Make sure x and y are within the screen bounds.
+ x = max(0, min(x, width - 1))
+ y = max(0, min(y, height - 1))
+
+ # If the duration is small enough, just move the cursor there instantly.
+ steps = [(x, y)]
+
+ if duration > MINIMUM_DURATION:
+ # Non-instant moving/dragging involves tweening:
+ num_steps = max(width, height)
+ sleep_amount = duration / num_steps
+ if sleep_amount < MINIMUM_SLEEP:
+ num_steps = int(duration / MINIMUM_SLEEP)
+ sleep_amount = duration / num_steps
+
+ steps = [
+ getPointOnLine(startx, starty, x, y, tween(n / num_steps))
+ for n in range(num_steps)
+ ]
+ # Making sure the last position is the actual destination.
+ steps.append((x, y))
+
+ for tweenX, tweenY in steps:
+ if len(steps) > 1:
+ # A single step does not require tweening.
+ time.sleep(sleep_amount)
+
+ _failSafeCheck()
+ tweenX = int(round(tweenX))
+ tweenY = int(round(tweenY))
+ if moveOrDrag == 'move':
+ platformModule._moveTo(tweenX, tweenY)
+ elif moveOrDrag == 'drag':
+ platformModule._dragTo(tweenX, tweenY, button)
+ else:
+ raise NotImplementedError('Unknown value of moveOrDrag: {0}'.format(moveOrDrag))
+
+ _failSafeCheck()
+
+
+# Keyboard Functions
+# ==================
+
+def isValidKey(key):
+ """Returns a Boolean value if the given key is a valid value to pass to
+ PyAutoGUI's keyboard-related functions for the current platform.
+
+ This function is here because passing an invalid value to the PyAutoGUI
+ keyboard functions currently is a no-op that does not raise an exception.
+
+ Some keys are only valid on some platforms. For example, while 'esc' is
+ valid for the Escape key on all platforms, 'browserback' is only used on
+ Windows operating systems.
+
+ Args:
+ key (str): The key value.
+
+ Returns:
+ bool: True if key is a valid value, False if not.
+ """
+ return platformModule.keyboardMapping.get(key, None) != None
+
+
+def keyDown(key, pause=None, _pause=True):
+ """Performs a keyboard key press without the release. This will put that
+ key in a held down state.
+
+ NOTE: For some reason, this does not seem to cause key repeats like would
+ happen if a keyboard key was held down on a text field.
+
+ Args:
+ key (str): The key to be pressed down. The valid names are listed in
+ KEYBOARD_KEYS.
+
+ Returns:
+ None
+ """
+ if len(key) > 1:
+ key = key.lower()
+
+ _failSafeCheck()
+ platformModule._keyDown(key)
+
+ _autoPause(pause, _pause)
+
+def keyUp(key, pause=None, _pause=True):
+ """Performs a keyboard key release (without the press down beforehand).
+
+ Args:
+ key (str): The key to be released up. The valid names are listed in
+ KEYBOARD_KEYS.
+
+ Returns:
+ None
+ """
+ if len(key) > 1:
+ key = key.lower()
+
+ _failSafeCheck()
+ platformModule._keyUp(key)
+
+ _autoPause(pause, _pause)
+
+def press(keys, presses=1, interval=0.0, pause=None, _pause=True):
+ """Performs a keyboard key press down, followed by a release.
+
+ Args:
+ key (str, list): The key to be pressed. The valid names are listed in
+ KEYBOARD_KEYS. Can also be a list of such strings.
+ presses (integer, optiional): the number of press repetition
+ 1 by default, for just one press
+ interval (float, optional): How many seconds between each press.
+ 0.0 by default, for no pause between presses.
+ pause (float, optional): How many seconds in the end of function process.
+ None by default, for no pause in the end of function process.
+ Returns:
+ None
+ """
+ if type(keys) == str:
+ keys = [keys] # put string in a list
+ else:
+ lowerKeys = []
+ for s in keys:
+ if len(s) > 1:
+ lowerKeys.append(s.lower())
+ else:
+ lowerKeys.append(s)
+ interval = float(interval)
+ for i in range(presses):
+ for k in keys:
+ _failSafeCheck()
+ platformModule._keyDown(k)
+ platformModule._keyUp(k)
+ time.sleep(interval)
+
+ _autoPause(pause, _pause)
+
+def typewrite(message, interval=0.0, pause=None, _pause=True):
+ """Performs a keyboard key press down, followed by a release, for each of
+ the characters in message.
+
+ The message argument can also be list of strings, in which case any valid
+ keyboard name can be used.
+
+ Since this performs a sequence of keyboard presses and does not hold down
+ keys, it cannot be used to perform keyboard shortcuts. Use the hotkey()
+ function for that.
+
+ Args:
+ message (str, list): If a string, then the characters to be pressed. If a
+ list, then the key names of the keys to press in order. The valid names
+ are listed in KEYBOARD_KEYS.
+ interval (float, optional): The number of seconds in between each press.
+ 0.0 by default, for no pause in between presses.
+
+ Returns:
+ None
+ """
+ interval = float(interval)
+
+ _failSafeCheck()
+
+ for c in message:
+ if len(c) > 1:
+ c = c.lower()
+ press(c, _pause=False)
+ time.sleep(interval)
+ _failSafeCheck()
+
+ _autoPause(pause, _pause)
+
+
+write = typewrite # In PyAutoGUI 1.0, write() replaces typewrite().
+
+
+def hotkey(*args, **kwargs):
+ """Performs key down presses on the arguments passed in order, then performs
+ key releases in reverse order.
+
+ The effect is that calling hotkey('ctrl', 'shift', 'c') would perform a
+ "Ctrl-Shift-C" hotkey/keyboard shortcut press.
+
+ Args:
+ key(s) (str): The series of keys to press, in order. This can also be a
+ list of key strings to press.
+ interval (float, optional): The number of seconds in between each press.
+ 0.0 by default, for no pause in between presses.
+
+ Returns:
+ None
+ """
+ interval = float(kwargs.get('interval', 0.0))
+
+ _failSafeCheck()
+
+ for c in args:
+ if len(c) > 1:
+ c = c.lower()
+ platformModule._keyDown(c)
+ time.sleep(interval)
+ for c in reversed(args):
+ if len(c) > 1:
+ c = c.lower()
+ platformModule._keyUp(c)
+ time.sleep(interval)
+
+ _autoPause(kwargs.get('pause', None), kwargs.get('_pause', True))
+
+
+class FailSafeException(Exception):
+ pass
+
+
+def _failSafeCheck():
+ global FAILSAFE_POINT
+
+ if isinstance(FAILSAFE_POINT, str):
+ if FAILSAFE_POINT.lower() == 'topleft':
+ FAILSAFE_POINT = (0, 0)
+ elif FAILSAFE_POINT.lower() == 'topright':
+ FAILSAFE_POINT = (size()[0] - 1, 0)
+ elif FAILSAFE_POINT.lower() == 'bottomleft':
+ FAILSAFE_POINT = (0, size()[1] - 1)
+ elif FAILSAFE_POINT.lower() == 'bottomright':
+ screenSize = size()
+ FAILSAFE_POINT = (screenSize[0] - 1, screenSize[1] - 1)
+ else:
+ raise
+
+ if FAILSAFE and position() == FAILSAFE_POINT:
+ raise FailSafeException('PyAutoGUI fail-safe triggered from mouse moving to upper-left corner. To disable this fail-safe, set pyautogui.FAILSAFE to False.')
+
+
+def displayMousePosition(xOffset=0, yOffset=0):
+ """This function is meant to be run from the command line. It will
+ automatically display the location and RGB of the mouse cursor."""
+ print('Press Ctrl-C to quit.')
+ if xOffset != 0 or yOffset != 0:
+ print('xOffset: %s yOffset: %s' % (xOffset, yOffset))
+ resolution = size()
+ try:
+ while True:
+ # Get and print the mouse coordinates.
+ x, y = position()
+ positionStr = 'X: ' + str(x - xOffset).rjust(4) + ' Y: ' + str(y - yOffset).rjust(4)
+ if (x - xOffset) < 0 or (y - yOffset) < 0 or (x - xOffset) >= resolution[0] or (y - yOffset) >= resolution[1]:
+ pixelColor = ('NaN', 'NaN', 'NaN')
+ else:
+ pixelColor = pyscreeze.screenshot().getpixel((x, y))
+ positionStr += ' RGB: (' + str(pixelColor[0]).rjust(3)
+ positionStr += ', ' + str(pixelColor[1]).rjust(3)
+ positionStr += ', ' + str(pixelColor[2]).rjust(3) + ')'
+ sys.stdout.write(positionStr)
+ sys.stdout.write('\b' * len(positionStr))
+ sys.stdout.flush()
+ except KeyboardInterrupt:
+ sys.stdout.write('\n')
+ sys.stdout.flush()
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__main__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__main__.py
new file mode 100644
index 00000000..57204678
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/__main__.py
@@ -0,0 +1,2 @@
+from . import displayMousePosition
+displayMousePosition()
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_java.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_java.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_osx.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_osx.py
new file mode 100644
index 00000000..eb4b108a
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_osx.py
@@ -0,0 +1,442 @@
+import time
+import sys
+
+try:
+ import Quartz
+except:
+ assert False, "You must first install pyobjc-core and pyobjc: https://pyautogui.readthedocs.io/en/latest/install.html"
+import AppKit
+
+import pyautogui
+
+
+if sys.platform != 'darwin':
+ raise Exception('The pyautogui_osx module should only be loaded on an OS X system.')
+
+
+
+""" Taken from events.h
+/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h
+
+The *KB dictionaries in pyautogui map a string that can be passed to keyDown(),
+keyUp(), or press() into the code used for the OS-specific keyboard function.
+
+They should always be lowercase, and the same keys should be used across all OSes."""
+keyboardMapping = dict([(key, None) for key in pyautogui.KEY_NAMES])
+keyboardMapping.update({
+ 'a': 0x00, # kVK_ANSI_A
+ 's': 0x01, # kVK_ANSI_S
+ 'd': 0x02, # kVK_ANSI_D
+ 'f': 0x03, # kVK_ANSI_F
+ 'h': 0x04, # kVK_ANSI_H
+ 'g': 0x05, # kVK_ANSI_G
+ 'z': 0x06, # kVK_ANSI_Z
+ 'x': 0x07, # kVK_ANSI_X
+ 'c': 0x08, # kVK_ANSI_C
+ 'v': 0x09, # kVK_ANSI_V
+ 'b': 0x0b, # kVK_ANSI_B
+ 'q': 0x0c, # kVK_ANSI_Q
+ 'w': 0x0d, # kVK_ANSI_W
+ 'e': 0x0e, # kVK_ANSI_E
+ 'r': 0x0f, # kVK_ANSI_R
+ 'y': 0x10, # kVK_ANSI_Y
+ 't': 0x11, # kVK_ANSI_T
+ '1': 0x12, # kVK_ANSI_1
+ '!': 0x12, # kVK_ANSI_1
+ '2': 0x13, # kVK_ANSI_2
+ '@': 0x13, # kVK_ANSI_2
+ '3': 0x14, # kVK_ANSI_3
+ '#': 0x14, # kVK_ANSI_3
+ '4': 0x15, # kVK_ANSI_4
+ '$': 0x15, # kVK_ANSI_4
+ '6': 0x16, # kVK_ANSI_6
+ '^': 0x16, # kVK_ANSI_6
+ '5': 0x17, # kVK_ANSI_5
+ '%': 0x17, # kVK_ANSI_5
+ '=': 0x18, # kVK_ANSI_Equal
+ '+': 0x18, # kVK_ANSI_Equal
+ '9': 0x19, # kVK_ANSI_9
+ '(': 0x19, # kVK_ANSI_9
+ '7': 0x1a, # kVK_ANSI_7
+ '&': 0x1a, # kVK_ANSI_7
+ '-': 0x1b, # kVK_ANSI_Minus
+ '_': 0x1b, # kVK_ANSI_Minus
+ '8': 0x1c, # kVK_ANSI_8
+ '*': 0x1c, # kVK_ANSI_8
+ '0': 0x1d, # kVK_ANSI_0
+ ')': 0x1d, # kVK_ANSI_0
+ ']': 0x1e, # kVK_ANSI_RightBracket
+ '}': 0x1e, # kVK_ANSI_RightBracket
+ 'o': 0x1f, # kVK_ANSI_O
+ 'u': 0x20, # kVK_ANSI_U
+ '[': 0x21, # kVK_ANSI_LeftBracket
+ '{': 0x21, # kVK_ANSI_LeftBracket
+ 'i': 0x22, # kVK_ANSI_I
+ 'p': 0x23, # kVK_ANSI_P
+ 'l': 0x25, # kVK_ANSI_L
+ 'j': 0x26, # kVK_ANSI_J
+ "'": 0x27, # kVK_ANSI_Quote
+ '"': 0x27, # kVK_ANSI_Quote
+ 'k': 0x28, # kVK_ANSI_K
+ ';': 0x29, # kVK_ANSI_Semicolon
+ ':': 0x29, # kVK_ANSI_Semicolon
+ '\\': 0x2a, # kVK_ANSI_Backslash
+ '|': 0x2a, # kVK_ANSI_Backslash
+ ',': 0x2b, # kVK_ANSI_Comma
+ '<': 0x2b, # kVK_ANSI_Comma
+ '/': 0x2c, # kVK_ANSI_Slash
+ '?': 0x2c, # kVK_ANSI_Slash
+ 'n': 0x2d, # kVK_ANSI_N
+ 'm': 0x2e, # kVK_ANSI_M
+ '.': 0x2f, # kVK_ANSI_Period
+ '>': 0x2f, # kVK_ANSI_Period
+ '`': 0x32, # kVK_ANSI_Grave
+ '~': 0x32, # kVK_ANSI_Grave
+ ' ': 0x31, # kVK_Space
+ 'space': 0x31,
+ '\r': 0x24, # kVK_Return
+ '\n': 0x24, # kVK_Return
+ 'enter': 0x24, # kVK_Return
+ 'return': 0x24, # kVK_Return
+ '\t': 0x30, # kVK_Tab
+ 'tab': 0x30, # kVK_Tab
+ 'backspace': 0x33, # kVK_Delete, which is "Backspace" on OS X.
+ '\b': 0x33, # kVK_Delete, which is "Backspace" on OS X.
+ 'esc': 0x35, # kVK_Escape
+ 'escape': 0x35, # kVK_Escape
+ 'command': 0x37, # kVK_Command
+ 'shift': 0x38, # kVK_Shift
+ 'shiftleft': 0x38, # kVK_Shift
+ 'capslock': 0x39, # kVK_CapsLock
+ 'option': 0x3a, # kVK_Option
+ 'optionleft': 0x3a, # kVK_Option
+ 'alt': 0x3a, # kVK_Option
+ 'altleft': 0x3a, # kVK_Option
+ 'ctrl': 0x3b, # kVK_Control
+ 'ctrlleft': 0x3b, # kVK_Control
+ 'shiftright': 0x3c, # kVK_RightShift
+ 'optionright': 0x3d, # kVK_RightOption
+ 'ctrlright': 0x3e, # kVK_RightControl
+ 'fn': 0x3f, # kVK_Function
+ 'f17': 0x40, # kVK_F17
+ 'volumeup': 0x48, # kVK_VolumeUp
+ 'volumedown': 0x49, # kVK_VolumeDown
+ 'volumemute': 0x4a, # kVK_Mute
+ 'f18': 0x4f, # kVK_F18
+ 'f19': 0x50, # kVK_F19
+ 'f20': 0x5a, # kVK_F20
+ 'f5': 0x60, # kVK_F5
+ 'f6': 0x61, # kVK_F6
+ 'f7': 0x62, # kVK_F7
+ 'f3': 0x63, # kVK_F3
+ 'f8': 0x64, # kVK_F8
+ 'f9': 0x65, # kVK_F9
+ 'f11': 0x67, # kVK_F11
+ 'f13': 0x69, # kVK_F13
+ 'f16': 0x6a, # kVK_F16
+ 'f14': 0x6b, # kVK_F14
+ 'f10': 0x6d, # kVK_F10
+ 'f12': 0x6f, # kVK_F12
+ 'f15': 0x71, # kVK_F15
+ 'help': 0x72, # kVK_Help
+ 'home': 0x73, # kVK_Home
+ 'pageup': 0x74, # kVK_PageUp
+ 'pgup': 0x74, # kVK_PageUp
+ 'del': 0x75, # kVK_ForwardDelete
+ 'delete': 0x75, # kVK_ForwardDelete
+ 'f4': 0x76, # kVK_F4
+ 'end': 0x77, # kVK_End
+ 'f2': 0x78, # kVK_F2
+ 'pagedown': 0x79, # kVK_PageDown
+ 'pgdn': 0x79, # kVK_PageDown
+ 'f1': 0x7a, # kVK_F1
+ 'left': 0x7b, # kVK_LeftArrow
+ 'right': 0x7c, # kVK_RightArrow
+ 'down': 0x7d, # kVK_DownArrow
+ 'up': 0x7e, # kVK_UpArrow
+ 'yen': 0x5d, # kVK_JIS_Yen
+ #'underscore' : 0x5e, # kVK_JIS_Underscore (only applies to Japanese keyboards)
+ #'comma': 0x5f, # kVK_JIS_KeypadComma (only applies to Japanese keyboards)
+ 'eisu': 0x66, # kVK_JIS_Eisu
+ 'kana': 0x68, # kVK_JIS_Kana
+})
+
+"""
+# TODO - additional key codes to add
+ kVK_ANSI_KeypadDecimal = 0x41,
+ kVK_ANSI_KeypadMultiply = 0x43,
+ kVK_ANSI_KeypadPlus = 0x45,
+ kVK_ANSI_KeypadClear = 0x47,
+ kVK_ANSI_KeypadDivide = 0x4B,
+ kVK_ANSI_KeypadEnter = 0x4C,
+ kVK_ANSI_KeypadMinus = 0x4E,
+ kVK_ANSI_KeypadEquals = 0x51,
+ kVK_ANSI_Keypad0 = 0x52,
+ kVK_ANSI_Keypad1 = 0x53,
+ kVK_ANSI_Keypad2 = 0x54,
+ kVK_ANSI_Keypad3 = 0x55,
+ kVK_ANSI_Keypad4 = 0x56,
+ kVK_ANSI_Keypad5 = 0x57,
+ kVK_ANSI_Keypad6 = 0x58,
+ kVK_ANSI_Keypad7 = 0x59,
+ kVK_ANSI_Keypad8 = 0x5B,
+ kVK_ANSI_Keypad9 = 0x5C,
+"""
+
+# add mappings for uppercase letters
+for c in 'abcdefghijklmnopqrstuvwxyz':
+ keyboardMapping[c.upper()] = keyboardMapping[c]
+
+# Taken from ev_keymap.h
+# http://www.opensource.apple.com/source/IOHIDFamily/IOHIDFamily-86.1/IOHIDSystem/IOKit/hidsystem/ev_keymap.h
+special_key_translate_table = {
+ 'KEYTYPE_SOUND_UP': 0,
+ 'KEYTYPE_SOUND_DOWN': 1,
+ 'KEYTYPE_BRIGHTNESS_UP': 2,
+ 'KEYTYPE_BRIGHTNESS_DOWN': 3,
+ 'KEYTYPE_CAPS_LOCK': 4,
+ 'KEYTYPE_HELP': 5,
+ 'POWER_KEY': 6,
+ 'KEYTYPE_MUTE': 7,
+ 'UP_ARROW_KEY': 8,
+ 'DOWN_ARROW_KEY': 9,
+ 'KEYTYPE_NUM_LOCK': 10,
+ 'KEYTYPE_CONTRAST_UP': 11,
+ 'KEYTYPE_CONTRAST_DOWN': 12,
+ 'KEYTYPE_LAUNCH_PANEL': 13,
+ 'KEYTYPE_EJECT': 14,
+ 'KEYTYPE_VIDMIRROR': 15,
+ 'KEYTYPE_PLAY': 16,
+ 'KEYTYPE_NEXT': 17,
+ 'KEYTYPE_PREVIOUS': 18,
+ 'KEYTYPE_FAST': 19,
+ 'KEYTYPE_REWIND': 20,
+ 'KEYTYPE_ILLUMINATION_UP': 21,
+ 'KEYTYPE_ILLUMINATION_DOWN': 22,
+ 'KEYTYPE_ILLUMINATION_TOGGLE': 23
+}
+
+def _keyDown(key):
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ if key in special_key_translate_table:
+ _specialKeyEvent(key, 'down')
+ else:
+ _normalKeyEvent(key, 'down')
+
+def _keyUp(key):
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ if key in special_key_translate_table:
+ _specialKeyEvent(key, 'up')
+ else:
+ _normalKeyEvent(key, 'up')
+
+
+def _normalKeyEvent(key, upDown):
+ assert upDown in ('up', 'down'), "upDown argument must be 'up' or 'down'"
+
+ try:
+ if pyautogui.isShiftCharacter(key):
+ key_code = keyboardMapping[key.lower()]
+
+ event = Quartz.CGEventCreateKeyboardEvent(None,
+ keyboardMapping['shift'], upDown == 'down')
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)
+ # Tiny sleep to let OS X catch up on us pressing shift
+ time.sleep(0.01)
+
+ else:
+ key_code = keyboardMapping[key]
+
+ event = Quartz.CGEventCreateKeyboardEvent(None, key_code, upDown == 'down')
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)
+ time.sleep(0.01)
+
+ # TODO - wait, is the shift key's keyup not done?
+ # TODO - get rid of this try-except.
+
+ except KeyError:
+ raise RuntimeError("Key %s not implemented." % (key))
+
+def _specialKeyEvent(key, upDown):
+ """ Helper method for special keys.
+
+ Source: http://stackoverflow.com/questions/11045814/emulate-media-key-press-on-mac
+ """
+ assert upDown in ('up', 'down'), "upDown argument must be 'up' or 'down'"
+
+ key_code = special_key_translate_table[key]
+
+ ev = AppKit.NSEvent.otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
+ Quartz.NSSystemDefined, # type
+ (0,0), # location
+ 0xa00 if upDown == 'down' else 0xb00, # flags
+ 0, # timestamp
+ 0, # window
+ 0, # ctx
+ 8, # subtype
+ (key_code << 16) | ((0xa if upDown == 'down' else 0xb) << 8), # data1
+ -1 # data2
+ )
+
+ Quartz.CGEventPost(0, ev.CGEvent())
+
+
+
+
+
+
+
+
+
+def _position():
+ loc = AppKit.NSEvent.mouseLocation()
+ return int(loc.x), int(Quartz.CGDisplayPixelsHigh(0) - loc.y)
+
+
+def _size():
+ return Quartz.CGDisplayPixelsWide(Quartz.CGMainDisplayID()), Quartz.CGDisplayPixelsHigh(Quartz.CGMainDisplayID())
+
+
+
+def _scroll(clicks, x=None, y=None):
+ _vscroll(clicks, x, y)
+
+
+"""
+According to https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/Quartz.CGEventCreateScrollWheelEvent
+"Scrolling movement is generally represented by small signed integer values, typically in a range from -10 to +10. Large values may have unexpected results, depending on the application that processes the event."
+The scrolling functions will create multiple events that scroll 10 each, and then scroll the remainder.
+"""
+
+def _vscroll(clicks, x=None, y=None):
+ _moveTo(x, y)
+ clicks = int(clicks)
+ for _ in range(abs(clicks) // 10):
+ scrollWheelEvent = Quartz.CGEventCreateScrollWheelEvent(
+ None, # no source
+ Quartz.kCGScrollEventUnitLine, # units
+ 1, # wheelCount (number of dimensions)
+ 10 if clicks >= 0 else -10) # vertical movement
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, scrollWheelEvent)
+
+ scrollWheelEvent = Quartz.CGEventCreateScrollWheelEvent(
+ None, # no source
+ Quartz.kCGScrollEventUnitLine, # units
+ 1, # wheelCount (number of dimensions)
+ clicks % 10 if clicks >= 0 else -1 * (-clicks % 10)) # vertical movement
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, scrollWheelEvent)
+
+
+def _hscroll(clicks, x=None, y=None):
+ _moveTo(x, y)
+ clicks = int(clicks)
+ for _ in range(abs(clicks) // 10):
+ scrollWheelEvent = Quartz.CGEventCreateScrollWheelEvent(
+ None, # no source
+ Quartz.kCGScrollEventUnitLine, # units
+ 2, # wheelCount (number of dimensions)
+ 0, # vertical movement
+ 10 if clicks >= 0 else -10) # horizontal movement
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, scrollWheelEvent)
+
+ scrollWheelEvent = Quartz.CGEventCreateScrollWheelEvent(
+ None, # no source
+ Quartz.kCGScrollEventUnitLine, # units
+ 2, # wheelCount (number of dimensions)
+ 0, # vertical movement
+ (clicks % 10) if clicks >= 0 else (-1 * clicks % 10)) # horizontal movement
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, scrollWheelEvent)
+
+
+def _mouseDown(x, y, button):
+ if button == 'left':
+ _sendMouseEvent(Quartz.kCGEventLeftMouseDown, x, y, Quartz.kCGMouseButtonLeft)
+ elif button == 'middle':
+ _sendMouseEvent(Quartz.kCGEventOtherMouseDown, x, y, Quartz.kCGMouseButtonCenter)
+ elif button == 'right':
+ _sendMouseEvent(Quartz.kCGEventRightMouseDown, x, y, Quartz.kCGMouseButtonRight)
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+
+def _mouseUp(x, y, button):
+ if button == 'left':
+ _sendMouseEvent(Quartz.kCGEventLeftMouseUp, x, y, Quartz.kCGMouseButtonLeft)
+ elif button == 'middle':
+ _sendMouseEvent(Quartz.kCGEventOtherMouseUp, x, y, Quartz.kCGMouseButtonCenter)
+ elif button == 'right':
+ _sendMouseEvent(Quartz.kCGEventRightMouseUp, x, y, Quartz.kCGMouseButtonRight)
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+
+def _click(x, y, button):
+ if button == 'left':
+ _sendMouseEvent(Quartz.kCGEventLeftMouseDown, x, y, Quartz.kCGMouseButtonLeft)
+ _sendMouseEvent(Quartz.kCGEventLeftMouseUp, x, y, Quartz.kCGMouseButtonLeft)
+ elif button == 'middle':
+ _sendMouseEvent(Quartz.kCGEventOtherMouseDown, x, y, Quartz.kCGMouseButtonCenter)
+ _sendMouseEvent(Quartz.kCGEventOtherMouseUp, x, y, Quartz.kCGMouseButtonCenter)
+ elif button == 'right':
+ _sendMouseEvent(Quartz.kCGEventRightMouseDown, x, y, Quartz.kCGMouseButtonRight)
+ _sendMouseEvent(Quartz.kCGEventRightMouseUp, x, y, Quartz.kCGMouseButtonRight)
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+def _multiClick(x, y, button, num):
+ btn = None
+ down = None
+ up = None
+
+ if button == 'left':
+ btn = Quartz.kCGMouseButtonLeft
+ down = Quartz.kCGEventLeftMouseDown
+ up = Quartz.kCGEventLeftMouseUp
+ elif button == 'middle':
+ btn = Quartz.kCGMouseButtonCenter
+ down = Quartz.kCGEventOtherMouseDown
+ up = Quartz.kCGEventOtherMouseUp
+ elif button == 'right':
+ btn = Quartz.kCGMouseButtonRight
+ down = Quartz.kCGEventRightMouseDown
+ up = Quartz.kCGEventRightMouseUp
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+ return
+
+ mouseEvent = Quartz.CGEventCreateMouseEvent(None, down, (x, y), btn)
+ Quartz.CGEventSetIntegerValueField(mouseEvent, Quartz.kCGMouseEventClickState, num)
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, mouseEvent)
+ Quartz.CGEventSetType(mouseEvent, up)
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, mouseEvent)
+ for i in range(0, num-1):
+ Quartz.CGEventSetType(mouseEvent, down)
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, mouseEvent)
+ Quartz.CGEventSetType(mouseEvent, up)
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, mouseEvent)
+
+
+def _sendMouseEvent(ev, x, y, button):
+ mouseEvent = Quartz.CGEventCreateMouseEvent(None, ev, (x, y), button)
+ Quartz.CGEventPost(Quartz.kCGHIDEventTap, mouseEvent)
+
+
+def _dragTo(x, y, button):
+ if button == 'left':
+ _sendMouseEvent(Quartz.kCGEventLeftMouseDragged , x, y, Quartz.kCGMouseButtonLeft)
+ elif button == 'middle':
+ _sendMouseEvent(Quartz.kCGEventOtherMouseDragged , x, y, Quartz.kCGMouseButtonCenter)
+ elif button == 'right':
+ _sendMouseEvent(Quartz.kCGEventRightMouseDragged , x, y, Quartz.kCGMouseButtonRight)
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+ time.sleep(0.01) # needed to allow OS time to catch up.
+
+def _moveTo(x, y):
+ _sendMouseEvent(Quartz.kCGEventMouseMoved, x, y, 0)
+ time.sleep(0.01) # needed to allow OS time to catch up.
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_win.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_win.py
new file mode 100644
index 00000000..7a9ef10b
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_win.py
@@ -0,0 +1,586 @@
+# Windows implementation of PyAutoGUI functions.
+# BSD license
+# Al Sweigart al@inventwithpython.com
+
+import ctypes
+import ctypes.wintypes
+import pyautogui
+
+import sys
+if sys.platform != 'win32':
+ raise Exception('The pyautogui_win module should only be loaded on a Windows system.')
+
+
+# Fixes the scaling issues where PyAutoGUI was reporting the wrong resolution:
+try:
+ ctypes.windll.user32.SetProcessDPIAware()
+except AttributeError:
+ pass # Windows XP doesn't support this, so just do nothing.
+
+
+"""
+A lot of this code is probably repeated from win32 extensions module, but I didn't want to have that dependency.
+
+Note: According to http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx
+the ctypes.windll.user32.mouse_event() function has been superceded by SendInput.
+
+SendInput() is documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
+
+UPDATE: SendInput() doesn't seem to be working for me. I've switched back to mouse_event()."""
+
+
+# Event codes to be passed to the mouse_event() win32 function.
+# Documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
+MOUSEEVENTF_LEFTDOWN = 0x0002
+MOUSEEVENTF_LEFTUP = 0x0004
+MOUSEEVENTF_LEFTCLICK = MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP
+MOUSEEVENTF_RIGHTDOWN = 0x0008
+MOUSEEVENTF_RIGHTUP = 0x0010
+MOUSEEVENTF_RIGHTCLICK = MOUSEEVENTF_RIGHTDOWN + MOUSEEVENTF_RIGHTUP
+MOUSEEVENTF_MIDDLEDOWN = 0x0020
+MOUSEEVENTF_MIDDLEUP = 0x0040
+MOUSEEVENTF_MIDDLECLICK = MOUSEEVENTF_MIDDLEDOWN + MOUSEEVENTF_MIDDLEUP
+
+MOUSEEVENTF_WHEEL = 0x0800
+MOUSEEVENTF_HWHEEL = 0x01000
+
+# Documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx
+KEYEVENTF_KEYUP = 0x0002
+
+# Documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
+INPUT_MOUSE = 0
+INPUT_KEYBOARD = 1
+
+
+# This ctypes structure is for a Win32 POINT structure,
+# which is documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805(v=vs.85).aspx
+# The POINT structure is used by GetCursorPos().
+class POINT(ctypes.Structure):
+ _fields_ = [("x", ctypes.c_long),
+ ("y", ctypes.c_long)]
+
+# These ctypes structures are for Win32 INPUT, MOUSEINPUT, KEYBDINPUT, and HARDWAREINPUT structures,
+# used by SendInput and documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
+# Thanks to BSH for this StackOverflow answer: https://stackoverflow.com/questions/18566289/how-would-you-recreate-this-windows-api-structure-with-ctypes
+class MOUSEINPUT(ctypes.Structure):
+ _fields_ = [
+ ('dx', ctypes.wintypes.LONG),
+ ('dy', ctypes.wintypes.LONG),
+ ('mouseData', ctypes.wintypes.DWORD),
+ ('dwFlags', ctypes.wintypes.DWORD),
+ ('time', ctypes.wintypes.DWORD),
+ ('dwExtraInfo', ctypes.POINTER(ctypes.wintypes.ULONG)),
+ ]
+
+class KEYBDINPUT(ctypes.Structure):
+ _fields_ = [
+ ('wVk', ctypes.wintypes.WORD),
+ ('wScan', ctypes.wintypes.WORD),
+ ('dwFlags', ctypes.wintypes.DWORD),
+ ('time', ctypes.wintypes.DWORD),
+ ('dwExtraInfo', ctypes.POINTER(ctypes.wintypes.ULONG)),
+ ]
+
+class HARDWAREINPUT(ctypes.Structure):
+ _fields_ = [
+ ('uMsg', ctypes.wintypes.DWORD),
+ ('wParamL', ctypes.wintypes.WORD),
+ ('wParamH', ctypes.wintypes.DWORD)
+ ]
+
+class INPUT(ctypes.Structure):
+ class _I(ctypes.Union):
+ _fields_ = [
+ ('mi', MOUSEINPUT),
+ ('ki', KEYBDINPUT),
+ ('hi', HARDWAREINPUT),
+ ]
+
+ _anonymous_ = ('i', )
+ _fields_ = [
+ ('type', ctypes.wintypes.DWORD),
+ ('i', _I),
+ ]
+# End of the SendInput win32 data structures.
+
+
+
+""" Keyboard key mapping for pyautogui:
+Documented at http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
+
+The *KB dictionaries in pyautogui map a string that can be passed to keyDown(),
+keyUp(), or press() into the code used for the OS-specific keyboard function.
+
+They should always be lowercase, and the same keys should be used across all OSes."""
+keyboardMapping = dict([(key, None) for key in pyautogui.KEY_NAMES])
+keyboardMapping.update({
+ 'backspace': 0x08, # VK_BACK
+ '\b': 0x08, # VK_BACK
+ 'super': 0x5B, #VK_LWIN
+ 'tab': 0x09, # VK_TAB
+ '\t': 0x09, # VK_TAB
+ 'clear': 0x0c, # VK_CLEAR
+ 'enter': 0x0d, # VK_RETURN
+ '\n': 0x0d, # VK_RETURN
+ 'return': 0x0d, # VK_RETURN
+ 'shift': 0x10, # VK_SHIFT
+ 'ctrl': 0x11, # VK_CONTROL
+ 'alt': 0x12, # VK_MENU
+ 'pause': 0x13, # VK_PAUSE
+ 'capslock': 0x14, # VK_CAPITAL
+ 'kana': 0x15, # VK_KANA
+ 'hanguel': 0x15, # VK_HANGUEL
+ 'hangul': 0x15, # VK_HANGUL
+ 'junja': 0x17, # VK_JUNJA
+ 'final': 0x18, # VK_FINAL
+ 'hanja': 0x19, # VK_HANJA
+ 'kanji': 0x19, # VK_KANJI
+ 'esc': 0x1b, # VK_ESCAPE
+ 'escape': 0x1b, # VK_ESCAPE
+ 'convert': 0x1c, # VK_CONVERT
+ 'nonconvert': 0x1d, # VK_NONCONVERT
+ 'accept': 0x1e, # VK_ACCEPT
+ 'modechange': 0x1f, # VK_MODECHANGE
+ ' ': 0x20, # VK_SPACE
+ 'space': 0x20,
+ 'pgup': 0x21, # VK_PRIOR
+ 'pgdn': 0x22, # VK_NEXT
+ 'pageup': 0x21, # VK_PRIOR
+ 'pagedown': 0x22, # VK_NEXT
+ 'end': 0x23, # VK_END
+ 'home': 0x24, # VK_HOME
+ 'left': 0x25, # VK_LEFT
+ 'up': 0x26, # VK_UP
+ 'right': 0x27, # VK_RIGHT
+ 'down': 0x28, # VK_DOWN
+ 'select': 0x29, # VK_SELECT
+ 'print': 0x2a, # VK_PRINT
+ 'execute': 0x2b, # VK_EXECUTE
+ 'prtsc': 0x2c, # VK_SNAPSHOT
+ 'prtscr': 0x2c, # VK_SNAPSHOT
+ 'prntscrn': 0x2c, # VK_SNAPSHOT
+ 'printscreen': 0x2c, # VK_SNAPSHOT
+ 'insert': 0x2d, # VK_INSERT
+ 'del': 0x2e, # VK_DELETE
+ 'delete': 0x2e, # VK_DELETE
+ 'help': 0x2f, # VK_HELP
+ 'win': 0x5b, # VK_LWIN
+ 'winleft': 0x5b, # VK_LWIN
+ 'winright': 0x5c, # VK_RWIN
+ 'apps': 0x5d, # VK_APPS
+ 'sleep': 0x5f, # VK_SLEEP
+ 'num0': 0x60, # VK_NUMPAD0
+ 'num1': 0x61, # VK_NUMPAD1
+ 'num2': 0x62, # VK_NUMPAD2
+ 'num3': 0x63, # VK_NUMPAD3
+ 'num4': 0x64, # VK_NUMPAD4
+ 'num5': 0x65, # VK_NUMPAD5
+ 'num6': 0x66, # VK_NUMPAD6
+ 'num7': 0x67, # VK_NUMPAD7
+ 'num8': 0x68, # VK_NUMPAD8
+ 'num9': 0x69, # VK_NUMPAD9
+ 'multiply': 0x6a, # VK_MULTIPLY ??? Is this the numpad *?
+ 'add': 0x6b, # VK_ADD ??? Is this the numpad +?
+ 'separator': 0x6c, # VK_SEPARATOR ??? Is this the numpad enter?
+ 'subtract': 0x6d, # VK_SUBTRACT ??? Is this the numpad -?
+ 'decimal': 0x6e, # VK_DECIMAL
+ 'divide': 0x6f, # VK_DIVIDE
+ 'f1': 0x70, # VK_F1
+ 'f2': 0x71, # VK_F2
+ 'f3': 0x72, # VK_F3
+ 'f4': 0x73, # VK_F4
+ 'f5': 0x74, # VK_F5
+ 'f6': 0x75, # VK_F6
+ 'f7': 0x76, # VK_F7
+ 'f8': 0x77, # VK_F8
+ 'f9': 0x78, # VK_F9
+ 'f10': 0x79, # VK_F10
+ 'f11': 0x7a, # VK_F11
+ 'f12': 0x7b, # VK_F12
+ 'f13': 0x7c, # VK_F13
+ 'f14': 0x7d, # VK_F14
+ 'f15': 0x7e, # VK_F15
+ 'f16': 0x7f, # VK_F16
+ 'f17': 0x80, # VK_F17
+ 'f18': 0x81, # VK_F18
+ 'f19': 0x82, # VK_F19
+ 'f20': 0x83, # VK_F20
+ 'f21': 0x84, # VK_F21
+ 'f22': 0x85, # VK_F22
+ 'f23': 0x86, # VK_F23
+ 'f24': 0x87, # VK_F24
+ 'numlock': 0x90, # VK_NUMLOCK
+ 'scrolllock': 0x91, # VK_SCROLL
+ 'shiftleft': 0xa0, # VK_LSHIFT
+ 'shiftright': 0xa1, # VK_RSHIFT
+ 'ctrlleft': 0xa2, # VK_LCONTROL
+ 'ctrlright': 0xa3, # VK_RCONTROL
+ 'altleft': 0xa4, # VK_LMENU
+ 'altright': 0xa5, # VK_RMENU
+ 'browserback': 0xa6, # VK_BROWSER_BACK
+ 'browserforward': 0xa7, # VK_BROWSER_FORWARD
+ 'browserrefresh': 0xa8, # VK_BROWSER_REFRESH
+ 'browserstop': 0xa9, # VK_BROWSER_STOP
+ 'browsersearch': 0xaa, # VK_BROWSER_SEARCH
+ 'browserfavorites': 0xab, # VK_BROWSER_FAVORITES
+ 'browserhome': 0xac, # VK_BROWSER_HOME
+ 'volumemute': 0xad, # VK_VOLUME_MUTE
+ 'volumedown': 0xae, # VK_VOLUME_DOWN
+ 'volumeup': 0xaf, # VK_VOLUME_UP
+ 'nexttrack': 0xb0, # VK_MEDIA_NEXT_TRACK
+ 'prevtrack': 0xb1, # VK_MEDIA_PREV_TRACK
+ 'stop': 0xb2, # VK_MEDIA_STOP
+ 'playpause': 0xb3, # VK_MEDIA_PLAY_PAUSE
+ 'launchmail': 0xb4, # VK_LAUNCH_MAIL
+ 'launchmediaselect': 0xb5, # VK_LAUNCH_MEDIA_SELECT
+ 'launchapp1': 0xb6, # VK_LAUNCH_APP1
+ 'launchapp2': 0xb7, # VK_LAUNCH_APP2
+ #';': 0xba, # VK_OEM_1
+ #'+': 0xbb, # VK_OEM_PLUS
+ #',': 0xbc, # VK_OEM_COMMA
+ #'-': 0xbd, # VK_OEM_MINUS
+ #'.': 0xbe, # VK_OEM_PERIOD
+ #'/': 0xbf, # VK_OEM_2
+ #'~': 0xc0, # VK_OEM_3
+ #'[': 0xdb, # VK_OEM_4
+ #'|': 0xdc, # VK_OEM_5
+ #']': 0xdd, # VK_OEM_6
+ #"'": 0xde, # VK_OEM_7
+ #'': 0xdf, # VK_OEM_8
+ #'': 0xe7, # VK_PACKET
+ #'': 0xf6, # VK_ATTN
+ #'': 0xf7, # VK_CRSEL
+ #'': 0xf8, # VK_EXSEL
+ #'': 0xf9, # VK_EREOF
+ #'': 0xfa, # VK_PLAY
+ #'': 0xfb, # VK_ZOOM
+ #'': 0xfc, # VK_NONAME
+ #'': 0xfd, # VK_PA1
+ #'': 0xfe, # VK_OEM_CLEAR
+})
+
+# Populate the basic printable ascii characters.
+for c in range(32, 128):
+ keyboardMapping[chr(c)] = ctypes.windll.user32.VkKeyScanA(ctypes.wintypes.WCHAR(chr(c)))
+
+
+def _keyDown(key):
+ """Performs a keyboard key press without the release. This will put that
+ key in a held down state.
+
+ NOTE: For some reason, this does not seem to cause key repeats like would
+ happen if a keyboard key was held down on a text field.
+
+ Args:
+ key (str): The key to be pressed down. The valid names are listed in
+ pyautogui.KEY_NAMES.
+
+ Returns:
+ None
+ """
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ needsShift = pyautogui.isShiftCharacter(key)
+
+ """
+ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start.
+ if key in keyboardMapping.keys():
+ vkCode = keyboardMapping[key]
+ elif len(key) == 1:
+ # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce.
+ vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key))
+ if vkCode == -1:
+ raise ValueError('There is no VK code for key "%s"' % (key))
+ if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift
+ vkCode -= 0x100
+ needsShift = True
+ """
+ mods, vkCode = divmod(keyboardMapping[key], 0x100)
+
+ for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11),
+ (mods & 1 or needsShift, 0x10)]: #HANKAKU not suported! mods & 8
+ if apply_mod:
+ ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) #
+ ctypes.windll.user32.keybd_event(vkCode, 0, 0, 0)
+ for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11),
+ (mods & 4, 0x12)]: #HANKAKU not suported! mods & 8
+ if apply_mod:
+ ctypes.windll.user32.keybd_event(vk_mod, 0, KEYEVENTF_KEYUP, 0) #
+
+
+def _keyUp(key):
+ """Performs a keyboard key release (without the press down beforehand).
+
+ Args:
+ key (str): The key to be released up. The valid names are listed in
+ pyautogui.KEY_NAMES.
+
+ Returns:
+ None
+ """
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ needsShift = pyautogui.isShiftCharacter(key)
+ """
+ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start.
+ if key in keyboardMapping.keys():
+ vkCode = keyboardMapping[key]
+ elif len(key) == 1:
+ # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce.
+ vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key))
+ if vkCode == -1:
+ raise ValueError('There is no VK code for key "%s"' % (key))
+ if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift
+ vkCode -= 0x100
+ needsShift = True
+ """
+ mods, vkCode = divmod(keyboardMapping[key], 0x100)
+
+ for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11),
+ (mods & 1 or needsShift, 0x10)]: #HANKAKU not suported! mods & 8
+ if apply_mod:
+ ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) #
+ ctypes.windll.user32.keybd_event(vkCode, 0, KEYEVENTF_KEYUP, 0)
+ for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11),
+ (mods & 4, 0x12)]: #HANKAKU not suported! mods & 8
+ if apply_mod:
+ ctypes.windll.user32.keybd_event(vk_mod, 0, KEYEVENTF_KEYUP, 0) #
+
+
+def _position():
+ """Returns the current xy coordinates of the mouse cursor as a two-integer
+ tuple by calling the GetCursorPos() win32 function.
+
+ Returns:
+ (x, y) tuple of the current xy coordinates of the mouse cursor.
+ """
+
+ cursor = POINT()
+ ctypes.windll.user32.GetCursorPos(ctypes.byref(cursor))
+ return (cursor.x, cursor.y)
+
+
+def _size():
+ """Returns the width and height of the screen as a two-integer tuple.
+
+ Returns:
+ (width, height) tuple of the screen size, in pixels.
+ """
+ return (ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1))
+
+
+def _moveTo(x, y):
+ """Send the mouse move event to Windows by calling SetCursorPos() win32
+ function.
+
+ Args:
+ button (str): The mouse button, either 'left', 'middle', or 'right'
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+
+ Returns:
+ None
+ """
+ ctypes.windll.user32.SetCursorPos(x, y)
+
+
+def _mouseDown(x, y, button):
+ """Send the mouse down event to Windows by calling the mouse_event() win32
+ function.
+
+ Args:
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+ button (str): The mouse button, either 'left', 'middle', or 'right'
+
+ Returns:
+ None
+ """
+ if button == 'left':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_LEFTDOWN, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'middle':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_MIDDLEDOWN, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'right':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_RIGHTDOWN, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+
+def _mouseUp(x, y, button):
+ """Send the mouse up event to Windows by calling the mouse_event() win32
+ function.
+
+ Args:
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+ button (str): The mouse button, either 'left', 'middle', or 'right'
+
+ Returns:
+ None
+ """
+ if button == 'left':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_LEFTUP, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'middle':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_MIDDLEUP, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'right':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_RIGHTUP, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+
+def _click(x, y, button):
+ """Send the mouse click event to Windows by calling the mouse_event() win32
+ function.
+
+ Args:
+ button (str): The mouse button, either 'left', 'middle', or 'right'
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+
+ Returns:
+ None
+ """
+ if button == 'left':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_LEFTCLICK, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'middle':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_MIDDLECLICK, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ elif button == 'right':
+ try:
+ _sendMouseEvent(MOUSEEVENTF_RIGHTCLICK, x, y)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+ else:
+ assert False, "button argument not in ('left', 'middle', 'right')"
+
+
+def _sendMouseEvent(ev, x, y, dwData=0):
+ """The helper function that actually makes the call to the mouse_event()
+ win32 function.
+
+ Args:
+ ev (int): The win32 code for the mouse event. Use one of the MOUSEEVENTF_*
+ constants for this argument.
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+ dwData (int): The argument for mouse_event()'s dwData parameter. So far
+ this is only used by mouse scrolling.
+
+ Returns:
+ None
+ """
+ assert x != None and y != None, 'x and y cannot be set to None'
+ # TODO: ARG! For some reason, SendInput isn't working for mouse events. I'm switching to using the older mouse_event win32 function.
+ #mouseStruct = MOUSEINPUT()
+ #mouseStruct.dx = x
+ #mouseStruct.dy = y
+ #mouseStruct.mouseData = ev
+ #mouseStruct.time = 0
+ #mouseStruct.dwExtraInfo = ctypes.pointer(ctypes.c_ulong(0)) # according to https://stackoverflow.com/questions/13564851/generate-keyboard-events I can just set this. I don't really care about this value.
+ #inputStruct = INPUT()
+ #inputStruct.mi = mouseStruct
+ #inputStruct.type = INPUT_MOUSE
+ #ctypes.windll.user32.SendInput(1, ctypes.pointer(inputStruct), ctypes.sizeof(inputStruct))
+
+ width, height = _size()
+ convertedX = 65536 * x // width + 1
+ convertedY = 65536 * y // height + 1
+ ctypes.windll.user32.mouse_event(ev, ctypes.c_long(convertedX), ctypes.c_long(convertedY), dwData, 0)
+
+ # TODO: Too many false positives with this code: See: https://github.com/asweigart/pyautogui/issues/108
+ #if ctypes.windll.kernel32.GetLastError() != 0:
+ # raise ctypes.WinError()
+
+
+def _scroll(clicks, x=None, y=None):
+ """Send the mouse vertical scroll event to Windows by calling the
+ mouse_event() win32 function.
+
+ Args:
+ clicks (int): The amount of scrolling to do. A positive value is the mouse
+ wheel moving forward (scrolling up), a negative value is backwards (down).
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+
+ Returns:
+ None
+ """
+ startx, starty = _position()
+ width, height = _size()
+
+ if x is None:
+ x = startx
+ else:
+ if x < 0:
+ x = 0
+ elif x >= width:
+ x = width - 1
+ if y is None:
+ y = starty
+ else:
+ if y < 0:
+ y = 0
+ elif y >= height:
+ y = height - 1
+
+ try:
+ _sendMouseEvent(MOUSEEVENTF_WHEEL, x, y, dwData=clicks)
+ except (PermissionError, OSError): # TODO: We need to figure out how to prevent these errors, see https://github.com/asweigart/pyautogui/issues/60
+ pass
+
+
+def _hscroll(clicks, x, y):
+ """Send the mouse horizontal scroll event to Windows by calling the
+ mouse_event() win32 function.
+
+ Args:
+ clicks (int): The amount of scrolling to do. A positive value is the mouse
+ wheel moving right, a negative value is moving left.
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+
+ Returns:
+ None
+ """
+ return _scroll(clicks, x, y)
+
+
+def _vscroll(clicks, x, y):
+ """A wrapper for _scroll(), which does vertical scrolling.
+
+ Args:
+ clicks (int): The amount of scrolling to do. A positive value is the mouse
+ wheel moving forward (scrolling up), a negative value is backwards (down).
+ x (int): The x position of the mouse event.
+ y (int): The y position of the mouse event.
+
+ Returns:
+ None
+ """
+ return _scroll(clicks, x, y)
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_x11.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_x11.py
new file mode 100644
index 00000000..1256f5fe
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_pyautogui_x11.py
@@ -0,0 +1,298 @@
+# NOTE - It is a known issue that the keyboard-related functions don't work on Ubuntu VMs in Virtualbox.
+
+import pyautogui
+import sys
+import os
+
+from Xlib.display import Display
+from Xlib import X
+from Xlib.ext.xtest import fake_input
+import Xlib.XK
+
+BUTTON_NAME_MAPPING = {'left': 1, 'middle': 2, 'right': 3, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7}
+
+
+if sys.platform in ('java', 'darwin', 'win32'):
+ raise Exception('The pyautogui_x11 module should only be loaded on a Unix system that supports X11.')
+
+#from pyautogui import *
+
+"""
+Much of this code is based on information gleaned from Paul Barton's PyKeyboard in PyUserInput from 2013, itself derived from Akkana Peck's pykey in 2008 ( http://www.shallowsky.com/software/crikey/pykey-0.1 ), itself derived from her "Crikey" lib.
+"""
+
+def _position():
+ """Returns the current xy coordinates of the mouse cursor as a two-integer
+ tuple.
+
+ Returns:
+ (x, y) tuple of the current xy coordinates of the mouse cursor.
+ """
+ coord = _display.screen().root.query_pointer()._data
+ return coord["root_x"], coord["root_y"]
+
+
+def _size():
+ return _display.screen().width_in_pixels, _display.screen().height_in_pixels
+
+
+
+def _vscroll(clicks, x=None, y=None):
+ clicks = int(clicks)
+ if clicks == 0:
+ return
+ elif clicks > 0:
+ button = 4 # scroll up
+ else:
+ button = 5 # scroll down
+
+ for i in range(abs(clicks)):
+ _click(x, y, button=button)
+
+
+def _hscroll(clicks, x=None, y=None):
+ clicks = int(clicks)
+ if clicks == 0:
+ return
+ elif clicks > 0:
+ button = 7 # scroll right
+ else:
+ button = 6 # scroll left
+
+ for i in range(abs(clicks)):
+ _click(x, y, button=button)
+
+
+def _scroll(clicks, x=None, y=None):
+ return _vscroll(clicks, x, y)
+
+
+def _click(x, y, button):
+ assert button in BUTTON_NAME_MAPPING.keys(), "button argument not in ('left', 'middle', 'right', 4, 5, 6, 7)"
+ button = BUTTON_NAME_MAPPING[button]
+
+ _mouseDown(x, y, button)
+ _mouseUp(x, y, button)
+
+
+def _moveTo(x, y):
+ fake_input(_display, X.MotionNotify, x=x, y=y)
+ _display.sync()
+
+
+def _mouseDown(x, y, button):
+ _moveTo(x, y)
+ assert button in BUTTON_NAME_MAPPING.keys(), "button argument not in ('left', 'middle', 'right', 4, 5, 6, 7)"
+ button = BUTTON_NAME_MAPPING[button]
+ fake_input(_display, X.ButtonPress, button)
+ _display.sync()
+
+
+def _mouseUp(x, y, button):
+ _moveTo(x, y)
+ assert button in BUTTON_NAME_MAPPING.keys(), "button argument not in ('left', 'middle', 'right', 4, 5, 6, 7)"
+ button = BUTTON_NAME_MAPPING[button]
+ fake_input(_display, X.ButtonRelease, button)
+ _display.sync()
+
+
+def _keyDown(key):
+ """Performs a keyboard key press without the release. This will put that
+ key in a held down state.
+
+ NOTE: For some reason, this does not seem to cause key repeats like would
+ happen if a keyboard key was held down on a text field.
+
+ Args:
+ key (str): The key to be pressed down. The valid names are listed in
+ pyautogui.KEY_NAMES.
+
+ Returns:
+ None
+ """
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ if type(key) == int:
+ fake_input(_display, X.KeyPress, key)
+ _display.sync()
+ return
+
+ needsShift = pyautogui.isShiftCharacter(key)
+ if needsShift:
+ fake_input(_display, X.KeyPress, keyboardMapping['shift'])
+
+ fake_input(_display, X.KeyPress, keyboardMapping[key])
+
+ if needsShift:
+ fake_input(_display, X.KeyRelease, keyboardMapping['shift'])
+ _display.sync()
+
+
+def _keyUp(key):
+ """Performs a keyboard key release (without the press down beforehand).
+
+ Args:
+ key (str): The key to be released up. The valid names are listed in
+ pyautogui.KEY_NAMES.
+
+ Returns:
+ None
+ """
+
+ """
+ Release a given character key. Also works with character keycodes as
+ integers, but not keysyms.
+ """
+ if key not in keyboardMapping or keyboardMapping[key] is None:
+ return
+
+ if type(key) == int:
+ keycode = key
+ else:
+ keycode = keyboardMapping[key]
+
+ fake_input(_display, X.KeyRelease, keycode)
+ _display.sync()
+
+
+# Taken from PyKeyboard's ctor function.
+_display = Display(os.environ['DISPLAY'])
+
+
+""" Information for keyboardMapping derived from PyKeyboard's special_key_assignment() function.
+
+The *KB dictionaries in pyautogui map a string that can be passed to keyDown(),
+keyUp(), or press() into the code used for the OS-specific keyboard function.
+
+They should always be lowercase, and the same keys should be used across all OSes."""
+keyboardMapping = dict([(key, None) for key in pyautogui.KEY_NAMES])
+keyboardMapping.update({
+ 'backspace': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
+ '\b': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('BackSpace')),
+ 'tab': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
+ 'enter': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
+ 'return': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
+ 'shift': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
+ 'ctrl': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
+ 'alt': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
+ 'pause': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Pause')),
+ 'capslock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Caps_Lock')),
+ 'esc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
+ 'escape': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
+ 'pgup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
+ 'pgdn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
+ 'pageup': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Up')),
+ 'pagedown': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Page_Down')),
+ 'end': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('End')),
+ 'home': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Home')),
+ 'left': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Left')),
+ 'up': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Up')),
+ 'right': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Right')),
+ 'down': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Down')),
+ 'select': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Select')),
+ 'print': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
+ 'execute': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Execute')),
+ 'prtsc': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
+ 'prtscr': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
+ 'prntscrn': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
+ 'printscreen': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Print')),
+ 'insert': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Insert')),
+ 'del': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
+ 'delete': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Delete')),
+ 'help': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Help')),
+ 'winleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
+ 'winright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_R')),
+ 'apps': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Super_L')),
+ 'num0': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_0')),
+ 'num1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_1')),
+ 'num2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_2')),
+ 'num3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_3')),
+ 'num4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_4')),
+ 'num5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_5')),
+ 'num6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_6')),
+ 'num7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_7')),
+ 'num8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_8')),
+ 'num9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_9')),
+ 'multiply': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Multiply')),
+ 'add': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Add')),
+ 'separator': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Separator')),
+ 'subtract': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Subtract')),
+ 'decimal': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Decimal')),
+ 'divide': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('KP_Divide')),
+ 'f1': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F1')),
+ 'f2': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F2')),
+ 'f3': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F3')),
+ 'f4': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F4')),
+ 'f5': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F5')),
+ 'f6': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F6')),
+ 'f7': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F7')),
+ 'f8': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F8')),
+ 'f9': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F9')),
+ 'f10': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F10')),
+ 'f11': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F11')),
+ 'f12': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F12')),
+ 'f13': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F13')),
+ 'f14': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F14')),
+ 'f15': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F15')),
+ 'f16': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F16')),
+ 'f17': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F17')),
+ 'f18': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F18')),
+ 'f19': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F19')),
+ 'f20': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F20')),
+ 'f21': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F21')),
+ 'f22': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F22')),
+ 'f23': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F23')),
+ 'f24': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('F24')),
+ 'numlock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Num_Lock')),
+ 'scrolllock': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Scroll_Lock')),
+ 'shiftleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_L')),
+ 'shiftright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Shift_R')),
+ 'ctrlleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_L')),
+ 'ctrlright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Control_R')),
+ 'altleft': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_L')),
+ 'altright': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Alt_R')),
+ # These are added because unlike a-zA-Z0-9, the single characters do not have a
+ ' ': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
+ 'space': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('space')),
+ '\t': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Tab')),
+ '\n': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')), # for some reason this needs to be cr, not lf
+ '\r': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Return')),
+ '\e': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('Escape')),
+ '!': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('exclam')),
+ '#': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('numbersign')),
+ '%': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('percent')),
+ '$': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('dollar')),
+ '&': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('ampersand')),
+ '"': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('quotedbl')),
+ "'": _display.keysym_to_keycode(Xlib.XK.string_to_keysym('apostrophe')),
+ '(': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenleft')),
+ ')': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('parenright')),
+ '*': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asterisk')),
+ '=': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('equal')),
+ '+': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('plus')),
+ ',': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('comma')),
+ '-': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('minus')),
+ '.': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('period')),
+ '/': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('slash')),
+ ':': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('colon')),
+ ';': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('semicolon')),
+ '<': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('less')),
+ '>': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('greater')),
+ '?': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('question')),
+ '@': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('at')),
+ '[': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketleft')),
+ ']': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bracketright')),
+ '\\': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('backslash')),
+ '^': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciicircum')),
+ '_': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('underscore')),
+ '`': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('grave')),
+ '{': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceleft')),
+ '|': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('bar')),
+ '}': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('braceright')),
+ '~': _display.keysym_to_keycode(Xlib.XK.string_to_keysym('asciitilde')),
+})
+
+# Trading memory for time" populate winKB so we don't have to call VkKeyScanA each time.
+for c in """abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""":
+ keyboardMapping[c] = _display.keysym_to_keycode(Xlib.XK.string_to_keysym(c))
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_window_win.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_window_win.py
new file mode 100644
index 00000000..b68e4fe7
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/_window_win.py
@@ -0,0 +1,117 @@
+# Window-handling features of PyAutoGUI for win_32
+import ctypes
+import ctypes.wintypes
+
+import sys
+if sys.platform != 'win32':
+ raise Exception('The _window_win module should only be loaded on a Windows system.')
+
+SetWindowPos = ctypes.windll.user32.SetWindowPos
+# Flags for SetWindowPos:
+SWP_NOMOVE = ctypes.c_uint(0x0002)
+SWP_NOSIZE = ctypes.c_uint(0x0001)
+
+ShowWindow = ctypes.windll.user32.ShowWindow
+# Flags for ShowWindow:
+SW_MAXIMIZE = 3
+SW_MINIMIZE = 6
+SW_RESTORE = 9
+
+SwitchToThisWindow = ctypes.windll.user32.SwitchToThisWindow
+SetForegroundWindow = ctypes.windll.user32.SetForegroundWindow
+CloseWindow = ctypes.windll.user32.CloseWindow
+GetWindowRect = ctypes.windll.user32.GetWindowRect
+
+EnumWindows = ctypes.windll.user32.EnumWindows
+EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
+GetWindowText = ctypes.windll.user32.GetWindowTextW
+GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
+IsWindowVisible = ctypes.windll.user32.IsWindowVisible
+
+
+class _Rect(ctypes.Structure):
+ _fields_ = [('left', ctypes.c_long),
+ ('top', ctypes.c_long),
+ ('right', ctypes.c_long),
+ ('bottom', ctypes.c_long)]
+
+
+class Window(object):
+
+ def __init__(self, hwnd):
+ self._hwnd = hwnd # Window handle
+
+ def set_position(self, x, y, width, height):
+ """Set window top-left corner position and size"""
+ SetWindowPos(self._hwnd, None, x, y, width, height, ctypes.c_uint(0))
+
+ def move(self, x, y):
+ """Move window top-left corner to position"""
+ SetWindowPos(self._hwnd, None, x, y, 0, 0, SWP_NOSIZE)
+
+ def resize(self, width, height):
+ """Change window size"""
+ SetWindowPos(self._hwnd, None, 0, 0, width, height, SWP_NOMOVE)
+
+ def maximize(self):
+ ShowWindow(self._hwnd, SW_MAXIMIZE)
+
+ def set_foreground(self):
+ SetForegroundWindow(self._hwnd)
+
+ def minimize(self):
+ ShowWindow(self._hwnd, SW_MINIMIZE)
+
+ def restore(self):
+ ShowWindow(self._hwnd, SW_RESTORE)
+
+ def close(self):
+ CloseWindow(self._hwnd)
+
+ def get_position(self):
+ """Returns tuple of 4 numbers: (x, y)s of top-left and bottom-right corners"""
+ rect = _Rect()
+ GetWindowRect(self._hwnd, ctypes.pointer(rect))
+ return rect.left, rect.top, rect.right, rect.bottom
+
+ # def moveRel(self, x=0, y=0): # moves relative to the x, y of top-left corner of the window
+ # pass
+ # def clickRel(self, x=0, y=0, clicks=1, interval=0.0, button='left'):
+ # click relative to the x, y of top-left corner of the window
+ # pass
+
+
+def getWindows(): #https://sjohannes.wordpress.com/2012/03/23/win32-python-getting-all-window-titles/
+ """Return dict: {'window title' : window handle} for all visible windows"""
+ titles = {}
+
+ def foreach_window(hwnd, lparam):
+ if IsWindowVisible(hwnd):
+ length = GetWindowTextLength(hwnd)
+ buff = ctypes.create_unicode_buffer(length + 1)
+ GetWindowText(hwnd, buff, length + 1)
+ titles[buff.value] = hwnd
+ return True
+ EnumWindows(EnumWindowsProc(foreach_window), 0)
+
+ return titles
+
+def getWindow(title, exact=False):
+ """Return Window object if 'title' or its part found in visible windows titles, else return None
+
+ Return only 1 window found first
+ Args:
+ title: unicode string
+ exact (bool): True if search only exact match
+ """
+ titles = getWindows()
+ hwnd = titles.get(title, None)
+ if not hwnd and not exact:
+ for k, v in titles.items():
+ if title in k:
+ hwnd = v
+ break
+ if hwnd:
+ return Window(hwnd)
+ else:
+ return None
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/screenshotUtil.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/screenshotUtil.py
new file mode 100644
index 00000000..7e47bace
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/screenshotUtil.py
@@ -0,0 +1,217 @@
+# Screenshot-related features of PyAutoGUI
+
+"""
+So, apparently Pillow support on Ubuntu 64-bit has several additional steps since it doesn't have JPEG/PNG support out of the box. Description here:
+
+https://stackoverflow.com/questions/7648200/pip-install-pil-e-tickets-1-no-jpeg-png-support
+http://ubuntuforums.org/showthread.php?t=1751455
+"""
+
+import datetime
+import os
+import subprocess
+import sys
+from PIL import Image
+from PIL import ImageOps
+
+RUNNING_PYTHON_2 = sys.version_info[0] == 2
+
+scrotExists = False
+maimExists = False
+try:
+ if sys.platform not in ('java', 'darwin', 'win32'):
+ whichProc = subprocess.Popen(['which', 'scrot'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ scrotExists = whichProc.wait() == 0
+except:
+ # if there is no "which" program to find scrot, then assume there is no scrot.
+ pass
+
+try:
+ if sys.platform not in ('java', 'darwin', 'win32'):
+ whichProc = subprocess.Popen(['which', 'maim'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ maimExists = whichProc.wait() == 0
+except:
+ # if there is no "which" program to find maim, then assume there is no maim.
+ pass
+
+def locateAll(needleImage, haystackImage, grayscale=False, limit=None):
+ needleFileObj = None
+ haystackFileObj = None
+ if isinstance(needleImage, str):
+ # 'image' is a filename, load the Image object
+ needleFileObj = open(needleImage, 'rb')
+ needleImage = Image.open(needleFileObj)
+ if isinstance(haystackImage, str):
+ # 'image' is a filename, load the Image object
+ haystackFileObj = open(haystackImage, 'rb')
+ haystackImage = Image.open(haystackFileObj)
+
+
+ if grayscale:
+ needleImage = ImageOps.grayscale(needleImage)
+ haystackImage = ImageOps.grayscale(haystackImage)
+
+ needleWidth, needleHeight = needleImage.size
+ haystackWidth, haystackHeight = haystackImage.size
+
+ needleImageData = tuple(needleImage.getdata()) # TODO - rename to needleImageData??
+ haystackImageData = tuple(haystackImage.getdata())
+
+ needleImageRows = [needleImageData[y * needleWidth:(y+1) * needleWidth] for y in range(needleHeight)] # LEFT OFF - check this
+ needleImageFirstRow = needleImageRows[0]
+
+ assert len(needleImageFirstRow) == needleWidth
+ assert [len(row) for row in needleImageRows] == [needleWidth] * needleHeight
+
+ numMatchesFound = 0
+
+ for y in range(haystackHeight):
+ for matchx in _kmp(needleImageFirstRow, haystackImageData[y * haystackWidth:(y+1) * haystackWidth]):
+ foundMatch = True
+ for searchy in range(1, needleHeight):
+ haystackStart = (searchy + y) * haystackWidth + matchx
+ if needleImageData[searchy * needleWidth:(searchy+1) * needleWidth] != haystackImageData[haystackStart:haystackStart + needleWidth]:
+ foundMatch = False
+ break
+ if foundMatch:
+ # Match found, report the x, y, width, height of where the matching region is in haystack.
+ numMatchesFound += 1
+ yield (matchx, y, needleWidth, needleHeight)
+ if limit is not None and numMatchesFound >= limit:
+ # Limit has been reached. Close file handles.
+ if needleFileObj is not None:
+ needleFileObj.close()
+ if haystackFileObj is not None:
+ haystackFileObj.close()
+
+
+ # There was no limit or the limit wasn't reached, but close the file handles anyway.
+ if needleFileObj is not None:
+ needleFileObj.close()
+ if haystackFileObj is not None:
+ haystackFileObj.close()
+
+
+def locate(needleImage, haystackImage, grayscale=False):
+ # Note: The gymnastics in this function is because we want to make sure to exhaust the iterator so that the needle and haystack files are closed in locateAll.
+ points = tuple(locateAll(needleImage, haystackImage, grayscale, 1))
+ if len(points) > 0:
+ return points[0]
+ else:
+ return None
+
+
+def locateOnScreen(image, grayscale=False,region=None):
+ screenshotIm = screenshot(region=region)
+ retVal = locate(image, screenshotIm, grayscale)
+ if 'fp' in dir(screenshotIm) and screenshotIm.fp is not None:
+ screenshotIm.fp.close() # Screenshots on Windows won't have an fp since they came from ImageGrab, not a file.
+ return retVal
+
+
+def locateAllOnScreen(image, grayscale=False, limit=None, region=None):
+ screenshotIm = screenshot(region=region)
+ retVal = locateAll(image, screenshotIm, grayscale, limit)
+ if 'fp' in dir(screenshotIm) and screenshotIm.fp is not None:
+ screenshotIm.fp.close() # Screenshots on Windows won't have an fp since they came from ImageGrab, not a file.
+ return retVal
+
+
+def locateCenterOnScreen(image, grayscale=False, region=None):
+ return center(locateOnScreen(image, grayscale, region))
+
+
+def _screenshot_win32(imageFilename=None):
+ im = ImageGrab.grab()
+ if imageFilename is not None:
+ im.save(imageFilename)
+ return im
+
+
+def _screenshot_osx(imageFilename=None):
+ if imageFilename is None:
+ tmpFilename = 'screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))
+ else:
+ tmpFilename = imageFilename
+ subprocess.call(['screencapture', '-x', tmpFilename])
+ im = Image.open(tmpFilename)
+ if imageFilename is None:
+ os.unlink(tmpFilename)
+ return im
+
+
+def _screenshot_linux(imageFilename=None, region=None):
+ if not scrotExists:
+ raise NotImplementedError('"scrot" must be installed to use screenshot functions in Linux. Run: sudo apt-get install scrot')
+ if imageFilename is None:
+ tmpFilename = '.screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))
+ else:
+ tmpFilename = imageFilename
+ if scrotExists:
+ if not region:
+ subprocess.call(['scrot', tmpFilename])
+ else:
+ if not maimExists:
+ raise NotImplementedError('"maim" must be installed to use screenshot functions with region in Linux. Run: sudo apt-get install maim')
+ left,top,width,height = [str(x) for x in region]
+ subprocess.call(['maim','-x',left,'-y',top,'-w',width,'-h',height, tmpFilename])
+ im = Image.open(tmpFilename)
+ if imageFilename is None:
+ os.unlink(tmpFilename)
+ return im
+
+ else:
+ raise Exception('The scrot program must be installed to take a screenshot with PyAutoGUI on Linux. Run: sudo apt-get install scrot')
+
+
+
+def _kmp(needle, haystack): # Knuth-Morris-Pratt search algorithm implementation (to be used by screen capture)
+ # build table of shift amounts
+ shifts = [1] * (len(needle) + 1)
+ shift = 1
+ for pos in range(len(needle)):
+ while shift <= pos and needle[pos] != needle[pos-shift]:
+ shift += shifts[pos-shift]
+ shifts[pos+1] = shift
+
+ # do the actual search
+ startPos = 0
+ matchLen = 0
+ for c in haystack:
+ while matchLen == len(needle) or \
+ matchLen >= 0 and needle[matchLen] != c:
+ startPos += shifts[matchLen]
+ matchLen -= shifts[matchLen]
+ matchLen += 1
+ if matchLen == len(needle):
+ yield startPos
+
+
+def center(coords):
+ return (coords[0] + int(coords[2] / 2), coords[1] + int(coords[3] / 2))
+
+
+def pixelMatchesColor(x, y, expectedRGBColor, tolerance=0):
+ r, g, b = screenshot().getpixel((x, y))
+ exR, exG, exB = expectedRGBColor
+
+ return (abs(r - exR) <= tolerance) and (abs(g - exG) <= tolerance) and (abs(b - exB) <= tolerance)
+
+
+def pixel(x, y):
+ return screenshot().getpixel((x, y))
+
+
+# set the screenshot() function based on the platform running this module
+if sys.platform.startswith('java'):
+ raise NotImplementedError('Jython is not yet supported by PyAutoGUI.')
+elif sys.platform == 'darwin':
+ screenshot = _screenshot_osx
+elif sys.platform == 'win32':
+ screenshot = _screenshot_win32
+ from PIL import ImageGrab
+else:
+ screenshot = _screenshot_linux
+
+
+grab = screenshot # for compatibility with Pillow/PIL's ImageGrab module.
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/test1.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/test1.py
new file mode 100644
index 00000000..a5d5c203
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/test1.py
@@ -0,0 +1,9 @@
+@property
+def foo():
+ return _foo
+
+@foo.setter
+def foo(value):
+ _foo = value
+
+_foo = 'foo'
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/tweens.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/tweens.py
new file mode 100644
index 00000000..f884cf75
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyautogui/tweens.py
@@ -0,0 +1,36 @@
+import pytweening
+
+
+# This is just left here for backwards compatibility. I'll be deprecating this in favor of pyautogui.linear, pyautogui.easeInQuad, etc.
+getPointOnLine = pytweening.getPointOnLine
+linear = pytweening.linear
+easeInQuad = pytweening.easeInQuad
+easeOutQuad = pytweening.easeOutQuad
+easeInOutQuad = pytweening.easeInOutQuad
+easeInCubic = pytweening.easeInCubic
+easeOutCubic = pytweening.easeOutCubic
+easeInOutCubic = pytweening.easeInOutCubic
+easeInQuart = pytweening.easeInQuart
+easeOutQuart = pytweening.easeOutQuart
+easeInOutQuart = pytweening.easeInOutQuart
+easeInQuint = pytweening.easeInQuint
+easeOutQuint = pytweening.easeOutQuint
+easeInOutQuint = pytweening.easeInOutQuint
+easeInSine = pytweening.easeInSine
+easeOutSine = pytweening.easeOutSine
+easeInOutSine = pytweening.easeInOutSine
+easeInExpo = pytweening.easeInExpo
+easeOutExpo = pytweening.easeOutExpo
+easeInOutExpo = pytweening.easeInOutExpo
+easeInCirc = pytweening.easeInCirc
+easeOutCirc = pytweening.easeOutCirc
+easeInOutCirc = pytweening.easeInOutCirc
+easeInElastic = pytweening.easeInElastic
+easeOutElastic = pytweening.easeOutElastic
+easeInOutElastic = pytweening.easeInOutElastic
+easeInBack = pytweening.easeInBack
+easeOutBack = pytweening.easeOutBack
+easeInOutBack = pytweening.easeInOutBack
+easeInBounce = pytweening.easeInBounce
+easeOutBounce = pytweening.easeOutBounce
+easeInOutBounce = pytweening.easeInOutBounce
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/__init__.py
new file mode 100644
index 00000000..376a48c2
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/__init__.py
@@ -0,0 +1,50 @@
+# PyGetWindow
+# A cross-platform module to find information about the windows on the screen.
+
+"""
+
+# Work in progress
+
+# Useful info:
+#https://stackoverflow.com/questions/373020/finding-the-current-active-window-in-mac-os-x-using-python
+#https://stackoverflow.com/questions/7142342/get-window-position-size-with-python
+
+
+win32 api and ctypes on Windows
+cocoa api and pyobjc on Mac
+Xlib on linux
+
+
+Possible Future Features:
+get/click menu (win32: GetMenuItemCount, GetMenuItemInfo, GetMenuItemID, GetMenu, GetMenuItemRect)
+"""
+
+__version__ = '0.0.5'
+
+import sys
+import collections
+
+
+class PyGetWindowException(Exception):
+ pass
+
+
+def pointInRect(x, y, left, top, width, height):
+ return left < x < left + width and top < y < top + height
+
+
+if sys.platform == 'darwin':
+ raise NotImplementedError('PyGetWindow currently does not support macOS. If you have Appkit/Cocoa knowledge, please contribute! https://github.com/asweigart/pygetwindow') # TODO - implement mac
+elif sys.platform == 'win32':
+ from ._pygetwindow_win import Win32Window, getActiveWindow, getWindowsAt, getWindowsWithTitle, getAllWindows, getAllTitles
+ Window = Win32Window
+else:
+ raise NotImplementedError('PyGetWindow currently does not support Linux. If you have Xlib knowledge, please contribute! https://github.com/asweigart/pygetwindow')
+
+
+# NOTE: `Rect` is a named tuple for use in Python, while structs.RECT represents
+# the win32 RECT struct. PyRect's Rect class is used for handling changing
+# geometry of rectangular areas.
+Rect = collections.namedtuple('Rect', 'left top right bottom')
+Point = collections.namedtuple('Point', 'x y')
+Size = collections.namedtuple('Size', 'width height')
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_macos.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_macos.py
new file mode 100644
index 00000000..73e57a88
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_macos.py
@@ -0,0 +1,388 @@
+import Quartz
+import pygetwindow
+
+
+def getAllTitles():
+ """Returns a list of strings of window titles for all visible windows.
+ """
+
+ # Source: https://stackoverflow.com/questions/53237278/obtain-list-of-all-window-titles-on-macos-from-a-python-script/53985082#53985082
+ windows = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListExcludeDesktopElements | Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID)
+ return ['%s %s' % (win[Quartz.kCGWindowOwnerName], win.get(Quartz.kCGWindowName, '')) for win in windows]
+
+
+def getFocusedWindow():
+ """Returns a Window object of the currently focused Window."""
+
+ # Source: https://stackoverflow.com/questions/5286274/front-most-window-using-cgwindowlistcopywindowinfo
+ windows = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListExcludeDesktopElements | Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID)
+ for win in windows:
+ if win['kCGWindowLayer'] == 0:
+ return '%s %s' % (win[Quartz.kCGWindowOwnerName], win.get(Quartz.kCGWindowName, '')) # Temporary. For now, we'll just return the title of the focused window.
+ raise Exception('Could not find a focused window.') # Temporary hack.
+
+
+def getWindowsAt(x, y):
+ windows = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListExcludeDesktopElements | Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID)
+ matches = []
+ for win in windows:
+ w = win['kCGWindowBounds']
+ if pygetwindow.pointInRect(x, y, w['X'], w['Y'], w['Width'], w['Height']):
+ matches.append('%s %s' % (win[Quartz.kCGWindowOwnerName], win.get(Quartz.kCGWindowName, '')))
+ return matches
+
+
+
+def focusWindow():
+ # TEMP - this is not a real api, I'm just using this name to store these notes for now.
+
+ # Source: https://stackoverflow.com/questions/7460092/nswindow-makekeyandorderfront-makes-window-appear-but-not-key-or-front?rq=1
+ # Source: https://stackoverflow.com/questions/4905024/is-it-possible-to-bring-window-to-front-without-taking-focus?rq=1
+ pass
+
+
+def getWindowGeometry(title):
+ # TEMP - this is not a real api, I'm just using this name to stoe these notes for now.
+ windows = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListExcludeDesktopElements | Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID)
+ for win in windows:
+ if title in '%s %s' % (win[Quartz.kCGWindowOwnerName], win.get(Quartz.kCGWindowName, '')):
+ w = win['kCGWindowBounds']
+ return (w['X'], w['Y'], w['Width'], w['Height'])
+
+
+def isVisible(title):
+ # TEMP - this is not a real api, I'm just using this name to stoe these notes for now.
+ windows = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListExcludeDesktopElements | Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID)
+ for win in windows:
+ if title in '%s %s' % (win[Quartz.kCGWindowOwnerName], win.get(Quartz.kCGWindowName, '')):
+ return win['kCGWindowAlpha'] != 0.0
+
+def isMinimized():
+ # TEMP - this is not a real api, I'm just using this name to stoe these notes for now.
+ # Source: https://stackoverflow.com/questions/10258676/how-to-know-whether-a-window-is-minimised-or-not
+ # Use the kCGWindowIsOnscreen to check this. Minimized windows are considered to not be on the screen. (But I'm not sure if there are other situations where a window is "off screen".)
+
+ # I'm not sure how kCGWindowListOptionOnScreenOnly interferes with this.
+ pass
+
+# TODO: This class doesn't work yet. I've copied the Win32Window class and will make adjustments as needed here.
+
+class MacOSWindow():
+ def __init__(self, hWnd):
+ self._hWnd = hWnd # TODO fix this, this is a LP_c_long insead of an int.
+
+ def _onRead(attrName):
+ r = _getWindowRect(self._hWnd)
+ self._rect._left = r.left # Setting _left directly to skip the onRead.
+ self._rect._top = r.top # Setting _top directly to skip the onRead.
+ self._rect._width = r.right - r.left # Setting _width directly to skip the onRead.
+ self._rect._height = r.bottom - r.top # Setting _height directly to skip the onRead.
+
+ def _onChange(oldBox, newBox):
+ self.moveTo(newBox.left, newBox.top)
+ self.resizeTo(newBox.width, newBox.height)
+
+ r = _getWindowRect(self._hWnd)
+ self._rect = pyrect.Rect(r.left, r.top, r.right - r.left, r.bottom - r.top, onChange=_onChange, onRead=_onRead)
+
+ def __str__(self):
+ r = _getWindowRect(self._hWnd)
+ width = r.right - r.left
+ height = r.bottom - r.top
+ return '<%s left="%s", top="%s", width="%s", height="%s", title="%s">' % (self.__class__.__name__, r.left, r.top, width, height, self.title)
+
+
+ def __repr__(self):
+ return '%s(hWnd=%s)' % (self.__class__.__name__, self._hWnd)
+
+
+ def __eq__(self, other):
+ return isinstance(other, Win32Window) and self._hWnd == other._hWnd
+
+
+ def close(self):
+ """Closes this window. This may trigger "Are you sure you want to
+ quit?" dialogs or other actions that prevent the window from
+ actually closing. This is identical to clicking the X button on the
+ window."""
+ result = ctypes.windll.user32.PostMessageA(self._hWnd, WM_CLOSE, 0, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def minimize(self):
+ """Minimizes this window."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_MINIMIZE)
+
+
+ def maximize(self):
+ """Maximizes this window."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_MAXIMIZE)
+
+
+ def restore(self):
+ """If maximized or minimized, restores the window to it's normal size."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_RESTORE)
+
+
+ def focus(self):
+ """Focus this window and make it the foreground window."""
+ result = ctypes.windll.user32.SetForegroundWindow(self._hWnd)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def resizeRel(self, widthOffset, heightOffset):
+ """Resizes the window relative to its current size."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left, self.top, self.width + widthOffset, self.height + heightOffset, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def resizeTo(self, newWidth, newHeight):
+ """Resizes the window to a new width and height."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left, self.top, newWidth, newHeight, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def moveRel(self, xOffset, yOffset):
+ """Moves the window relative to its current position."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left + xOffset, self.top + yOffset, self.width, self.height, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def moveTo(self, newLeft, newTop):
+ """Moves the window to new coordinates on the screen."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, newLeft, newTop, self.width, self.height, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ @property
+ def isMinimized(self):
+ """Returns True if the window is currently minimized."""
+ return ctypes.windll.user32.IsIconic(self._hWnd) != 0
+
+ @property
+ def isMaximized(self):
+ """Returns True if the window is currently maximized."""
+ return ctypes.windll.user32.IsZoomed(self._hWnd) != 0
+
+ @property
+ def isFocused(self):
+ """Returns True if the window is currently the focused, foreground window."""
+ return getFocusedWindow() == self
+
+ @property
+ def title(self):
+ """Returns the window title as a string."""
+ return _getWindowText(self._hWnd)
+
+ @property
+ def visible(self):
+ return isWindowVisible(self._hWnd)
+
+
+
+ # Wrappers for pyrect.Rect object's properties.
+ @property
+ def left(self):
+ return self._rect.left
+
+ @left.setter
+ def left(self, value):
+ #import pdb; pdb.set_trace()
+ self._rect.left # Run rect's onRead to update the Rect object.
+ self._rect.left = value
+
+
+ @property
+ def right(self):
+ return self._rect.right
+
+ @right.setter
+ def right(self, value):
+ self._rect.right # Run rect's onRead to update the Rect object.
+ self._rect.right = value
+
+
+ @property
+ def top(self):
+ return self._rect.top
+
+ @top.setter
+ def top(self, value):
+ self._rect.top # Run rect's onRead to update the Rect object.
+ self._rect.top = value
+
+
+ @property
+ def bottom(self):
+ return self._rect.bottom
+
+ @bottom.setter
+ def bottom(self, value):
+ self._rect.bottom # Run rect's onRead to update the Rect object.
+ self._rect.bottom = value
+
+
+ @property
+ def topleft(self):
+ return self._rect.topleft
+
+ @topleft.setter
+ def topleft(self, value):
+ self._rect.topleft # Run rect's onRead to update the Rect object.
+ self._rect.topleft = value
+
+
+ @property
+ def topright(self):
+ return self._rect.topright
+
+ @topright.setter
+ def topright(self, value):
+ self._rect.topright # Run rect's onRead to update the Rect object.
+ self._rect.topright = value
+
+
+ @property
+ def bottomleft(self):
+ return self._rect.bottomleft
+
+ @bottomleft.setter
+ def bottomleft(self, value):
+ self._rect.bottomleft # Run rect's onRead to update the Rect object.
+ self._rect.bottomleft = value
+
+
+ @property
+ def bottomright(self):
+ return self._rect.bottomright
+
+ @bottomright.setter
+ def bottomright(self, value):
+ self._rect.bottomright # Run rect's onRead to update the Rect object.
+ self._rect.bottomright = value
+
+
+ @property
+ def midleft(self):
+ return self._rect.midleft
+
+ @midleft.setter
+ def midleft(self, value):
+ self._rect.midleft # Run rect's onRead to update the Rect object.
+ self._rect.midleft = value
+
+
+ @property
+ def midright(self):
+ return self._rect.midright
+
+ @midright.setter
+ def midright(self, value):
+ self._rect.midright # Run rect's onRead to update the Rect object.
+ self._rect.midright = value
+
+
+ @property
+ def midtop(self):
+ return self._rect.midtop
+
+ @midtop.setter
+ def midtop(self, value):
+ self._rect.midtop # Run rect's onRead to update the Rect object.
+ self._rect.midtop = value
+
+
+ @property
+ def midbottom(self):
+ return self._rect.midbottom
+
+ @midbottom.setter
+ def midbottom(self, value):
+ self._rect.midbottom # Run rect's onRead to update the Rect object.
+ self._rect.midbottom = value
+
+
+ @property
+ def center(self):
+ return self._rect.center
+
+ @center.setter
+ def center(self, value):
+ self._rect.center # Run rect's onRead to update the Rect object.
+ self._rect.center = value
+
+
+ @property
+ def centerx(self):
+ return self._rect.centerx
+
+ @centerx.setter
+ def centerx(self, value):
+ self._rect.centerx # Run rect's onRead to update the Rect object.
+ self._rect.centerx = value
+
+
+ @property
+ def centery(self):
+ return self._rect.centery
+
+ @centery.setter
+ def centery(self, value):
+ self._rect.centery # Run rect's onRead to update the Rect object.
+ self._rect.centery = value
+
+
+ @property
+ def width(self):
+ return self._rect.width
+
+ @width.setter
+ def width(self, value):
+ self._rect.width # Run rect's onRead to update the Rect object.
+ self._rect.width = value
+
+
+ @property
+ def height(self):
+ return self._rect.height
+
+ @height.setter
+ def height(self, value):
+ self._rect.height # Run rect's onRead to update the Rect object.
+ self._rect.height = value
+
+
+ @property
+ def size(self):
+ return self._rect.size
+
+ @size.setter
+ def size(self, value):
+ self._rect.size # Run rect's onRead to update the Rect object.
+ self._rect.size = value
+
+
+ @property
+ def area(self):
+ return self._rect.area
+
+ @area.setter
+ def area(self, value):
+ self._rect.area # Run rect's onRead to update the Rect object.
+ self._rect.area = value
+
+
+ @property
+ def box(self):
+ return self._rect.box
+
+ @box.setter
+ def box(self, value):
+ self._rect.box # Run rect's onRead to update the Rect object.
+ self._rect.box = value
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_win.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_win.py
new file mode 100644
index 00000000..79ae902f
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/_pygetwindow_win.py
@@ -0,0 +1,563 @@
+import ctypes
+import pyrect
+from ctypes import wintypes # We can't use ctypes.wintypes, we must import wintypes this way.
+
+import pygetwindow
+
+NULL = 0 # Used to match the Win32 API value of "null".
+
+# These FORMAT_MESSAGE_ constants are used for FormatMesage() and are
+# documented at https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-formatmessage#parameters
+FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100
+FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
+FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
+
+# These SW_ constants are used for ShowWindow() and are documented at
+# https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-showwindow#parameters
+SW_MINIMIZE = 6
+SW_MAXIMIZE = 3
+SW_RESTORE = 9
+
+# SetWindowPos constants:
+HWND_TOP = 0
+
+# Window Message constants:
+WM_CLOSE = 0x0010
+
+# This ctypes structure is for a Win32 POINT structure,
+# which is documented here: http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805(v=vs.85).aspx
+# The POINT structure is used by GetCursorPos().
+class POINT(ctypes.Structure):
+ _fields_ = [("x", ctypes.c_long),
+ ("y", ctypes.c_long)]
+
+enumWindows = ctypes.windll.user32.EnumWindows
+enumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
+getWindowText = ctypes.windll.user32.GetWindowTextW
+getWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
+isWindowVisible = ctypes.windll.user32.IsWindowVisible
+
+
+class RECT(ctypes.Structure):
+ """A nice wrapper of the RECT structure.
+
+ Microsoft Documentation:
+ https://msdn.microsoft.com/en-us/library/windows/desktop/dd162897(v=vs.85).aspx
+ """
+ _fields_ = [('left', ctypes.c_long),
+ ('top', ctypes.c_long),
+ ('right', ctypes.c_long),
+ ('bottom', ctypes.c_long)]
+
+
+def _getAllTitles():
+ # This code taken from https://sjohannes.wordpress.com/2012/03/23/win32-python-getting-all-window-titles/
+ # A correction to this code (for enumWindowsProc) is here: http://makble.com/the-story-of-lpclong
+ titles = []
+ def foreach_window(hWnd, lParam):
+ if isWindowVisible(hWnd):
+ length = getWindowTextLength(hWnd)
+ buff = ctypes.create_unicode_buffer(length + 1)
+ getWindowText(hWnd, buff, length + 1)
+ titles.append((hWnd, buff.value))
+ return True
+ enumWindows(enumWindowsProc(foreach_window), 0)
+
+ return titles
+
+
+def _formatMessage(errorCode):
+ """A nice wrapper for FormatMessageW(). TODO
+
+ Microsoft Documentation:
+ https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-formatmessagew
+
+ Additional information:
+ https://stackoverflow.com/questions/18905702/python-ctypes-and-mutable-buffers
+ https://stackoverflow.com/questions/455434/how-should-i-use-formatmessage-properly-in-c
+ """
+ lpBuffer = wintypes.LPWSTR()
+
+ ctypes.windll.kernel32.FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ errorCode,
+ 0, # dwLanguageId
+ ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR),
+ 0, # nSize
+ NULL)
+ msg = lpBuffer.value.rstrip()
+ ctypes.windll.kernel32.LocalFree(lpBuffer) # Free the memory allocated for the error message's buffer.
+ return msg
+
+
+def _raiseWithLastError():
+ """A helper function that raises PyGetWindowException using the error
+ information from GetLastError() and FormatMessage()."""
+ errorCode = ctypes.windll.kernel32.GetLastError()
+ raise pygetwindow.PyGetWindowException('Error code from Windows: %s - %s' % (errorCode, _formatMessage(errorCode)))
+
+
+def _getWindowRect(hWnd):
+ """A nice wrapper for GetWindowRect(). TODO
+
+ Syntax:
+ BOOL GetWindowRect(
+ HWND hWnd,
+ LPRECT lpRect
+ );
+
+ Microsoft Documentation:
+ https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowrect
+ """
+ rect = RECT()
+ result = ctypes.windll.user32.GetWindowRect(hWnd, ctypes.byref(rect))
+ if result != 0:
+ return pygetwindow.Rect(rect.left, rect.top, rect.right, rect.bottom)
+ else:
+ _raiseWithLastError()
+
+
+def _getWindowText(hWnd):
+ """A wrapper for the GetWindowTextW() win api. TODO
+
+ Syntax:
+ int GetWindowTextW(
+ HWND hWnd,
+ LPWSTR lpString,
+ int nMaxCount
+ );
+
+ int GetWindowTextLengthW(
+ HWND hWnd
+ );
+
+ Microsoft Documentation:
+ https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextw
+ https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextlengthw
+ """
+ textLenInCharacters = ctypes.windll.user32.GetWindowTextLengthW(hWnd)
+ stringBuffer = ctypes.create_unicode_buffer(textLenInCharacters + 1) # +1 for the \0 at the end of the null-terminated string.
+ ctypes.windll.user32.GetWindowTextW(hWnd, stringBuffer, textLenInCharacters + 1)
+
+ # TODO it's ambiguous if an error happened or the title text is just empty. Look into this later.
+ return stringBuffer.value
+
+
+def getActiveWindow():
+ """Returns a Window object of the currently active Window."""
+ hWnd = ctypes.windll.user32.GetForegroundWindow()
+ if hWnd == 0:
+ # TODO - raise error instead
+ return None # Note that this function doesn't use GetLastError().
+ else:
+ return Win32Window(hWnd)
+
+
+def getWindowsAt(x, y):
+ """Returns a list of Window objects
+
+ Args:
+ x (int, optional): The x position of the window(s).
+ y (int, optional): The y position of the window(s)."""
+ windowsAtXY = []
+ for window in getAllWindows():
+ if pygetwindow.pointInRect(x, y, window.left, window.top, window.width, window.height):
+ windowsAtXY.append(window)
+ return windowsAtXY
+
+
+def getWindowsWithTitle(title):
+ """Returns a list of Window objects that substring match the title.
+ """
+ hWndsAndTitles = _getAllTitles()
+ windowObjs = []
+ for hWnd, winTitle in hWndsAndTitles:
+ if title.upper() in winTitle.upper(): # do a case-insensitive match
+ windowObjs.append(Win32Window(hWnd))
+ return windowObjs
+
+
+def getAllTitles():
+ """Returns a list of strings of window titles for all visible windows.
+ """
+ return [window.title for window in getAllWindows()]
+
+
+def getAllWindows():
+ """Returns a list of Window objects for all visible windows.
+ """
+ windowObjs = []
+ def foreach_window(hWnd, lParam):
+ if ctypes.windll.user32.IsWindowVisible(hWnd) != 0:
+ windowObjs.append(Win32Window(hWnd))
+ return True
+ enumWindows(enumWindowsProc(foreach_window), 0)
+
+ return windowObjs
+
+
+class Win32Window():
+ def __init__(self, hWnd):
+ self._hWnd = hWnd # TODO fix this, this is a LP_c_long insead of an int.
+
+ def _onRead(attrName):
+ r = _getWindowRect(self._hWnd)
+ self._rect._left = r.left # Setting _left directly to skip the onRead.
+ self._rect._top = r.top # Setting _top directly to skip the onRead.
+ self._rect._width = r.right - r.left # Setting _width directly to skip the onRead.
+ self._rect._height = r.bottom - r.top # Setting _height directly to skip the onRead.
+
+ def _onChange(oldBox, newBox):
+ self.moveTo(newBox.left, newBox.top)
+ self.resizeTo(newBox.width, newBox.height)
+
+ r = _getWindowRect(self._hWnd)
+ self._rect = pyrect.Rect(r.left, r.top, r.right - r.left, r.bottom - r.top, onChange=_onChange, onRead=_onRead)
+
+ def __str__(self):
+ r = _getWindowRect(self._hWnd)
+ width = r.right - r.left
+ height = r.bottom - r.top
+ return '<%s left="%s", top="%s", width="%s", height="%s", title="%s">' % (self.__class__.__name__, r.left, r.top, width, height, self.title)
+
+
+ def __repr__(self):
+ return '%s(hWnd=%s)' % (self.__class__.__name__, self._hWnd)
+
+
+ def __eq__(self, other):
+ return isinstance(other, Win32Window) and self._hWnd == other._hWnd
+
+
+ def close(self):
+ """Closes this window. This may trigger "Are you sure you want to
+ quit?" dialogs or other actions that prevent the window from
+ actually closing. This is identical to clicking the X button on the
+ window."""
+ result = ctypes.windll.user32.PostMessageA(self._hWnd, WM_CLOSE, 0, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def minimize(self):
+ """Minimizes this window."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_MINIMIZE)
+
+
+ def maximize(self):
+ """Maximizes this window."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_MAXIMIZE)
+
+
+ def restore(self):
+ """If maximized or minimized, restores the window to it's normal size."""
+ ctypes.windll.user32.ShowWindow(self._hWnd, SW_RESTORE)
+
+
+ def activate(self):
+ """Activate this window and make it the foreground window."""
+ result = ctypes.windll.user32.SetForegroundWindow(self._hWnd)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def resizeRel(self, widthOffset, heightOffset):
+ """Resizes the window relative to its current size."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left, self.top, self.width + widthOffset, self.height + heightOffset, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def resizeTo(self, newWidth, newHeight):
+ """Resizes the window to a new width and height."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left, self.top, newWidth, newHeight, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def moveRel(self, xOffset, yOffset):
+ """Moves the window relative to its current position."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, self.left + xOffset, self.top + yOffset, self.width, self.height, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ def moveTo(self, newLeft, newTop):
+ """Moves the window to new coordinates on the screen."""
+ result = ctypes.windll.user32.SetWindowPos(self._hWnd, HWND_TOP, newLeft, newTop, self.width, self.height, 0)
+ if result == 0:
+ _raiseWithLastError()
+
+
+ @property
+ def isMinimized(self):
+ """Returns True if the window is currently minimized."""
+ return ctypes.windll.user32.IsIconic(self._hWnd) != 0
+
+ @property
+ def isMaximized(self):
+ """Returns True if the window is currently maximized."""
+ return ctypes.windll.user32.IsZoomed(self._hWnd) != 0
+
+ @property
+ def isActive(self):
+ """Returns True if the window is currently the active, foreground window."""
+ return getActiveWindow() == self
+
+ @property
+ def title(self):
+ """Returns the window title as a string."""
+ return _getWindowText(self._hWnd)
+
+ @property
+ def visible(self):
+ return isWindowVisible(self._hWnd)
+
+
+
+ # Wrappers for pyrect.Rect object's properties.
+ @property
+ def left(self):
+ return self._rect.left
+
+ @left.setter
+ def left(self, value):
+ #import pdb; pdb.set_trace()
+ self._rect.left # Run rect's onRead to update the Rect object.
+ self._rect.left = value
+
+
+ @property
+ def right(self):
+ return self._rect.right
+
+ @right.setter
+ def right(self, value):
+ self._rect.right # Run rect's onRead to update the Rect object.
+ self._rect.right = value
+
+
+ @property
+ def top(self):
+ return self._rect.top
+
+ @top.setter
+ def top(self, value):
+ self._rect.top # Run rect's onRead to update the Rect object.
+ self._rect.top = value
+
+
+ @property
+ def bottom(self):
+ return self._rect.bottom
+
+ @bottom.setter
+ def bottom(self, value):
+ self._rect.bottom # Run rect's onRead to update the Rect object.
+ self._rect.bottom = value
+
+
+ @property
+ def topleft(self):
+ return self._rect.topleft
+
+ @topleft.setter
+ def topleft(self, value):
+ self._rect.topleft # Run rect's onRead to update the Rect object.
+ self._rect.topleft = value
+
+
+ @property
+ def topright(self):
+ return self._rect.topright
+
+ @topright.setter
+ def topright(self, value):
+ self._rect.topright # Run rect's onRead to update the Rect object.
+ self._rect.topright = value
+
+
+ @property
+ def bottomleft(self):
+ return self._rect.bottomleft
+
+ @bottomleft.setter
+ def bottomleft(self, value):
+ self._rect.bottomleft # Run rect's onRead to update the Rect object.
+ self._rect.bottomleft = value
+
+
+ @property
+ def bottomright(self):
+ return self._rect.bottomright
+
+ @bottomright.setter
+ def bottomright(self, value):
+ self._rect.bottomright # Run rect's onRead to update the Rect object.
+ self._rect.bottomright = value
+
+
+ @property
+ def midleft(self):
+ return self._rect.midleft
+
+ @midleft.setter
+ def midleft(self, value):
+ self._rect.midleft # Run rect's onRead to update the Rect object.
+ self._rect.midleft = value
+
+
+ @property
+ def midright(self):
+ return self._rect.midright
+
+ @midright.setter
+ def midright(self, value):
+ self._rect.midright # Run rect's onRead to update the Rect object.
+ self._rect.midright = value
+
+
+ @property
+ def midtop(self):
+ return self._rect.midtop
+
+ @midtop.setter
+ def midtop(self, value):
+ self._rect.midtop # Run rect's onRead to update the Rect object.
+ self._rect.midtop = value
+
+
+ @property
+ def midbottom(self):
+ return self._rect.midbottom
+
+ @midbottom.setter
+ def midbottom(self, value):
+ self._rect.midbottom # Run rect's onRead to update the Rect object.
+ self._rect.midbottom = value
+
+
+ @property
+ def center(self):
+ return self._rect.center
+
+ @center.setter
+ def center(self, value):
+ self._rect.center # Run rect's onRead to update the Rect object.
+ self._rect.center = value
+
+
+ @property
+ def centerx(self):
+ return self._rect.centerx
+
+ @centerx.setter
+ def centerx(self, value):
+ self._rect.centerx # Run rect's onRead to update the Rect object.
+ self._rect.centerx = value
+
+
+ @property
+ def centery(self):
+ return self._rect.centery
+
+ @centery.setter
+ def centery(self, value):
+ self._rect.centery # Run rect's onRead to update the Rect object.
+ self._rect.centery = value
+
+
+ @property
+ def width(self):
+ return self._rect.width
+
+ @width.setter
+ def width(self, value):
+ self._rect.width # Run rect's onRead to update the Rect object.
+ self._rect.width = value
+
+
+ @property
+ def height(self):
+ return self._rect.height
+
+ @height.setter
+ def height(self, value):
+ self._rect.height # Run rect's onRead to update the Rect object.
+ self._rect.height = value
+
+
+ @property
+ def size(self):
+ return self._rect.size
+
+ @size.setter
+ def size(self, value):
+ self._rect.size # Run rect's onRead to update the Rect object.
+ self._rect.size = value
+
+
+ @property
+ def area(self):
+ return self._rect.area
+
+ @area.setter
+ def area(self, value):
+ self._rect.area # Run rect's onRead to update the Rect object.
+ self._rect.area = value
+
+
+ @property
+ def box(self):
+ return self._rect.box
+
+ @box.setter
+ def box(self, value):
+ self._rect.box # Run rect's onRead to update the Rect object.
+ self._rect.box = value
+
+
+def cursor():
+ """Returns the current xy coordinates of the mouse cursor as a two-integer
+ tuple by calling the GetCursorPos() win32 function.
+
+ Returns:
+ (x, y) tuple of the current xy coordinates of the mouse cursor.
+ """
+
+ cursor = POINT()
+ ctypes.windll.user32.GetCursorPos(ctypes.byref(cursor))
+ return pygetwindow.Point(x=cursor.x, y=cursor.y)
+
+
+def resolution():
+ """Returns the width and height of the screen as a two-integer tuple.
+
+ Returns:
+ (width, height) tuple of the screen size, in pixels.
+ """
+ return pygetwindow.Size(width=ctypes.windll.user32.GetSystemMetrics(0), height=ctypes.windll.user32.GetSystemMetrics(1))
+
+'''
+def displayWindowsUnderMouse(xOffset=0, yOffset=0):
+ """This function is meant to be run from the command line. It will
+ automatically display the location and RGB of the mouse cursor."""
+ print('Press Ctrl-C to quit.')
+ if xOffset != 0 or yOffset != 0:
+ print('xOffset: %s yOffset: %s' % (xOffset, yOffset))
+ resolution = size()
+ try:
+ while True:
+ # Get and print the mouse coordinates.
+ x, y = position()
+ positionStr = 'X: ' + str(x - xOffset).rjust(4) + ' Y: ' + str(y - yOffset).rjust(4)
+
+ # TODO - display windows under the mouse
+
+ sys.stdout.write(positionStr)
+ sys.stdout.write('\b' * len(positionStr))
+ sys.stdout.flush()
+ except KeyboardInterrupt:
+ sys.stdout.write('\n')
+ sys.stdout.flush()
+'''
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/foo.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/foo.py
new file mode 100644
index 00000000..f7e7da9e
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pygetwindow/foo.py
@@ -0,0 +1 @@
+bar = 42
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/__init__.py
new file mode 100644
index 00000000..e11297eb
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/__init__.py
@@ -0,0 +1,389 @@
+# PyMsgBox - A simple, cross-platform, pure Python module for JavaScript-like message boxes.
+# Al Sweigart al@inventwithpython.com
+
+# Modified BSD License
+# Derived from Stephen Raymond Ferg's EasyGui http://easygui.sourceforge.net/
+
+"""
+The four functions in PyMsgBox:
+
+ - alert(text='', title='', button='OK')
+
+ Displays a simple message box with text and a single OK button. Returns the text of the button clicked on.
+
+ - confirm(text='', title='', buttons=['OK', 'Cancel'])
+
+ Displays a message box with OK and Cancel buttons. Number and text of buttons can be customized. Returns the text of the button clicked on.
+
+ - prompt(text='', title='' , default='')
+
+ Displays a message box with text input, and OK & Cancel buttons. Returns the text entered, or None if Cancel was clicked.
+
+ - password(text='', title='', default='', mask='*')
+
+ Displays a message box with text input, and OK & Cancel buttons. Typed characters appear as *. Returns the text entered, or None if Cancel was clicked.
+"""
+
+"""
+TODO Roadmap:
+- Be able to specify a custom icon in the message box.
+- Be able to place the message box at an arbitrary position (including on multi screen layouts)
+- Add mouse clicks to unit testing.
+- progress() function to display a progress bar
+- Maybe other types of dialog: open, save, file/folder picker, etc.
+"""
+
+__version__ = '1.0.6'
+
+import sys
+RUNNING_PYTHON_2 = sys.version_info[0] == 2
+
+# Because PyAutoGUI requires PyMsgBox but might be installed on systems
+# without tkinter, we don't want a lack of tkinter to cause installation
+# to fail. So exceptions won't be raised until the PyMsgBox functions
+# are actually called.
+TKINTER_IMPORT_SUCCEEDED = True
+
+try:
+ if RUNNING_PYTHON_2:
+ import Tkinter as tk
+ else:
+ import tkinter as tk
+
+ rootWindowPosition = '+300+200'
+
+ if tk.TkVersion < 8.0 :
+ raise RuntimeError('You are running Tk version: ' + str(tk.TkVersion) + 'You must be using Tk version 8.0 or greater to use PyMsgBox.')
+
+except ImportError:
+ TKINTER_IMPORT_SUCCEEDED = False
+
+
+
+PROPORTIONAL_FONT_FAMILY = ('MS', 'Sans', 'Serif')
+MONOSPACE_FONT_FAMILY = ('Courier')
+
+PROPORTIONAL_FONT_SIZE = 10
+MONOSPACE_FONT_SIZE = 9 #a little smaller, because it it more legible at a smaller size
+TEXT_ENTRY_FONT_SIZE = 12 # a little larger makes it easier to see
+
+
+STANDARD_SELECTION_EVENTS = ['Return', 'Button-1', 'space']
+
+# constants for strings: (for internationalization, change these)
+OK_TEXT = 'OK'
+CANCEL_TEXT = 'Cancel'
+TIMEOUT_TEXT = 'Timeout'
+
+# Initialize some global variables that will be reset later
+__choiceboxMultipleSelect = None
+__widgetTexts = None
+__replyButtonText = None
+__choiceboxResults = None
+__firstWidget = None
+__enterboxText = None
+__enterboxDefaultText=''
+__multenterboxText = ''
+choiceboxChoices = None
+choiceboxWidget = None
+entryWidget = None
+boxRoot = None
+buttonsFrame = None
+
+
+
+
+
+def alert(text='', title='', button=OK_TEXT, root=None, timeout=None):
+ """Displays a simple message box with text and a single OK button. Returns the text of the button clicked on."""
+ assert TKINTER_IMPORT_SUCCEEDED, 'Tkinter is required for pymsgbox'
+ return _buttonbox(msg=text, title=title, choices=[str(button)], root=root, timeout=timeout)
+
+
+def confirm(text='', title='', buttons=[OK_TEXT, CANCEL_TEXT], root=None, timeout=None):
+ """Displays a message box with OK and Cancel buttons. Number and text of buttons can be customized. Returns the text of the button clicked on."""
+ assert TKINTER_IMPORT_SUCCEEDED, 'Tkinter is required for pymsgbox'
+ return _buttonbox(msg=text, title=title, choices=[str(b) for b in buttons], root=root, timeout=timeout)
+
+
+def prompt(text='', title='' , default='', root=None, timeout=None):
+ """Displays a message box with text input, and OK & Cancel buttons. Returns the text entered, or None if Cancel was clicked."""
+ assert TKINTER_IMPORT_SUCCEEDED, 'Tkinter is required for pymsgbox'
+ return __fillablebox(text, title, default=default, mask=None,root=root, timeout=timeout)
+
+
+def password(text='', title='', default='', mask='*', root=None, timeout=None):
+ """Displays a message box with text input, and OK & Cancel buttons. Typed characters appear as *. Returns the text entered, or None if Cancel was clicked."""
+ assert TKINTER_IMPORT_SUCCEEDED, 'Tkinter is required for pymsgbox'
+ return __fillablebox(text, title, default, mask=mask, root=root, timeout=timeout)
+
+
+
+
+
+import pymsgbox.native as native # This needs to be after the above functions so that the unimplmeneted native functions can default back to the above functions.
+native # dummy line just to make lint stop complaining about the previous line
+
+def timeoutBoxRoot():
+ global boxRoot, __replyButtonText, __enterboxText
+ boxRoot.destroy()
+ __replyButtonText = TIMEOUT_TEXT
+ __enterboxText = TIMEOUT_TEXT
+
+
+def _buttonbox(msg, title, choices, root=None, timeout=None):
+ """
+ Display a msg, a title, and a set of buttons.
+ The buttons are defined by the members of the choices list.
+ Return the text of the button that the user selected.
+
+ @arg msg: the msg to be displayed.
+ @arg title: the window title
+ @arg choices: a list or tuple of the choices to be displayed
+ """
+ global boxRoot, __replyButtonText, __widgetTexts, buttonsFrame
+
+
+ # Initialize __replyButtonText to the first choice.
+ # This is what will be used if the window is closed by the close button.
+ __replyButtonText = choices[0]
+
+ if root:
+ root.withdraw()
+ boxRoot = tk.Toplevel(master=root)
+ boxRoot.withdraw()
+ else:
+ boxRoot = tk.Tk()
+ boxRoot.withdraw()
+
+ boxRoot.title(title)
+ boxRoot.iconname('Dialog')
+ boxRoot.geometry(rootWindowPosition)
+ boxRoot.minsize(400, 100)
+
+ # ------------- define the messageFrame ---------------------------------
+ messageFrame = tk.Frame(master=boxRoot)
+ messageFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+ # ------------- define the buttonsFrame ---------------------------------
+ buttonsFrame = tk.Frame(master=boxRoot)
+ buttonsFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+ # -------------------- place the widgets in the frames -----------------------
+ messageWidget = tk.Message(messageFrame, text=msg, width=400)
+ messageWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, PROPORTIONAL_FONT_SIZE))
+ messageWidget.pack(side=tk.TOP, expand=tk.YES, fill=tk.X, padx='3m', pady='3m')
+
+ __put_buttons_in_buttonframe(choices)
+
+ # -------------- the action begins -----------
+ # put the focus on the first button
+ __firstWidget.focus_force()
+
+ boxRoot.deiconify()
+ if timeout is not None:
+ boxRoot.after(timeout, timeoutBoxRoot)
+ boxRoot.mainloop()
+ try:
+ boxRoot.destroy()
+ except tk.TclError:
+ if __replyButtonText != TIMEOUT_TEXT:
+ __replyButtonText = None
+
+ if root: root.deiconify()
+ return __replyButtonText
+
+
+def __put_buttons_in_buttonframe(choices):
+ """Put the buttons in the buttons frame"""
+ global __widgetTexts, __firstWidget, buttonsFrame
+
+ __firstWidget = None
+ __widgetTexts = {}
+
+ i = 0
+
+ for buttonText in choices:
+ tempButton = tk.Button(buttonsFrame, takefocus=1, text=buttonText)
+ _bindArrows(tempButton)
+ tempButton.pack(expand=tk.YES, side=tk.LEFT, padx='1m', pady='1m', ipadx='2m', ipady='1m')
+
+ # remember the text associated with this widget
+ __widgetTexts[tempButton] = buttonText
+
+ # remember the first widget, so we can put the focus there
+ if i == 0:
+ __firstWidget = tempButton
+ i = 1
+
+ # for the commandButton, bind activation events to the activation event handler
+ commandButton = tempButton
+ handler = __buttonEvent
+ for selectionEvent in STANDARD_SELECTION_EVENTS:
+ commandButton.bind('<%s>' % selectionEvent, handler)
+
+ if CANCEL_TEXT in choices:
+ commandButton.bind('', __cancelButtonEvent)
+
+
+def _bindArrows(widget, skipArrowKeys=False):
+ widget.bind('', _tabRight)
+ widget.bind('' , _tabLeft)
+
+ if not skipArrowKeys:
+ widget.bind('',_tabRight)
+ widget.bind('' , _tabLeft)
+
+def _tabRight(event):
+ boxRoot.event_generate('')
+
+def _tabLeft(event):
+ boxRoot.event_generate('')
+
+
+def __buttonEvent(event):
+ """
+ Handle an event that is generated by a person clicking a button.
+ """
+ global boxRoot, __widgetTexts, __replyButtonText
+ __replyButtonText = __widgetTexts[event.widget]
+ boxRoot.quit() # quit the main loop
+
+def __cancelButtonEvent(event):
+ """Handle pressing Esc by clicking the Cancel button."""
+ global boxRoot, __widgetTexts, __replyButtonText
+ __replyButtonText = CANCEL_TEXT
+ boxRoot.quit()
+
+
+def __fillablebox(msg, title='', default='', mask=None, root=None, timeout=None):
+ """
+ Show a box in which a user can enter some text.
+ You may optionally specify some default text, which will appear in the
+ enterbox when it is displayed.
+ Returns the text that the user entered, or None if he cancels the operation.
+ """
+
+ global boxRoot, __enterboxText, __enterboxDefaultText
+ global cancelButton, entryWidget, okButton
+
+ if title == None:
+ title == ''
+ if default == None:
+ default = ''
+ __enterboxDefaultText = default
+ __enterboxText = __enterboxDefaultText
+
+ if root:
+ root.withdraw()
+ boxRoot = tk.Toplevel(master=root)
+ boxRoot.withdraw()
+ else:
+ boxRoot = tk.Tk()
+ boxRoot.withdraw()
+
+ boxRoot.title(title)
+ boxRoot.iconname('Dialog')
+ boxRoot.geometry(rootWindowPosition)
+ boxRoot.bind('', __enterboxCancel)
+
+ # ------------- define the messageFrame ---------------------------------
+ messageFrame = tk.Frame(master=boxRoot)
+ messageFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+ # ------------- define the buttonsFrame ---------------------------------
+ buttonsFrame = tk.Frame(master=boxRoot)
+ buttonsFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+
+ # ------------- define the entryFrame ---------------------------------
+ entryFrame = tk.Frame(master=boxRoot)
+ entryFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+ # ------------- define the buttonsFrame ---------------------------------
+ buttonsFrame = tk.Frame(master=boxRoot)
+ buttonsFrame.pack(side=tk.TOP, fill=tk.BOTH)
+
+ #-------------------- the msg widget ----------------------------
+ messageWidget = tk.Message(messageFrame, width='4.5i', text=msg)
+ messageWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, PROPORTIONAL_FONT_SIZE))
+ messageWidget.pack(side=tk.RIGHT, expand=1, fill=tk.BOTH, padx='3m', pady='3m')
+
+ # --------- entryWidget ----------------------------------------------
+ entryWidget = tk.Entry(entryFrame, width=40)
+ _bindArrows(entryWidget, skipArrowKeys=True)
+ entryWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, TEXT_ENTRY_FONT_SIZE))
+ if mask:
+ entryWidget.configure(show=mask)
+ entryWidget.pack(side=tk.LEFT, padx='3m')
+ entryWidget.bind('', __enterboxGetText)
+ entryWidget.bind('', __enterboxCancel)
+
+ # put text into the entryWidget and have it pre-highlighted
+ if __enterboxDefaultText != '':
+ entryWidget.insert(0,__enterboxDefaultText)
+ entryWidget.select_range(0, tk.END)
+
+ # ------------------ ok button -------------------------------
+ okButton = tk.Button(buttonsFrame, takefocus=1, text=OK_TEXT)
+ _bindArrows(okButton)
+ okButton.pack(expand=1, side=tk.LEFT, padx='3m', pady='3m', ipadx='2m', ipady='1m')
+
+ # for the commandButton, bind activation events to the activation event handler
+ commandButton = okButton
+ handler = __enterboxGetText
+ for selectionEvent in STANDARD_SELECTION_EVENTS:
+ commandButton.bind('<%s>' % selectionEvent, handler)
+
+
+ # ------------------ cancel button -------------------------------
+ cancelButton = tk.Button(buttonsFrame, takefocus=1, text=CANCEL_TEXT)
+ _bindArrows(cancelButton)
+ cancelButton.pack(expand=1, side=tk.RIGHT, padx='3m', pady='3m', ipadx='2m', ipady='1m')
+
+ # for the commandButton, bind activation events to the activation event handler
+ commandButton = cancelButton
+ handler = __enterboxCancel
+ for selectionEvent in STANDARD_SELECTION_EVENTS:
+ commandButton.bind('<%s>' % selectionEvent, handler)
+
+ # ------------------- time for action! -----------------
+ entryWidget.focus_force() # put the focus on the entryWidget
+ boxRoot.deiconify()
+ if timeout is not None:
+ boxRoot.after(timeout, timeoutBoxRoot)
+ boxRoot.mainloop() # run it!
+
+ # -------- after the run has completed ----------------------------------
+ if root: root.deiconify()
+ try:
+ boxRoot.destroy() # button_click didn't destroy boxRoot, so we do it now
+ except tk.TclError:
+ if __enterboxText != TIMEOUT_TEXT:
+ return None
+
+ return __enterboxText
+
+
+def __enterboxGetText(event):
+ global __enterboxText
+
+ __enterboxText = entryWidget.get()
+ boxRoot.quit()
+
+
+def __enterboxRestore(event):
+ global entryWidget
+
+ entryWidget.delete(0,len(entryWidget.get()))
+ entryWidget.insert(0, __enterboxDefaultText)
+
+
+def __enterboxCancel(event):
+ global __enterboxText
+
+ __enterboxText = None
+ boxRoot.quit()
+
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_java.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_java.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_osx.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_osx.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_win.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_win.py
new file mode 100644
index 00000000..d0d5a42b
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_win.py
@@ -0,0 +1,65 @@
+# The Windows native message box.
+
+import sys
+import ctypes # An included library with Python install.
+
+
+
+
+MB_OK = 0x0
+MB_OKCANCEL = 0x1
+MB_ABORTRETRYIGNORE = 0x2
+MB_YESNOCANCEL = 0x3
+MB_YESNO = 0x4
+MB_RETRYCANCEL = 0x5
+
+MB_ICONHAND = MB_ICONSTOP = MB_ICONERRPR = 0x10
+MB_ICONQUESTION = 0x20
+MB_ICONEXCLAIMATION = 0x30
+MB_ICONASTERISK = MB_ICONINFOMRAITON = 0x40
+
+MB_DEFAULTBUTTON1 = 0x0
+MB_DEFAULTBUTTON2 = 0x100
+MB_DEFAULTBUTTON3 = 0x200
+MB_DEFAULTBUTTON4 = 0x300
+
+MB_SETFOREGROUND = 0x10000
+MB_TOPMOST = 0x40000
+
+runningOnPython2 = sys.version_info[0] == 2
+
+
+
+if runningOnPython2:
+ messageBoxFunc = ctypes.windll.user32.MessageBoxA
+else: # Python 3 functions.
+ messageBoxFunc = ctypes.windll.user32.MessageBoxW
+
+
+def alert(text='', title='', button='OK'):
+ """Displays a simple message box with text and a single OK button. Returns the text of the button clicked on."""
+ messageBoxFunc(0, text, title, MB_OK | MB_SETFOREGROUND | MB_TOPMOST)
+ return button
+
+def confirm(text='', title='', buttons=['OK', 'Cancel']):
+ """Displays a message box with OK and Cancel buttons. Number and text of buttons can be customized. Returns the text of the button clicked on."""
+ retVal = messageBoxFunc(0, text, title, MB_OKCANCEL | MB_ICONQUESTION | MB_SETFOREGROUND | MB_TOPMOST)
+ if retVal == 1 or len(buttons) == 1:
+ return buttons[0]
+ elif retVal == 2:
+ return buttons[1]
+ else:
+ assert False, 'Unexpected return value from MessageBox: %s' % (retVal)
+
+
+
+'''
+def prompt(text='', title='' , default=''):
+ """Displays a message box with text input, and OK & Cancel buttons. Returns the text entered, or None if Cancel was clicked."""
+ pass
+
+def password(text='', title='', default='', mask='*'):
+ """Displays a message box with text input, and OK & Cancel buttons. Typed characters appear as *. Returns the text entered, or None if Cancel was clicked."""
+ pass
+
+'''
\ No newline at end of file
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_x11.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/_native_x11.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/native.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/native.py
new file mode 100644
index 00000000..93c729c5
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pymsgbox/native.py
@@ -0,0 +1,27 @@
+# These functions use the operating system's native message box calls.
+
+import sys
+
+# default back to the original functions if no native functions exist.
+import pymsgbox
+alert = pymsgbox.alert
+confirm = pymsgbox.confirm
+prompt = pymsgbox.prompt
+password = pymsgbox.password
+
+
+# The platformModule is where we reference the platform-specific functions.
+if sys.platform.startswith('java'):
+ import pymsgbox._native_java as platformModule
+elif sys.platform == 'darwin':
+ import pymsgbox._native_osx as platformModule
+elif sys.platform == 'win32':
+ import pymsgbox._native_win as platformModule
+ alert = platformModule.alert
+ confirm = platformModule.confirm
+else:
+ import pymsgbox._native_x11 as platformModule
+
+platformModule # this line used to silence the linting tool. Will be removed once implementation is done
+
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyrect/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyrect/__init__.py
new file mode 100644
index 00000000..feaf4929
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyrect/__init__.py
@@ -0,0 +1,1334 @@
+import doctest
+import collections
+
+# TODO - finish doc tests
+
+# TODO - unit tests needed for get/set and Box named tuple
+
+__version__ = '0.1.4'
+
+
+# Constants for rectangle attributes:
+TOP = 'top'
+BOTTOM = 'bottom'
+LEFT = 'left'
+RIGHT = 'right'
+TOPLEFT = 'topleft'
+TOPRIGHT = 'topright'
+BOTTOMLEFT = 'bottomleft'
+BOTTOMRIGHT = 'bottomright'
+MIDTOP = 'midtop'
+MIDRIGHT = 'midright'
+MIDLEFT = 'midleft'
+MIDBOTTOM = 'midbottom'
+CENTER = 'center'
+CENTERX = 'centerx'
+CENTERY = 'centery'
+WIDTH = 'width'
+HEIGHT = 'height'
+SIZE = 'size'
+BOX = 'box'
+AREA = 'area'
+
+Box = collections.namedtuple('Box', 'left top width height')
+Point = collections.namedtuple('Point', 'x y')
+Size = collections.namedtuple('Size', 'width height')
+
+class PyRectException(Exception):
+ """
+ This class exists for PyRect exceptions. If the PyRect module raises any
+ non-PyRectException exceptions, this indicates there's a bug in PyRect.
+ """
+ pass
+
+
+def _checkForIntOrFloat(arg):
+ """Raises an exception if arg is not an int or float. Always returns None."""
+ if not isinstance(arg, (int, float)):
+ raise PyRectException('argument must be int or float, not %s' % (arg.__class__.__name__))
+
+
+def _checkForInt(arg):
+ """Raises an exception if arg is not an int. Always returns None."""
+ if not isinstance(arg, int):
+ raise PyRectException('argument must be int or float, not %s' % (arg.__class__.__name__))
+
+
+def _checkForTwoIntOrFloatTuple(arg):
+ try:
+ if not isinstance(arg[0], (int, float)) or \
+ not isinstance(arg[1], (int, float)):
+ raise PyRectException('argument must be a two-item tuple containing int or float values')
+ except:
+ raise PyRectException('argument must be a two-item tuple containing int or float values')
+
+
+def _checkForFourIntOrFloatTuple(arg):
+ try:
+ if not isinstance(arg[0], (int, float)) or \
+ not isinstance(arg[1], (int, float)) or \
+ not isinstance(arg[2], (int, float)) or \
+ not isinstance(arg[3], (int, float)):
+ raise PyRectException('argument must be a four-item tuple containing int or float values')
+ except:
+ raise PyRectException('argument must be a four-item tuple containing int or float values')
+
+
+def _collides(rectOrPoint1, rectOrPoint2):
+ """Returns True if rectOrPoint1 and rectOrPoint2 collide with each other."""
+
+
+def _getRectsAndPoints(rectsOrPoints):
+ points = []
+ rects = []
+ for rectOrPoint in rectsOrPoints:
+ try:
+ _checkForTwoIntOrFloatTuple(rectOrPoint)
+ points.append(rectOrPoint)
+ except PyRectException:
+ try:
+ _checkForFourIntOrFloatTuple(rectOrPoint)
+ except:
+ raise PyRectException('argument is not a point or a rect tuple')
+ rects.append(rectOrPoint)
+ return (rects, points)
+
+
+'''
+def collideAnyBetween(rectsOrPoints):
+ """Returns True if any of the (x, y) or (left, top, width, height) tuples
+ in rectsOrPoints collides with any other point or box tuple in rectsOrPoints.
+
+ >>> p1 = (50, 50)
+ >>> p2 = (100, 100)
+ >>> p3 = (50, 200)
+ >>> r1 = (-50, -50, 20, 20)
+ >>> r2 = (25, 25, 50, 50)
+ >>> collideAnyBetween([p1, p2, p3, r1, r2]) # p1 and r2 collide
+ True
+ >>> collideAnyBetween([p1, p2, p3, r1])
+ False
+ """
+ # TODO - needs to be complete
+
+ # split up
+ rects, points = _getRectsAndPoints(rectsOrPoints)
+
+ # compare points with each other
+ if len(points) > 1:
+ for point in points:
+ if point != points[0]:
+ return False
+
+ # TODO finish
+'''
+
+
+
+'''
+def collideAllBetween(rectsOrPoints):
+ """Returns True if any of the (x, y) or (left, top, width, height) tuples
+ in rectsOrPoints collides with any other point or box tuple in rectsOrPoints.
+
+ >>> p1 = (50, 50)
+ >>> p2 = (100, 100)
+ >>> p3 = (50, 200)
+ >>> r1 = (-50, -50, 20, 20)
+ >>> r2 = (25, 25, 50, 50)
+ >>> collideAllBetween([p1, p2, p3, r1, r2])
+ False
+ >>> collideAllBetween([p1, p2, p3, r1])
+ False
+ >>> collideAllBetween([p1, r2]) # Everything in the list collides with each other.
+ True
+ """
+
+ # Check for valid arguments
+ try:
+ for rectOrPoint in rectsOrPoints:
+ if len(rectOrPoint) == 2:
+ _checkForTwoIntOrFloatTuple(rectOrPoint)
+ elif len(rectOrPoint) == 4:
+ _checkForFourIntOrFloatTuple(rectOrPoint)
+ else:
+ raise PyRectException()
+ except:
+ raise PyRectException('Arguments in rectsOrPoints must be 2- or 4-integer/float tuples.')
+
+ raise NotImplementedError # return a list of all rects or points that collide with any other in the argument
+'''
+
+class Rect(object):
+ def __init__(self, left=0, top=0, width=0, height=0, enableFloat=False, readOnly=False, onChange=None, onRead=None):
+ _checkForIntOrFloat(width)
+ _checkForIntOrFloat(height)
+ _checkForIntOrFloat(left)
+ _checkForIntOrFloat(top)
+
+ self._enableFloat = bool(enableFloat)
+ self._readOnly = bool(readOnly)
+
+ if onChange is not None and not callable(onChange):
+ raise PyRectException('onChange argument must be None or callable (function, method, etc.)')
+ self.onChange = onChange
+
+ if onRead is not None and not callable(onRead):
+ raise PyRectException('onRead argument must be None or callable (function, method, etc.)')
+ self.onRead = onRead
+
+ if enableFloat:
+ self._width = float(width)
+ self._height = float(height)
+ self._left = float(left)
+ self._top = float(top)
+ else:
+ self._width = int(width)
+ self._height = int(height)
+ self._left = int(left)
+ self._top = int(top)
+
+
+ # OPERATOR OVERLOADING / DUNDER METHODS
+ def __repr__(self):
+ """Return a string of the constructor function call to create this Rect object."""
+ return '%s(left=%s, top=%s, width=%s, height=%s)' % (self.__class__.__name__, self._left, self._top, self._width, self._height)
+
+
+ def __str__(self):
+ """Return a string representation of this Rect object."""
+ return '(x=%s, y=%s, w=%s, h=%s)' % (self._left, self._top, self._width, self._height)
+
+
+ def callOnChange(self, oldLeft, oldTop, oldWidth, oldHeight):
+ # Note: callOnChange() should be called *after* the attribute has been changed.
+ # Note: This isn't thread safe; the attributes can change between the calling of this function and the code in the function running.
+ if self.onChange is not None:
+ self.onChange(Box(oldLeft, oldTop, oldWidth, oldHeight), Box(self._left, self._top, self._width, self._height))
+
+
+ @property
+ def enableFloat(self):
+ """
+ A Boolean attribute that determines if this rectangle uses floating point
+ numbers for its position and size. False, by default.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.enableFloat
+ False
+ >>> r.enableFloat = True
+ >>> r.top = 3.14
+ >>> r
+ Rect(left=0.0, top=3.14, width=10.0, height=20.0)
+ """
+ return self._enableFloat
+
+ @enableFloat.setter
+ def enableFloat(self, value):
+ if not isinstance(value, bool):
+ raise PyRectException('enableFloat must be set to a bool value')
+ self._enableFloat = value
+
+ if self._enableFloat:
+ self._left = float(self._left)
+ self._top = float(self._top)
+ self._width = float(self._width)
+ self._height = float(self._height)
+ else:
+ self._left = int(self._left)
+ self._top = int(self._top)
+ self._width = int(self._width)
+ self._height = int(self._height)
+
+
+ # LEFT SIDE PROPERTY
+ @property
+ def left(self):
+ """
+ The x coordinate for the left edge of the rectangle. `x` is an alias for `left`.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.left
+ 0
+ >>> r.left = 50
+ >>> r
+ Rect(left=50, top=0, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(LEFT)
+ return self._left
+
+ @left.setter
+ def left(self, newLeft):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newLeft)
+ if newLeft != self._left: # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ if self._enableFloat:
+ self._left = newLeft
+ else:
+ self._left = int(newLeft)
+ self.callOnChange(originalLeft, self._top, self._width, self._height)
+
+ x = left # x is an alias for left
+
+
+ # TOP SIDE PROPERTY
+ @property
+ def top(self):
+ """
+ The y coordinate for the top edge of the rectangle. `y` is an alias for `top`.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.top
+ 0
+ >>> r.top = 50
+ >>> r
+ Rect(left=0, top=50, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(TOP)
+ return self._top
+
+ @top.setter
+ def top(self, newTop):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newTop)
+ if newTop != self._top: # Only run this code if the size/position has changed.
+ originalTop = self._top
+ if self._enableFloat:
+ self._top = newTop
+ else:
+ self._top = int(newTop)
+ self.callOnChange(self._left, originalTop, self._width, self._height)
+
+ y = top # y is an alias for top
+
+
+ # RIGHT SIDE PROPERTY
+ @property
+ def right(self):
+ """
+ The x coordinate for the right edge of the rectangle.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.right
+ 10
+ >>> r.right = 50
+ >>> r
+ Rect(left=40, top=0, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(RIGHT)
+ return self._left + self._width
+
+ @right.setter
+ def right(self, newRight):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newRight)
+ if newRight != self._left + self._width: # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ if self._enableFloat:
+ self._left = newRight - self._width
+ else:
+ self._left = int(newRight) - self._width
+ self.callOnChange(originalLeft, self._top, self._width, self._height)
+
+
+ # BOTTOM SIDE PROPERTY
+ @property
+ def bottom(self):
+ """The y coordinate for the bottom edge of the rectangle.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.bottom
+ 20
+ >>> r.bottom = 30
+ >>> r
+ Rect(left=0, top=10, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(BOTTOM)
+ return self._top + self._height
+
+ @bottom.setter
+ def bottom(self, newBottom):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newBottom)
+ if newBottom != self._top + self._height: # Only run this code if the size/position has changed.
+ originalTop = self._top
+ if self._enableFloat:
+ self._top = newBottom - self._height
+ else:
+ self._top = int(newBottom) - self._height
+ self.callOnChange(self._left, originalTop, self._width, self._height)
+
+
+ # TOP LEFT CORNER PROPERTY
+ @property
+ def topleft(self):
+ """
+ The x and y coordinates for the top right corner of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.topleft
+ (0, 0)
+ >>> r.topleft = (30, 30)
+ >>> r
+ Rect(left=30, top=30, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(TOPLEFT)
+ return Point(x=self._left, y=self._top)
+
+ @topleft.setter
+ def topleft(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newLeft, newTop = value
+ if (newLeft != self._left) or (newTop != self._top): # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ self._left = newLeft
+ self._top = newTop
+ else:
+ self._left = int(newLeft)
+ self._top = int(newTop)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # BOTTOM LEFT CORNER PROPERTY
+ @property
+ def bottomleft(self):
+ """
+ The x and y coordinates for the bottom right corner of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.bottomleft
+ (0, 20)
+ >>> r.bottomleft = (30, 30)
+ >>> r
+ Rect(left=30, top=10, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(BOTTOMLEFT)
+ return Point(x=self._left, y=self._top + self._height)
+
+ @bottomleft.setter
+ def bottomleft(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newLeft, newBottom = value
+ if (newLeft != self._left) or (newBottom != self._top + self._height): # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ self._left = newLeft
+ self._top = newBottom - self._height
+ else:
+ self._left = int(newLeft)
+ self._top = int(newBottom) - self._height
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # TOP RIGHT CORNER PROPERTY
+ @property
+ def topright(self):
+ """
+ The x and y coordinates for the top right corner of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.topright
+ (10, 0)
+ >>> r.topright = (30, 30)
+ >>> r
+ Rect(left=20, top=30, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(TOPRIGHT)
+ return Point(x=self._left + self._width, y=self._top)
+
+ @topright.setter
+ def topright(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newRight, newTop = value
+ if (newRight != self._left + self._width) or (newTop != self._top): # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ self._left = newRight - self._width
+ self._top = newTop
+ else:
+ self._left = int(newRight) - self._width
+ self._top = int(newTop)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # BOTTOM RIGHT CORNER PROPERTY
+ @property
+ def bottomright(self):
+ """
+ The x and y coordinates for the bottom right corner of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.bottomright
+ (10, 20)
+ >>> r.bottomright = (30, 30)
+ >>> r
+ Rect(left=20, top=10, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(BOTTOMRIGHT)
+ return Point(x=self._left + self._width, y=self._top + self._height)
+
+ @bottomright.setter
+ def bottomright(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newRight, newBottom = value
+ if (newBottom != self._top + self._height) or (newRight != self._left + self._width): # Only run this code if the size/position has changed.
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ self._left = newRight - self._width
+ self._top = newBottom - self._height
+ else:
+ self._left = int(newRight) - self._width
+ self._top = int(newBottom) - self._height
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # MIDDLE OF TOP SIDE PROPERTY
+ @property
+ def midtop(self):
+ """
+ The x and y coordinates for the midpoint of the top edge of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.midtop
+ (5, 0)
+ >>> r.midtop = (40, 50)
+ >>> r
+ Rect(left=35, top=50, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(MIDTOP)
+ if self._enableFloat:
+ return Point(x=self._left + (self._width / 2.0), y=self._top)
+ else:
+ return Point(x=self._left + (self._width // 2), y=self._top)
+
+ @midtop.setter
+ def midtop(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newMidTop, newTop = value
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ if (newMidTop != self._left + self._width / 2.0) or (newTop != self._top): # Only run this code if the size/position has changed.
+ self._left = newMidTop - (self._width / 2.0)
+ self._top = newTop
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+ else:
+ if (newMidTop != self._left + self._width // 2) or (newTop != self._top): # Only run this code if the size/position has changed.
+ self._left = int(newMidTop) - (self._width // 2)
+ self._top = int(newTop)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # MIDDLE OF BOTTOM SIDE PROPERTY
+ @property
+ def midbottom(self):
+ """
+ The x and y coordinates for the midpoint of the bottom edge of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.midbottom
+ (5, 20)
+ >>> r.midbottom = (40, 50)
+ >>> r
+ Rect(left=35, top=30, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(MIDBOTTOM)
+ if self._enableFloat:
+ return Point(x=self._left + (self._width / 2.0), y=self._top + self._height)
+ else:
+ return Point(x=self._left + (self._width // 2), y=self._top + self._height)
+
+ @midbottom.setter
+ def midbottom(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newMidBottom, newBottom = value
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ if (newMidBottom != self._left + self._width / 2.0) or (newBottom != self._top + self._height): # Only run this code if the size/position has changed.
+ self._left = newMidBottom - (self._width / 2.0)
+ self._top = newBottom - self._height
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+ else:
+ if (newMidBottom != self._left + self._width // 2) or (newBottom != self._top + self._height): # Only run this code if the size/position has changed.
+ self._left = int(newMidBottom) - (self._width // 2)
+ self._top = int(newBottom) - self._height
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # MIDDLE OF LEFT SIDE PROPERTY
+ @property
+ def midleft(self):
+ """
+ The x and y coordinates for the midpoint of the left edge of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.midleft
+ (0, 10)
+ >>> r.midleft = (40, 50)
+ >>> r
+ Rect(left=40, top=40, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(MIDLEFT)
+ if self._enableFloat:
+ return Point(x=self._left, y=self._top + (self._height / 2.0))
+ else:
+ return Point(x=self._left, y=self._top + (self._height // 2))
+
+
+ @midleft.setter
+ def midleft(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newLeft, newMidLeft = value
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ if (newLeft != self._left) or (newMidLeft != self._top + (self._height / 2.0)): # Only run this code if the size/position has changed.
+ self._left = newLeft
+ self._top = newMidLeft - (self._height / 2.0)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+ else:
+ if (newLeft != self._left) or (newMidLeft != self._top + (self._height // 2)): # Only run this code if the size/position has changed.
+ self._left = int(newLeft)
+ self._top = int(newMidLeft) - (self._height // 2)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # MIDDLE OF RIGHT SIDE PROPERTY
+ @property
+ def midright(self):
+ """
+ The x and y coordinates for the midpoint of the right edge of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.midright
+ (10, 10)
+ >>> r.midright = (40, 50)
+ >>> r
+ Rect(left=30, top=40, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(MIDRIGHT)
+ if self._enableFloat:
+ return Point(x=self._left + self._width, y=self._top + (self._height / 2.0))
+ else:
+ return Point(x=self._left + self._width, y=self._top + (self._height // 2))
+
+
+ @midright.setter
+ def midright(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newRight, newMidRight = value
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ if (newRight != self._left + self._width) or (newMidRight != self._top + self._height / 2.0): # Only run this code if the size/position has changed.
+ self._left = newRight - self._width
+ self._top = newMidRight - (self._height / 2.0)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+ else:
+ if (newRight != self._left + self._width) or (newMidRight != self._top + self._height // 2): # Only run this code if the size/position has changed.
+ self._left = int(newRight) - self._width
+ self._top = int(newMidRight) - (self._height // 2)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # CENTER POINT PROPERTY
+ @property
+ def center(self):
+ """
+ The x and y coordinates for the center of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.center
+ (5, 10)
+ >>> r.center = (40, 50)
+ >>> r
+ Rect(left=35, top=40, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(CENTER)
+ if self._enableFloat:
+ return Point(x=self._left + (self._width / 2.0), y=self._top + (self._height / 2.0))
+ else:
+ return Point(x=self._left + (self._width // 2), y=self._top + (self._height // 2))
+
+ @center.setter
+ def center(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newCenterx, newCentery = value
+ originalLeft = self._left
+ originalTop = self._top
+ if self._enableFloat:
+ if (newCenterx != self._left + self._width / 2.0) or (newCentery != self._top + self._height / 2.0): # Only run this code if the size/position has changed.
+ self._left = newCenterx - (self._width / 2.0)
+ self._top = newCentery - (self._height / 2.0)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+ else:
+ if (newCenterx != self._left + self._width // 2) or (newCentery != self._top + self._height // 2): # Only run this code if the size/position has changed.
+ self._left = int(newCenterx) - (self._width // 2)
+ self._top = int(newCentery) - (self._height // 2)
+ self.callOnChange(originalLeft, originalTop, self._width, self._height)
+
+
+ # X COORDINATE OF CENTER POINT PROPERTY
+ @property
+ def centerx(self):
+ """
+ The x coordinate for the center of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.centerx
+ 5
+ >>> r.centerx = 50
+ >>> r
+ Rect(left=45, top=0, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(CENTERX)
+ if self._enableFloat:
+ return self._left + (self._width / 2.0)
+ else:
+ return self._left + (self._width // 2)
+
+ @centerx.setter
+ def centerx(self, newCenterx):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newCenterx)
+ originalLeft = self._left
+ if self._enableFloat:
+ if (newCenterx != self._left + self._width / 2.0): # Only run this code if the size/position has changed.
+ self._left = newCenterx - (self._width / 2.0)
+ self.callOnChange(originalLeft, self._top, self._width, self._height)
+ else:
+ if (newCenterx != self._left + self._width // 2): # Only run this code if the size/position has changed.
+ self._left = int(newCenterx) - (self._width // 2)
+ self.callOnChange(originalLeft, self._top, self._width, self._height)
+
+
+ # Y COORDINATE OF CENTER POINT PROPERTY
+ @property
+ def centery(self):
+ """
+ The y coordinate for the center of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.centery
+ 10
+ >>> r.centery = 50
+ >>> r
+ Rect(left=0, top=40, width=10, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(CENTERY)
+ if self._enableFloat:
+ return self._top + (self._height / 2.0)
+ else:
+ return self._top + (self._height // 2)
+
+ @centery.setter
+ def centery(self, newCentery):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newCentery)
+ originalTop = self._top
+ if self._enableFloat:
+ if (newCentery != self._top + self._height / 2.0): # Only run this code if the size/position has changed.
+ self._top = newCentery - (self._height / 2.0)
+ self.callOnChange(self._left, originalTop, self._width, self._height)
+ else:
+ if (newCentery != self._top + self._height // 2): # Only run this code if the size/position has changed.
+ self._top = int(newCentery) - (self._height // 2)
+ self.callOnChange(self._left, originalTop, self._width, self._height)
+
+
+ # SIZE PROPERTY (i.e. (width, height))
+ @property
+ def size(self):
+ """
+ The width and height of the rectangle, as a tuple.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.size
+ (10, 20)
+ >>> r.size = (40, 50)
+ >>> r
+ Rect(left=0, top=0, width=40, height=50)
+ """
+ if self.onRead is not None:
+ self.onRead(SIZE)
+ return Size(width=self._width, height=self._height)
+
+ @size.setter
+ def size(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForTwoIntOrFloatTuple(value)
+ newWidth, newHeight = value
+ if newWidth != self._width or newHeight != self._height:
+ originalWidth = self._width
+ originalHeight = self._height
+ if self._enableFloat:
+ self._width = newWidth
+ self._height = newHeight
+ else:
+ self._width = int(newWidth)
+ self._height = int(newHeight)
+ self.callOnChange(self._left, self._top, originalWidth, originalHeight)
+
+
+ # WIDTH PROPERTY
+ @property
+ def width(self):
+ """
+ The width of the rectangle. `w` is an alias for `width`.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.width
+ 10
+ >>> r.width = 50
+ >>> r
+ Rect(left=0, top=0, width=50, height=20)
+ """
+ if self.onRead is not None:
+ self.onRead(WIDTH)
+ return self._width
+
+ @width.setter
+ def width(self, newWidth):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newWidth)
+ if (newWidth != self._width): # Only run this code if the size/position has changed.
+ originalWidth = self._width
+ if self._enableFloat:
+ self._width = newWidth
+ else:
+ self._width = int(newWidth)
+ self.callOnChange(self._left, self._top, originalWidth, self._height)
+
+ w = width
+
+
+ # HEIGHT PROPERTY
+ @property
+ def height(self):
+ """
+ The height of the rectangle. `h` is an alias for `height`
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.height
+ 20
+ >>> r.height = 50
+ >>> r
+ Rect(left=0, top=0, width=10, height=50)
+ """
+ if self.onRead is not None:
+ self.onRead(HEIGHT)
+ return self._height
+
+ @height.setter
+ def height(self, newHeight):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(newHeight)
+ if (newHeight != self._height): # Only run this code if the size/position has changed.
+ originalHeight = self._height
+ if self._enableFloat:
+ self._height = newHeight
+ else:
+ self._height = int(newHeight)
+ self.callOnChange(self._left, self._top, self._width, originalHeight)
+
+ h = height
+
+
+ # AREA PROPERTY
+ @property
+ def area(self):
+ """The area of the `Rect`, which is simply the width times the height.
+ This is a read-only attribute.
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.area
+ 200
+ """
+ if self.onRead is not None:
+ self.onRead(AREA)
+ return self._width * self._height
+
+
+ # BOX PROPERTY
+ @property
+ def box(self):
+ """A tuple of four integers: (left, top, width, height).
+
+ >>> r = Rect(0, 0, 10, 20)
+ >>> r.box
+ (0, 0, 10, 20)
+ >>> r.box = (5, 15, 100, 200)
+ >>> r.box
+ (5, 15, 100, 200)"""
+ if self.onRead is not None:
+ self.onRead(BOX)
+ return Box(left=self._left, top=self._top, width=self._width, height=self._height)
+
+ @box.setter
+ def box(self, value):
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForFourIntOrFloatTuple(value)
+ newLeft, newTop, newWidth, newHeight = value
+ if (newLeft != self._left) or (newTop != self._top) or (newWidth != self._width) or (newHeight != self._height):
+ originalLeft = self._left
+ originalTop = self._top
+ originalWidth = self._width
+ originalHeight = self._height
+ if self._enableFloat:
+ self._left = float(newLeft)
+ self._top = float(newTop)
+ self._width = float(newWidth)
+ self._height = float(newHeight)
+ else:
+ self._left = int(newLeft)
+ self._top = int(newTop)
+ self._width = int(newWidth)
+ self._height = int(newHeight)
+ self.callOnChange(originalLeft, originalTop, originalWidth, originalHeight)
+
+
+ def get(self, rectAttrName):
+ # Access via the properties so that it triggers onRead().
+ if rectAttrName == TOP:
+ return self.top
+ elif rectAttrName == BOTTOM:
+ return self.bottom
+ elif rectAttrName == LEFT:
+ return self.left
+ elif rectAttrName == RIGHT:
+ return self.right
+ elif rectAttrName == TOPLEFT:
+ return self.topleft
+ elif rectAttrName == TOPRIGHT:
+ return self.topright
+ elif rectAttrName == BOTTOMLEFT:
+ return self.bottomleft
+ elif rectAttrName == BOTTOMRIGHT:
+ return self.bottomright
+ elif rectAttrName == MIDTOP:
+ return self.midtop
+ elif rectAttrName == MIDBOTTOM:
+ return self.midbottom
+ elif rectAttrName == MIDLEFT:
+ return self.midleft
+ elif rectAttrName == MIDRIGHT:
+ return self.midright
+ elif rectAttrName == CENTER:
+ return self.center
+ elif rectAttrName == CENTERX:
+ return self.centerx
+ elif rectAttrName == CENTERY:
+ return self.centery
+ elif rectAttrName == WIDTH:
+ return self.width
+ elif rectAttrName == HEIGHT:
+ return self.height
+ elif rectAttrName == SIZE:
+ return self.size
+ elif rectAttrName == AREA:
+ return self.area
+ elif rectAttrName == BOX:
+ return self.box
+ else:
+ raise PyRectException("'%s' is not a valid attribute name" % (rectAttrName))
+
+
+ def set(self, rectAttrName, value):
+ # Set via the properties so that it triggers onChange().
+ if rectAttrName == TOP:
+ self.top = value
+ elif rectAttrName == BOTTOM:
+ self.bottom = value
+ elif rectAttrName == LEFT:
+ self.left = value
+ elif rectAttrName == RIGHT:
+ self.right = value
+ elif rectAttrName == TOPLEFT:
+ self.topleft = value
+ elif rectAttrName == TOPRIGHT:
+ self.topright = value
+ elif rectAttrName == BOTTOMLEFT:
+ self.bottomleft = value
+ elif rectAttrName == BOTTOMRIGHT:
+ self.bottomright = value
+ elif rectAttrName == MIDTOP:
+ self.midtop = value
+ elif rectAttrName == MIDBOTTOM:
+ self.midbottom = value
+ elif rectAttrName == MIDLEFT:
+ self.midleft = value
+ elif rectAttrName == MIDRIGHT:
+ self.midright = value
+ elif rectAttrName == CENTER:
+ self.center = value
+ elif rectAttrName == CENTERX:
+ self.centerx = value
+ elif rectAttrName == CENTERY:
+ self.centery = value
+ elif rectAttrName == WIDTH:
+ self.width = value
+ elif rectAttrName == HEIGHT:
+ self.height = value
+ elif rectAttrName == SIZE:
+ self.size = value
+ elif rectAttrName == AREA:
+ raise PyRectException('area is a read-only attribute')
+ elif rectAttrName == BOX:
+ self.box = value
+ else:
+ raise PyRectException("'%s' is not a valid attribute name" % (rectAttrName))
+
+
+ def move(self, xOffset, yOffset):
+ """Moves this Rect object by the given offsets. The xOffset and yOffset
+ arguments can be any integer value, positive or negative.
+ >>> r = Rect(0, 0, 100, 100)
+ >>> r.move(10, 20)
+ >>> r
+ Rect(left=10, top=20, width=100, height=100)
+ """
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ _checkForIntOrFloat(xOffset)
+ _checkForIntOrFloat(yOffset)
+ if self._enableFloat:
+ self._left += xOffset
+ self._top += yOffset
+ else:
+ self._left += int(xOffset)
+ self._top += int(yOffset)
+
+
+ def copy(self):
+ """Return a copied `Rect` object with the same position and size as this
+ `Rect` object.
+
+ >>> r1 = Rect(0, 0, 100, 150)
+ >>> r2 = r1.copy()
+ >>> r1 == r2
+ True
+ >>> r2
+ Rect(left=0, top=0, width=100, height=150)
+ """
+ return Rect(self._left, self._top, self._width, self._height, self._enableFloat, self._readOnly)
+
+
+ def inflate(self, widthChange=0, heightChange=0):
+ """Increases the size of this Rect object by the given offsets. The
+ rectangle's center doesn't move. Negative values will shrink the
+ rectangle.
+
+ >>> r = Rect(0, 0, 100, 150)
+ >>> r.inflate(20, 40)
+ >>> r
+ Rect(left=-10, top=-20, width=120, height=190)
+ """
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ originalCenter = self.center
+ self.width += widthChange
+ self.height += heightChange
+ self.center = originalCenter
+
+
+ def clamp(self, otherRect):
+ """Centers this Rect object at the center of otherRect.
+
+ >>> r1 =Rect(0, 0, 100, 100)
+ >>> r2 = Rect(-20, -90, 50, 50)
+ >>> r2.clamp(r1)
+ >>> r2
+ Rect(left=25, top=25, width=50, height=50)
+ >>> r1.center == r2.center
+ True
+ """
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ self.center = otherRect.center
+
+ '''
+ def intersection(self, otherRect):
+ """Returns a new Rect object of the overlapping area between this
+ Rect object and otherRect.
+
+ `clip()` is an alias for `intersection()`.
+ """
+ pass
+
+ clip = intersection
+ '''
+
+ def union(self, otherRect):
+ """Adjusts the width and height to also cover the area of `otherRect`.
+
+ >>> r1 = Rect(0, 0, 100, 100)
+ >>> r2 = Rect(-10, -10, 100, 100)
+ >>> r1.union(r2)
+ >>> r1
+ Rect(left=-10, top=-10, width=110, height=110)
+ """
+
+ # TODO - Change otherRect so that it could be a point as well.
+
+ unionLeft = min(self._left, otherRect._left)
+ unionTop = min(self._top, otherRect._top)
+ unionRight = max(self.right, otherRect.right)
+ unionBottom = max(self.bottom, otherRect.bottom)
+
+ self._left = unionLeft
+ self._top = unionTop
+ self._width = unionRight - unionLeft
+ self._height = unionBottom - unionTop
+
+
+ def unionAll(self, otherRects):
+ """Adjusts the width and height to also cover all the `Rect` objects in
+ the `otherRects` sequence.
+
+ >>> r = Rect(0, 0, 100, 100)
+ >>> r1 = Rect(0, 0, 150, 100)
+ >>> r2 = Rect(-10, -10, 100, 100)
+ >>> r.unionAll([r1, r2])
+ >>> r
+ Rect(left=-10, top=-10, width=160, height=110)
+ """
+
+ # TODO - Change otherRect so that it could be a point as well.
+
+ otherRects = list(otherRects)
+ otherRects.append(self)
+
+ unionLeft = min([r._left for r in otherRects])
+ unionTop = min([r._top for r in otherRects])
+ unionRight = max([r.right for r in otherRects])
+ unionBottom = max([r.bottom for r in otherRects])
+
+ self._left = unionLeft
+ self._top = unionTop
+ self._width = unionRight - unionLeft
+ self._height = unionBottom - unionTop
+
+ """
+ def fit(self, other):
+ pass # TODO - needs to be complete
+ """
+
+
+ def normalize(self):
+ """Rect objects with a negative width or height cover a region where the
+ right/bottom edge is to the left/above of the left/top edge, respectively.
+ The `normalize()` method sets the `width` and `height` to positive if they
+ were negative.
+
+ The Rect stays in the same place, though with the `top` and `left`
+ attributes representing the true top and left side.
+
+ >>> r = Rect(0, 0, -10, -20)
+ >>> r.normalize()
+ >>> r
+ Rect(left=-10, top=-20, width=10, height=20)
+ """
+ if self._readOnly:
+ raise PyRectException('Rect object is read-only')
+
+ if self._width < 0:
+ self._width = -self._width
+ self._left -= self._width
+ if self._height < 0:
+ self._height = -self._height
+ self._top -= self._height
+ # Note: No need to intify here, since the four attributes should already be ints and no multiplication was done.
+
+
+ def __contains__(self, value): # for either points or other Rect objects. For Rects, the *entire* Rect must be in this Rect.
+ if isinstance(value, Rect):
+ return value.topleft in self and value.topright in self and value.bottomleft in self and value.bottomright in self
+
+ # Check if value is an (x, y) sequence or a (left, top, width, height) sequence.
+ try:
+ len(value)
+ except:
+ raise PyRectException('in requires an (x, y) tuple, a (left, top, width, height) tuple, or a Rect object as left operand, not %s' % (value.__class__.__name__))
+
+ if len(value) == 2:
+ # Assume that value is an (x, y) sequence.
+ _checkForTwoIntOrFloatTuple(value)
+ x, y = value
+ return self._left < x < self._left + self._width and self._top < y < self._top + self._height
+
+ elif len(value) == 4:
+ # Assume that value is an (x, y) sequence.
+ _checkForFourIntOrFloatTuple(value)
+ left, top, width, height = value
+ return (left, top) in self and (left + width, top) in self and (left, top + height) in self and (left + width, top + height) in self
+ else:
+ raise PyRectException('in requires an (x, y) tuple, a (left, top, width, height) tuple, or a Rect object as left operand, not %s' % (value.__class__.__name__))
+
+
+ def collide(self, value):
+ """Returns `True` if value collides with this `Rect` object, where value can
+ be an (x, y) tuple, a (left, top, width, height) box tuple, or another `Rect`
+ object. If value represents a rectangular area, any part of that area
+ can collide with this `Rect` object to make `collide()` return `True`.
+ Otherwise, returns `False`."""
+
+ # Note: This code is similar to __contains__(), with some minor changes
+ # because __contains__() requires the rectangular are to be COMPELTELY
+ # within the Rect object.
+ if isinstance(value, Rect):
+ return value.topleft in self or value.topright in self or value.bottomleft in self or value.bottomright in self
+
+ # Check if value is an (x, y) sequence or a (left, top, width, height) sequence.
+ try:
+ len(value)
+ except:
+ raise PyRectException('in requires an (x, y) tuple, a (left, top, width, height) tuple, or a Rect object as left operand, not %s' % (value.__class__.__name__))
+
+ if len(value) == 2:
+ # Assume that value is an (x, y) sequence.
+ _checkForTwoIntOrFloatTuple(value)
+ x, y = value
+ return self._left < x < self._left + self._width and self._top < y < self._top + self._height
+
+ elif len(value) == 4:
+ # Assume that value is an (x, y) sequence.
+ left, top, width, height = value
+ return (left, top) in self or (left + width, top) in self or (left, top + height) in self or (left + width, top + height) in self
+ else:
+ raise PyRectException('in requires an (x, y) tuple, a (left, top, width, height) tuple, or a Rect object as left operand, not %s' % (value.__class__.__name__))
+
+
+ '''
+ def collideAny(self, rectsOrPoints):
+ """Returns True if any of the (x, y) or (left, top, width, height)
+ tuples in rectsOrPoints is inside this Rect object.
+
+ >> r = Rect(0, 0, 100, 100)
+ >> p1 = (150, 80)
+ >> p2 = (100, 100) # This point collides.
+ >> r.collideAny([p1, p2])
+ True
+ >> r1 = Rect(50, 50, 10, 20) # This Rect collides.
+ >> r.collideAny([r1])
+ True
+ >> r.collideAny([p1, p2, r1])
+ True
+ """
+ # TODO - needs to be complete
+ pass # returns True or False
+ raise NotImplementedError
+'''
+
+ '''
+ def collideAll(self, rectsOrPoints):
+ """Returns True if all of the (x, y) or (left, top, width, height)
+ tuples in rectsOrPoints is inside this Rect object.
+ """
+
+ pass # return a list of all rects or points that collide with any other in the argument
+ raise NotImplementedError
+'''
+
+ # TODO - Add overloaded operators for + - * / and others once we can determine actual use cases for them.
+
+ """NOTE: All of the comparison magic methods compare the box tuple of Rect
+ objects. This is the behavior of the pygame Rect objects. Originally,
+ I thought about having the <, <=, >, and >= operators compare the area
+ of Rect objects. But at the same time, I wanted to have == and != compare
+ not just area, but all four left, top, width, and height attributes.
+ But that's weird to have different comparison operators comparing different
+ features of a rectangular area. So I just defaulted to what Pygame does
+ and compares the box tuple. This means that the == and != operators are
+ the only really useful comparison operators, so I decided to ditch the
+ other operators altogether and just have Rect only support == and !=.
+ """
+
+ def __eq__(self, other):
+ if isinstance(other, Rect):
+ return other.box == self.box
+ else:
+ raise PyRectException('Rect objects can only be compared with other Rect objects')
+
+
+ def __ne__(self, other):
+ if isinstance(other, Rect):
+ return other.box != self.box
+ else:
+ raise PyRectException('Rect objects can only be compared with other Rect objects')
+
+
+
+if __name__ == '__main__':
+ print(doctest.testmod())
+
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyscreeze/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyscreeze/__init__.py
new file mode 100644
index 00000000..a4810c42
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyscreeze/__init__.py
@@ -0,0 +1,500 @@
+# PyScreeze
+# by Al Sweigart
+# https://github.com/asweigart/pyscreeze
+# BSD license
+
+"""
+So, apparently Pillow support on Ubuntu 64-bit has several additional steps since it doesn't have JPEG/PNG support out of the box. Description here:
+
+https://stackoverflow.com/questions/7648200/pip-install-pil-e-tickets-1-no-jpeg-png-support
+http://ubuntuforums.org/showthread.php?t=1751455
+"""
+
+__version__ = '0.1.21'
+
+import collections
+import datetime
+import os
+import subprocess
+import sys
+import time
+import errno
+try:
+ from PIL import Image
+ from PIL import ImageOps
+except ImportError:
+ pass
+from contextlib import contextmanager
+
+try:
+ import cv2, numpy
+ useOpenCV = True
+ RUNNING_CV_2 = cv2.__version__[0] < '3'
+except ImportError:
+ useOpenCV = False
+
+RUNNING_PYTHON_2 = sys.version_info[0] == 2
+if useOpenCV:
+ if RUNNING_CV_2:
+ LOAD_COLOR = cv2.CV_LOAD_IMAGE_COLOR
+ LOAD_GRAYSCALE = cv2.CV_LOAD_IMAGE_GRAYSCALE
+ else:
+ LOAD_COLOR = cv2.IMREAD_COLOR
+ LOAD_GRAYSCALE = cv2.IMREAD_GRAYSCALE
+
+
+GRAYSCALE_DEFAULT = False
+
+# For version 0.1.19 I changed it so that ImageNotFoundException was raised
+# instead of returning None. In hindsight, this change came too late, so I'm
+# changing it back to returning None. But I'm also including this option for
+# folks who would rather have it raise an exception.
+USE_IMAGE_NOT_FOUND_EXCEPTION = False
+
+scrotExists = False
+try:
+ if sys.platform not in ('java', 'darwin', 'win32'):
+ whichProc = subprocess.Popen(
+ ['which', 'scrot'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ scrotExists = whichProc.wait() == 0
+except OSError as ex:
+ if ex.errno == errno.ENOENT:
+ # if there is no "which" program to find scrot, then assume there
+ # is no scrot.
+ pass
+ else:
+ raise
+
+
+if sys.platform == 'win32':
+ from ctypes import windll
+
+ # win32 DC(DeviceContext) Manager
+ @contextmanager
+ def __win32_openDC(hWnd):
+ hDC = windll.user32.GetDC(hWnd)
+ if hDC == 0: #NULL
+ raise WindowsError("windll.user32.GetDC failed : return NULL")
+ try:
+ yield hDC
+ finally:
+ if windll.user32.ReleaseDC(hWnd, hDC) == 0:
+ raise WindowsError("windll.user32.ReleaseDC failed : return 0")
+
+Box = collections.namedtuple('Box', 'left top width height')
+Point = collections.namedtuple('Point', 'x y')
+RGB = collections.namedtuple('RGB', 'red green blue')
+
+class ImageNotFoundException(Exception):
+ pass # This is an exception class raised when the locate functions fail.
+
+
+def _load_cv2(img, grayscale=None):
+ # load images if given filename, or convert as needed to opencv
+ # Alpha layer just causes failures at this point, so flatten to RGB.
+ # RGBA: load with -1 * cv2.CV_LOAD_IMAGE_COLOR to preserve alpha
+ # to matchTemplate, need template and image to be the same wrt having alpha
+
+ if grayscale is None:
+ grayscale = GRAYSCALE_DEFAULT
+ if isinstance(img, str):
+ # The function imread loads an image from the specified file and
+ # returns it. If the image cannot be read (because of missing
+ # file, improper permissions, unsupported or invalid format),
+ # the function returns an empty matrix
+ # http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html
+ if grayscale:
+ img_cv = cv2.imread(img, LOAD_GRAYSCALE)
+ else:
+ img_cv = cv2.imread(img, LOAD_COLOR)
+ if img_cv is None:
+ raise IOError("Failed to read %s because file is missing, "
+ "has improper permissions, or is an "
+ "unsupported or invalid format" % img)
+ elif isinstance(img, numpy.ndarray):
+ # don't try to convert an already-gray image to gray
+ if grayscale and len(img.shape) == 3: # and img.shape[2] == 3:
+ img_cv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+ else:
+ img_cv = img
+ elif hasattr(img, 'convert'):
+ # assume its a PIL.Image, convert to cv format
+ img_array = numpy.array(img.convert('RGB'))
+ img_cv = img_array[:, :, ::-1].copy() # -1 does RGB -> BGR
+ if grayscale:
+ img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
+ else:
+ raise TypeError('expected an image filename, OpenCV numpy array, or PIL image')
+ return img_cv
+
+
+def _locateAll_opencv(needleImage, haystackImage, grayscale=None, limit=10000, region=None, step=1,
+ confidence=0.999):
+ """ faster but more memory-intensive than pure python
+ step 2 skips every other row and column = ~3x faster but prone to miss;
+ to compensate, the algorithm automatically reduces the confidence
+ threshold by 5% (which helps but will not avoid all misses).
+ limitations:
+ - OpenCV 3.x & python 3.x not tested
+ - RGBA images are treated as RBG (ignores alpha channel)
+ """
+ if grayscale is None:
+ grayscale = GRAYSCALE_DEFAULT
+
+ confidence = float(confidence)
+
+ needleImage = _load_cv2(needleImage, grayscale)
+ needleHeight, needleWidth = needleImage.shape[:2]
+ haystackImage = _load_cv2(haystackImage, grayscale)
+
+ if region:
+ haystackImage = haystackImage[region[1]:region[1]+region[3],
+ region[0]:region[0]+region[2]]
+ else:
+ region = (0, 0) # full image; these values used in the yield statement
+ if (haystackImage.shape[0] < needleImage.shape[0] or
+ haystackImage.shape[1] < needleImage.shape[1]):
+ # avoid semi-cryptic OpenCV error below if bad size
+ raise ValueError('needle dimension(s) exceed the haystack image or region dimensions')
+
+ if step == 2:
+ confidence *= 0.95
+ needleImage = needleImage[::step, ::step]
+ haystackImage = haystackImage[::step, ::step]
+ else:
+ step = 1
+
+ # get all matches at once, credit: https://stackoverflow.com/questions/7670112/finding-a-subimage-inside-a-numpy-image/9253805#9253805
+ result = cv2.matchTemplate(haystackImage, needleImage, cv2.TM_CCOEFF_NORMED)
+ match_indices = numpy.arange(result.size)[(result > confidence).flatten()]
+ matches = numpy.unravel_index(match_indices[:limit], result.shape)
+
+ if len(matches[0]) == 0:
+ if USE_IMAGE_NOT_FOUND_EXCEPTION:
+ raise ImageNotFoundException('Could not locate the image (highest confidence = %.3f)' % result.max())
+ else:
+ return
+
+ # use a generator for API consistency:
+ matchx = matches[1] * step + region[0] # vectorized
+ matchy = matches[0] * step + region[1]
+ for x, y in zip(matchx, matchy):
+ yield Box(x, y, needleWidth, needleHeight)
+
+
+def _locateAll_python(needleImage, haystackImage, grayscale=None, limit=None, region=None, step=1):
+ # setup all the arguments
+ if grayscale is None:
+ grayscale = GRAYSCALE_DEFAULT
+
+ needleFileObj = None
+ if isinstance(needleImage, str):
+ # 'image' is a filename, load the Image object
+ needleFileObj = open(needleImage, 'rb')
+ needleImage = Image.open(needleFileObj)
+
+ haystackFileObj = None
+ if isinstance(haystackImage, str):
+ # 'image' is a filename, load the Image object
+ haystackFileObj = open(haystackImage, 'rb')
+ haystackImage = Image.open(haystackFileObj)
+
+ if region is not None:
+ haystackImage = haystackImage.crop((region[0], region[1], region[0] + region[2], region[1] + region[3]))
+ else:
+ region = (0, 0) # set to 0 because the code always accounts for a region
+
+ if grayscale: # if grayscale mode is on, convert the needle and haystack images to grayscale
+ needleImage = ImageOps.grayscale(needleImage)
+ haystackImage = ImageOps.grayscale(haystackImage)
+ else:
+ # if not using grayscale, make sure we are comparing RGB images, not RGBA images.
+ if needleImage.mode == 'RGBA':
+ needleImage = needleImage.convert('RGB')
+ if haystackImage.mode == 'RGBA':
+ haystackImage = haystackImage.convert('RGB')
+
+ # setup some constants we'll be using in this function
+ needleWidth, needleHeight = needleImage.size
+ haystackWidth, haystackHeight = haystackImage.size
+
+ needleImageData = tuple(needleImage.getdata())
+ haystackImageData = tuple(haystackImage.getdata())
+
+ needleImageRows = [needleImageData[y * needleWidth:(y+1) * needleWidth] for y in range(needleHeight)] # LEFT OFF - check this
+ needleImageFirstRow = needleImageRows[0]
+
+ assert len(needleImageFirstRow) == needleWidth, 'For some reason, the calculated width of first row of the needle image is not the same as the width of the image.'
+ assert [len(row) for row in needleImageRows] == [needleWidth] * needleHeight, 'For some reason, the needleImageRows aren\'t the same size as the original image.'
+
+ numMatchesFound = 0
+
+ # NOTE: After running tests/benchmarks.py on the following code, it seem that having a step
+ # value greater than 1 does not give *any* significant performance improvements.
+ # Since using a step higher than 1 makes for less accurate matches, it will be
+ # set to 1.
+ step = 1 # hard-code step as 1 until a way to improve it can be figured out.
+
+ if step == 1:
+ firstFindFunc = _kmp
+ else:
+ firstFindFunc = _steppingFind
+
+
+ for y in range(haystackHeight): # start at the leftmost column
+ for matchx in firstFindFunc(needleImageFirstRow, haystackImageData[y * haystackWidth:(y+1) * haystackWidth], step):
+ foundMatch = True
+ for searchy in range(1, needleHeight, step):
+ haystackStart = (searchy + y) * haystackWidth + matchx
+ if needleImageData[searchy * needleWidth:(searchy+1) * needleWidth] != haystackImageData[haystackStart:haystackStart + needleWidth]:
+ foundMatch = False
+ break
+ if foundMatch:
+ # Match found, report the x, y, width, height of where the matching region is in haystack.
+ numMatchesFound += 1
+ yield Box(matchx + region[0], y + region[1], needleWidth, needleHeight)
+ if limit is not None and numMatchesFound >= limit:
+ # Limit has been reached. Close file handles.
+ if needleFileObj is not None:
+ needleFileObj.close()
+ if haystackFileObj is not None:
+ haystackFileObj.close()
+ return
+
+
+ # There was no limit or the limit wasn't reached, but close the file handles anyway.
+ if needleFileObj is not None:
+ needleFileObj.close()
+ if haystackFileObj is not None:
+ haystackFileObj.close()
+
+ if numMatchesFound == 0:
+ if USE_IMAGE_NOT_FOUND_EXCEPTION:
+ raise ImageNotFoundException('Could not locate the image.')
+ else:
+ return
+
+
+def locate(needleImage, haystackImage, **kwargs):
+ # Note: The gymnastics in this function is because we want to make sure to exhaust the iterator so that the needle and haystack files are closed in locateAll.
+ kwargs['limit'] = 1
+ points = tuple(locateAll(needleImage, haystackImage, **kwargs))
+ if len(points) > 0:
+ return points[0]
+ else:
+ if USE_IMAGE_NOT_FOUND_EXCEPTION:
+ raise ImageNotFoundException('Could not locate the image.')
+ else:
+ return None
+
+
+def locateOnScreen(image, minSearchTime=0, **kwargs):
+ """minSearchTime - amount of time in seconds to repeat taking
+ screenshots and trying to locate a match. The default of 0 performs
+ a single search.
+ """
+ start = time.time()
+ while True:
+ try:
+ screenshotIm = screenshot(region=None) # the locateAll() function must handle cropping to return accurate coordinates, so don't pass a region here.
+ retVal = locate(image, screenshotIm, **kwargs)
+ try:
+ screenshotIm.fp.close()
+ except AttributeError:
+ # Screenshots on Windows won't have an fp since they came from
+ # ImageGrab, not a file. Screenshots on Linux will have fp set
+ # to None since the file has been unlinked
+ pass
+ if retVal or time.time() - start > minSearchTime:
+ return retVal
+ except ImageNotFoundException:
+ if time.time() - start > minSearchTime:
+ if USE_IMAGE_NOT_FOUND_EXCEPTION:
+ raise
+ else:
+ return None
+
+
+def locateAllOnScreen(image, **kwargs):
+ screenshotIm = screenshot(region=None) # the locateAll() function must handle cropping to return accurate coordinates, so don't pass a region here.
+ retVal = locateAll(image, screenshotIm, **kwargs)
+ try:
+ screenshotIm.fp.close()
+ except AttributeError:
+ # Screenshots on Windows won't have an fp since they came from
+ # ImageGrab, not a file. Screenshots on Linux will have fp set
+ # to None since the file has been unlinked
+ pass
+ return retVal
+
+
+def locateCenterOnScreen(image, **kwargs):
+ coords = locateOnScreen(image, **kwargs)
+ return center(coords)
+
+
+def showRegionOnScreen(region, outlineColor='red', filename='_showRegionOnScreen.png'):
+ from PIL import ImageDraw # this is the only function that needs this, and it's rarely called
+ screenshotIm = screenshot()
+ draw = ImageDraw.Draw(screenshotIm)
+ region = (region[0], region[1], region[2] + region[0], region[3] + region[1]) # convert from (left, top, right, bottom) to (left, top, width, height)
+ draw.rectangle(region, outline=outlineColor)
+ screenshotIm.save(filename)
+
+
+def _screenshot_win32(imageFilename=None, region=None):
+ try:
+ im = ImageGrab.grab()
+ except NameError:
+ raise ImportError('Pillow module must be installed to use screenshot functions on Windows.')
+ if region is not None:
+ assert len(region) == 4, 'region argument must be a tuple of four ints'
+ region = [int(x) for x in region]
+ im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
+ if imageFilename is not None:
+ im.save(imageFilename)
+ return im
+
+
+def _screenshot_osx(imageFilename=None, region=None):
+ if imageFilename is None:
+ tmpFilename = 'screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))
+ else:
+ tmpFilename = imageFilename
+ subprocess.call(['screencapture', '-x', tmpFilename])
+ im = Image.open(tmpFilename)
+
+ if region is not None:
+ assert len(region) == 4, 'region argument must be a tuple of four ints'
+ region = [int(x) for x in region]
+ im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
+ os.unlink(tmpFilename) # delete image of entire screen to save cropped version
+ im.save(tmpFilename)
+ else:
+ # force loading before unlinking, Image.open() is lazy
+ im.load()
+
+ if imageFilename is None:
+ os.unlink(tmpFilename)
+ return im
+
+
+def _screenshot_linux(imageFilename=None, region=None):
+ if not scrotExists:
+ raise NotImplementedError('"scrot" must be installed to use screenshot functions in Linux. Run: sudo apt-get install scrot')
+ if imageFilename is None:
+ tmpFilename = '.screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))
+ else:
+ tmpFilename = imageFilename
+ if scrotExists:
+ subprocess.call(['scrot', tmpFilename])
+ im = Image.open(tmpFilename)
+
+ if region is not None:
+ assert len(region) == 4, 'region argument must be a tuple of four ints'
+ region = [int(x) for x in region]
+ im = im.crop((region[0], region[1], region[2] + region[0], region[3] + region[1]))
+ os.unlink(tmpFilename) # delete image of entire screen to save cropped version
+ im.save(tmpFilename)
+ else:
+ # force loading before unlinking, Image.open() is lazy
+ im.load()
+
+ if imageFilename is None:
+ os.unlink(tmpFilename)
+ return im
+ else:
+ raise Exception('The scrot program must be installed to take a screenshot with PyScreeze on Linux. Run: sudo apt-get install scrot')
+
+
+
+def _kmp(needle, haystack, _dummy): # Knuth-Morris-Pratt search algorithm implementation (to be used by screen capture)
+ # build table of shift amounts
+ shifts = [1] * (len(needle) + 1)
+ shift = 1
+ for pos in range(len(needle)):
+ while shift <= pos and needle[pos] != needle[pos-shift]:
+ shift += shifts[pos-shift]
+ shifts[pos+1] = shift
+
+ # do the actual search
+ startPos = 0
+ matchLen = 0
+ for c in haystack:
+ while matchLen == len(needle) or \
+ matchLen >= 0 and needle[matchLen] != c:
+ startPos += shifts[matchLen]
+ matchLen -= shifts[matchLen]
+ matchLen += 1
+ if matchLen == len(needle):
+ yield startPos
+
+
+def _steppingFind(needle, haystack, step):
+ for startPos in range(0, len(haystack) - len(needle) + 1):
+ foundMatch = True
+ for pos in range(0, len(needle), step):
+ if haystack[startPos + pos] != needle[pos]:
+ foundMatch = False
+ break
+ if foundMatch:
+ yield startPos
+
+
+def center(coords):
+ return Point(coords[0] + int(coords[2] / 2), coords[1] + int(coords[3] / 2))
+
+
+def pixelMatchesColor(x, y, expectedRGBColor, tolerance=0):
+ pix = pixel(x, y)
+ if len(pix) == 3 or len(expectedRGBColor) == 3: #RGB mode
+ r, g, b = pix[:3]
+ exR, exG, exB = expectedRGBColor[:3]
+ return (abs(r - exR) <= tolerance) and (abs(g - exG) <= tolerance) and (abs(b - exB) <= tolerance)
+ elif len(pix) == 4 and len(expectedRGBColor) == 4: #RGBA mode
+ r, g, b, a = pix
+ exR, exG, exB, exA = expectedRGBColor
+ return (abs(r - exR) <= tolerance) and (abs(g - exG) <= tolerance) and (abs(b - exB) <= tolerance) and (abs(a - exA) <= tolerance)
+ else:
+ assert False, 'Color mode was expected to be length 3 (RGB) or 4 (RGBA), but pixel is length %s and expectedRGBColor is length %s' % (len(pix), len(expectedRGBColor))
+
+def pixel(x, y):
+ if sys.platform == 'win32':
+ # On Windows, calling GetDC() and GetPixel() is twice as fast as using our screenshot() function.
+ with __win32_openDC(0) as hdc: # handle will be released automatically
+ color = windll.gdi32.GetPixel(hdc, x, y)
+ if color < 0:
+ raise WindowsError("windll.gdi32.GetPixel faild : return {}".format(color))
+ # color is in the format 0xbbggrr https://msdn.microsoft.com/en-us/library/windows/desktop/dd183449(v=vs.85).aspx
+ bbggrr = "{:0>6x}".format(color) # bbggrr => 'bbggrr' (hex)
+ b, g, r = (int(bbggrr[i:i+2], 16) for i in range(0, 6, 2))
+ return (r, g, b)
+ else:
+ # Need to select only the first three values of the color in
+ # case the returned pixel has an alpha channel
+ return RGB(*(screenshot().getpixel((x, y))[:3]))
+
+
+# set the screenshot() function based on the platform running this module
+if sys.platform.startswith('java'):
+ raise NotImplementedError('Jython is not yet supported by PyScreeze.')
+elif sys.platform == 'darwin':
+ screenshot = _screenshot_osx
+elif sys.platform == 'win32':
+ screenshot = _screenshot_win32
+ try:
+ from PIL import ImageGrab
+ except ImportError:
+ pass
+else:
+ screenshot = _screenshot_linux
+
+grab = screenshot # for compatibility with Pillow/PIL's ImageGrab module.
+
+# set the locateAll function to use opencv if possible; python 3 needs opencv 3.0+
+if useOpenCV:
+ locateAll = _locateAll_opencv
+ if not RUNNING_PYTHON_2 and cv2.__version__ < '3':
+ locateAll = _locateAll_python
+else:
+ locateAll = _locateAll_python
diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pytweening/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pytweening/__init__.py
new file mode 100644
index 00000000..38b9c6b8
--- /dev/null
+++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pytweening/__init__.py
@@ -0,0 +1,594 @@
+from __future__ import division
+
+import math
+
+__version__ = '1.0.3'
+
+
+# from http://www.roguebasin.com/index.php?title=Bresenham%27s_Line_Algorithm#Python
+def getLine(x1, y1, x2, y2):
+ """Returns a list of (x, y) tuples of every point on a line between
+ (x1, y1) and (x2, y2). The x and y values inside the tuple are integers.
+
+ Line generated with the Bresenham algorithm.
+
+ Args:
+ x1 (int, float): The x coordinate of the line's start point.
+ y1 (int, float): The y coordinate of the line's start point.
+ x2 (int, float): The x coordinate of the line's end point.
+ y2 (int, float): The y coordiante of the line's end point.
+
+ Returns:
+ [(x1, y1), (x2, y2), (x3, y3), ...]
+
+ Example:
+ >>> getLine(0, 0, 6, 6)
+ [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]
+ >>> getLine(0, 0, 3, 6)
+ [(0, 0), (0, 1), (1, 2), (1, 3), (2, 4), (2, 5), (3, 6)]
+ >>> getLine(3, 3, -3, -3)
+ [(3, 3), (2, 2), (1, 1), (0, 0), (-1, -1), (-2, -2), (-3, -3)]
+ """
+ x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
+ points = []
+ issteep = abs(y2-y1) > abs(x2-x1)
+ if issteep:
+ x1, y1 = y1, x1
+ x2, y2 = y2, x2
+ rev = False
+ if x1 > x2:
+ x1, x2 = x2, x1
+ y1, y2 = y2, y1
+ rev = True
+ deltax = x2 - x1
+ deltay = abs(y2-y1)
+ error = int(deltax / 2)
+ y = y1
+ ystep = None
+ if y1 < y2:
+ ystep = 1
+ else:
+ ystep = -1
+ for x in range(x1, x2 + 1):
+ if issteep:
+ points.append((y, x))
+ else:
+ points.append((x, y))
+ error -= deltay
+ if error < 0:
+ y += ystep
+ error += deltax
+ # Reverse the list if the coordinates were reversed
+ if rev:
+ points.reverse()
+ return points
+
+
+def getPointOnLine(x1, y1, x2, y2, n):
+ """Returns the (x, y) tuple of the point that has progressed a proportion
+ n along the line defined by the two x, y coordinates.
+
+ Args:
+ x1 (int, float): The x coordinate of the line's start point.
+ y1 (int, float): The y coordinate of the line's start point.
+ x2 (int, float): The x coordinate of the line's end point.
+ y2 (int, float): The y coordiante of the line's end point.
+ n (float): Progress along the line. 0.0 is the start point, 1.0 is the end point. 0.5 is the midpoint. This value can be less than 0.0 or greater than 1.0.
+
+ Returns:
+ Tuple of floats for the x, y coordinate of the point.
+
+ Example:
+ >>> getPointOnLine(0, 0, 6, 6, 0)
+ (0, 0)
+ >>> getPointOnLine(0, 0, 6, 6, 1)
+ (6, 6)
+ >>> getPointOnLine(0, 0, 6, 6, 0.5)
+ (3.0, 3.0)
+ >>> getPointOnLine(0, 0, 6, 6, 0.75)
+ (4.5, 4.5)
+ >>> getPointOnLine(3, 3, -3, -3, 0.5)
+ (0.0, 0.0)
+ >>> getPointOnLine(3, 3, -3, -3, 0.25)
+ (1.5, 1.5)
+ >>> getPointOnLine(3, 3, -3, -3, 0.75)
+ (-1.5, -1.5)
+ """
+ x = ((x2 - x1) * n) + x1
+ y = ((y2 - y1) * n) + y1
+ return (x, y)
+
+
+def _checkRange(n):
+ """Raises ValueError if the argument is not between 0.0 and 1.0.
+ """
+ if not 0.0 <= n <= 1.0:
+ raise ValueError('Argument must be between 0.0 and 1.0.')
+
+
+def linear(n):
+ """A linear tween function
+
+ Example:
+ >>> linear(0.0)
+ 0.0
+ >>> linear(0.2)
+ 0.2
+ >>> linear(0.4)
+ 0.4
+ >>> linear(0.6)
+ 0.6
+ >>> linear(0.8)
+ 0.8
+ >>> linear(1.0)
+ 1.0
+ """
+ _checkRange(n)
+ return n
+
+
+def easeInQuad(n):
+ """A quadratic tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return n**2
+
+
+def easeOutQuad(n):
+ """A quadratic tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return -n * (n-2)
+
+
+def easeInOutQuad(n):
+ """A quadratic tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n < 0.5:
+ return 2 * n**2
+ else:
+ n = n * 2 - 1
+ return -0.5 * (n*(n-2) - 1)
+
+
+def easeInCubic(n):
+ """A cubic tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return n**3
+
+
+def easeOutCubic(n):
+ """A cubic tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n - 1
+ return n**3 + 1
+
+
+def easeInOutCubic(n):
+ """A cubic tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = 2 * n
+ if n < 1:
+ return 0.5 * n**3
+ else:
+ n = n - 2
+ return 0.5 * (n**3 + 2)
+
+
+def easeInQuart(n):
+ """A quartic tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return n**4
+
+
+def easeOutQuart(n):
+ """A quartic tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n - 1
+ return -(n**4 - 1)
+
+
+def easeInOutQuart(n):
+ """A quartic tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = 2 * n
+ if n < 1:
+ return 0.5 * n**4
+ else:
+ n = n - 2
+ return -0.5 * (n**4 - 2)
+
+
+def easeInQuint(n):
+ """A quintic tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return n**5
+
+
+def easeOutQuint(n):
+ """A quintic tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n - 1
+ return n**5 + 1
+
+
+def easeInOutQuint(n):
+ """A quintic tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = 2 * n
+ if n < 1:
+ return 0.5 * n**5
+ else:
+ n = n - 2
+ return 0.5 * (n**5 + 2)
+
+
+def easeInSine(n):
+ """A sinusoidal tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return -1 * math.cos(n * math.pi / 2) + 1
+
+
+def easeOutSine(n):
+ """A sinusoidal tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return math.sin(n * math.pi / 2)
+
+
+def easeInOutSine(n):
+ """A sinusoidal tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return -0.5 * (math.cos(math.pi * n) - 1)
+
+
+def easeInExpo(n):
+ """An exponential tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n == 0:
+ return 0
+ else:
+ return 2**(10 * (n - 1))
+
+
+def easeOutExpo(n):
+ """An exponential tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n == 1:
+ return 1
+ else:
+ return -(2 ** (-10 * n)) + 1
+
+
+def easeInOutExpo(n):
+ """An exponential tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n == 0:
+ return 0
+ elif n == 1:
+ return 1
+ else:
+ n = n * 2
+ if n < 1:
+ return 0.5 * 2**(10 * (n - 1))
+ else:
+ n -= 1
+ # 0.5 * (-() + 2)
+ return 0.5 * (-1 * (2 ** (-10 * n)) + 2)
+
+
+def easeInCirc(n):
+ """A circular tween function that begins slow and then accelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return -1 * (math.sqrt(1 - n * n) - 1)
+
+
+def easeOutCirc(n):
+ """A circular tween function that begins fast and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n -= 1
+ return math.sqrt(1 - (n * n))
+
+
+def easeInOutCirc(n):
+ """A circular tween function that accelerates, reaches the midpoint, and then decelerates.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n * 2
+ if n < 1:
+ return -0.5 * (math.sqrt(1 - n**2) - 1)
+ else:
+ n = n - 2
+ return 0.5 * (math.sqrt(1 - n**2) + 1)
+
+
+def easeInElastic(n, amplitude=1, period=0.3):
+ """An elastic tween function that begins with an increasing wobble and then snaps into the destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return 1 - easeOutElastic(1-n, amplitude=amplitude, period=period)
+
+
+def easeOutElastic(n, amplitude=1, period=0.3):
+ """An elastic tween function that overshoots the destination and then "rubber bands" into the destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+
+ if amplitude < 1:
+ amplitude = 1
+ s = period / 4
+ else:
+ s = period / (2 * math.pi) * math.asin(1 / amplitude)
+
+ return amplitude * 2**(-10*n) * math.sin((n-s)*(2*math.pi / period)) + 1
+
+
+def easeInOutElastic(n, amplitude=1, period=0.5):
+ """An elastic tween function wobbles towards the midpoint.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n *= 2
+ if n < 1:
+ return easeInElastic(n, amplitude=amplitude, period=period) / 2
+ else:
+ return easeOutElastic(n-1, amplitude=amplitude, period=period) / 2 + 0.5
+
+
+def easeInBack(n, s=1.70158):
+ """A tween function that backs up first at the start and then goes to the destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return n * n * ((s + 1) * n - s)
+
+
+def easeOutBack(n, s=1.70158):
+ """A tween function that overshoots the destination a little and then backs into the destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n - 1
+ return n * n * ((s + 1) * n + s) + 1
+
+
+def easeInOutBack(n, s=1.70158):
+ """A "back-in" tween function that overshoots both the start and destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ n = n * 2
+ if n < 1:
+ s *= 1.525
+ return 0.5 * (n * n * ((s + 1) * n - s))
+ else:
+ n -= 2
+ s *= 1.525
+ return 0.5 * (n * n * ((s + 1) * n + s) + 2)
+
+
+def easeInBounce(n):
+ """A bouncing tween function that begins bouncing and then jumps to the destination.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ return 1 - easeOutBounce(1 - n)
+
+
+def easeOutBounce(n):
+ """A bouncing tween function that hits the destination and then bounces to rest.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n < (1/2.75):
+ return 7.5625 * n * n
+ elif n < (2/2.75):
+ n -= (1.5/2.75)
+ return 7.5625 * n * n + 0.75
+ elif n < (2.5/2.75):
+ n -= (2.25/2.75)
+ return 7.5625 * n * n + 0.9375
+ else:
+ n -= (2.65/2.75)
+ return 7.5625 * n * n + 0.984375
+
+
+def easeInOutBounce(n):
+ """A bouncing tween function that bounces at the start and end.
+
+ Args:
+ n (float): The time progress, starting at 0.0 and ending at 1.0.
+
+ Returns:
+ (float) The line progress, starting at 0.0 and ending at 1.0. Suitable for passing to getPointOnLine().
+ """
+ _checkRange(n)
+ if n < 0.5:
+ return easeInBounce(n * 2) * 0.5
+ else:
+ return easeOutBounce(n * 2 - 1) * 0.5 + 0.5
diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/UIAutomationClient.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/UIAutomationClient.py
new file mode 100644
index 00000000..9972201f
--- /dev/null
+++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/UIAutomationClient.py
@@ -0,0 +1,3 @@
+from comtypes.gen import _944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0
+globals().update(_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.__dict__)
+__name__ = 'comtypes.gen.UIAutomationClient'
\ No newline at end of file
diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_00020430_0000_0000_C000_000000000046_0_2_0.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_00020430_0000_0000_C000_000000000046_0_2_0.py
new file mode 100644
index 00000000..7d983e6e
--- /dev/null
+++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_00020430_0000_0000_C000_000000000046_0_2_0.py
@@ -0,0 +1,396 @@
+# -*- coding: mbcs -*-
+typelib_path = 'C:\\Windows\\System32\\stdole2.tlb'
+_lcid = 0 # change this if required
+from ctypes import *
+from ctypes.wintypes import VARIANT_BOOL
+FONTITALIC = VARIANT_BOOL
+from comtypes import IUnknown
+OLE_COLOR = c_ulong
+FONTUNDERSCORE = VARIANT_BOOL
+from comtypes.automation import IDispatch
+from comtypes import GUID
+from comtypes import BSTR
+from comtypes import dispid
+from comtypes import DISPMETHOD, DISPPROPERTY, helpstring
+FONTSTRIKETHROUGH = VARIANT_BOOL
+OLE_XPOS_PIXELS = c_int
+OLE_HANDLE = c_int
+OLE_XSIZE_HIMETRIC = c_int
+OLE_YSIZE_HIMETRIC = c_int
+OLE_XPOS_HIMETRIC = c_int
+OLE_YPOS_HIMETRIC = c_int
+from ctypes import HRESULT
+from comtypes import helpstring
+from comtypes import COMMETHOD
+from comtypes import CoClass
+FONTNAME = BSTR
+from comtypes import GUID
+FONTSIZE = c_longlong
+OLE_YPOS_PIXELS = c_int
+OLE_XSIZE_PIXELS = c_int
+from comtypes.automation import DISPPARAMS
+OLE_YSIZE_PIXELS = c_int
+OLE_XPOS_CONTAINER = c_float
+from comtypes.automation import IEnumVARIANT
+OLE_YPOS_CONTAINER = c_float
+OLE_XSIZE_CONTAINER = c_float
+OLE_YSIZE_CONTAINER = c_float
+from comtypes.automation import EXCEPINFO
+OLE_OPTEXCLUSIVE = VARIANT_BOOL
+OLE_CANCELBOOL = VARIANT_BOOL
+OLE_ENABLEDEFAULTBOOL = VARIANT_BOOL
+FONTBOLD = VARIANT_BOOL
+
+
+class FontEvents(IDispatch):
+ _case_insensitive_ = True
+ 'Event interface for the Font object'
+ _iid_ = GUID('{4EF6100A-AF88-11D0-9846-00C04FC29993}')
+ _idlflags_ = ['hidden']
+ _methods_ = []
+FontEvents._disp_methods_ = [
+ DISPMETHOD([dispid(9)], None, 'FontChanged',
+ ( ['in'], BSTR, 'PropertyName' )),
+]
+
+# values for enumeration 'LoadPictureConstants'
+Default = 0
+Monochrome = 1
+VgaColor = 2
+Color = 4
+LoadPictureConstants = c_int # enum
+class Picture(IDispatch):
+ _case_insensitive_ = True
+ _iid_ = GUID('{7BF80981-BF32-101A-8BBB-00AA00300CAB}')
+ _idlflags_ = []
+ _methods_ = []
+Picture._disp_methods_ = [
+ DISPPROPERTY([dispid(0), 'readonly'], OLE_HANDLE, 'Handle'),
+ DISPPROPERTY([dispid(2)], OLE_HANDLE, 'hPal'),
+ DISPPROPERTY([dispid(3), 'readonly'], c_short, 'Type'),
+ DISPPROPERTY([dispid(4), 'readonly'], OLE_XSIZE_HIMETRIC, 'Width'),
+ DISPPROPERTY([dispid(5), 'readonly'], OLE_YSIZE_HIMETRIC, 'Height'),
+ DISPMETHOD([dispid(6)], None, 'Render',
+ ( [], c_int, 'hdc' ),
+ ( [], c_int, 'x' ),
+ ( [], c_int, 'y' ),
+ ( [], c_int, 'cx' ),
+ ( [], c_int, 'cy' ),
+ ( [], OLE_XPOS_HIMETRIC, 'xSrc' ),
+ ( [], OLE_YPOS_HIMETRIC, 'ySrc' ),
+ ( [], OLE_XSIZE_HIMETRIC, 'cxSrc' ),
+ ( [], OLE_YSIZE_HIMETRIC, 'cySrc' ),
+ ( [], c_void_p, 'prcWBounds' )),
+]
+IPictureDisp = Picture
+class IFont(IUnknown):
+ _case_insensitive_ = True
+ 'Font Object'
+ _iid_ = GUID('{BEF6E002-A874-101A-8BBA-00AA00300CAB}')
+ _idlflags_ = ['hidden']
+IFont._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'Name',
+ ( ['out', 'retval'], POINTER(BSTR), 'pname' )),
+ COMMETHOD(['propput'], HRESULT, 'Name',
+ ( ['in'], BSTR, 'pname' )),
+ COMMETHOD(['propget'], HRESULT, 'Size',
+ ( ['out', 'retval'], POINTER(c_longlong), 'psize' )),
+ COMMETHOD(['propput'], HRESULT, 'Size',
+ ( ['in'], c_longlong, 'psize' )),
+ COMMETHOD(['propget'], HRESULT, 'Bold',
+ ( ['out', 'retval'], POINTER(VARIANT_BOOL), 'pbold' )),
+ COMMETHOD(['propput'], HRESULT, 'Bold',
+ ( ['in'], VARIANT_BOOL, 'pbold' )),
+ COMMETHOD(['propget'], HRESULT, 'Italic',
+ ( ['out', 'retval'], POINTER(VARIANT_BOOL), 'pitalic' )),
+ COMMETHOD(['propput'], HRESULT, 'Italic',
+ ( ['in'], VARIANT_BOOL, 'pitalic' )),
+ COMMETHOD(['propget'], HRESULT, 'Underline',
+ ( ['out', 'retval'], POINTER(VARIANT_BOOL), 'punderline' )),
+ COMMETHOD(['propput'], HRESULT, 'Underline',
+ ( ['in'], VARIANT_BOOL, 'punderline' )),
+ COMMETHOD(['propget'], HRESULT, 'Strikethrough',
+ ( ['out', 'retval'], POINTER(VARIANT_BOOL), 'pstrikethrough' )),
+ COMMETHOD(['propput'], HRESULT, 'Strikethrough',
+ ( ['in'], VARIANT_BOOL, 'pstrikethrough' )),
+ COMMETHOD(['propget'], HRESULT, 'Weight',
+ ( ['out', 'retval'], POINTER(c_short), 'pweight' )),
+ COMMETHOD(['propput'], HRESULT, 'Weight',
+ ( ['in'], c_short, 'pweight' )),
+ COMMETHOD(['propget'], HRESULT, 'Charset',
+ ( ['out', 'retval'], POINTER(c_short), 'pcharset' )),
+ COMMETHOD(['propput'], HRESULT, 'Charset',
+ ( ['in'], c_short, 'pcharset' )),
+ COMMETHOD(['propget'], HRESULT, 'hFont',
+ ( ['out', 'retval'], POINTER(OLE_HANDLE), 'phfont' )),
+ COMMETHOD([], HRESULT, 'Clone',
+ ( ['out'], POINTER(POINTER(IFont)), 'ppfont' )),
+ COMMETHOD([], HRESULT, 'IsEqual',
+ ( ['in'], POINTER(IFont), 'pfontOther' )),
+ COMMETHOD([], HRESULT, 'SetRatio',
+ ( ['in'], c_int, 'cyLogical' ),
+ ( ['in'], c_int, 'cyHimetric' )),
+ COMMETHOD([], HRESULT, 'AddRefHfont',
+ ( ['in'], OLE_HANDLE, 'hFont' )),
+ COMMETHOD([], HRESULT, 'ReleaseHfont',
+ ( ['in'], OLE_HANDLE, 'hFont' )),
+]
+################################################################
+## code template for IFont implementation
+##class IFont_Impl(object):
+## def _get(self):
+## '-no docstring-'
+## #return pname
+## def _set(self, pname):
+## '-no docstring-'
+## Name = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return psize
+## def _set(self, psize):
+## '-no docstring-'
+## Size = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return pbold
+## def _set(self, pbold):
+## '-no docstring-'
+## Bold = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return pitalic
+## def _set(self, pitalic):
+## '-no docstring-'
+## Italic = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return punderline
+## def _set(self, punderline):
+## '-no docstring-'
+## Underline = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return pstrikethrough
+## def _set(self, pstrikethrough):
+## '-no docstring-'
+## Strikethrough = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return pweight
+## def _set(self, pweight):
+## '-no docstring-'
+## Weight = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return pcharset
+## def _set(self, pcharset):
+## '-no docstring-'
+## Charset = property(_get, _set, doc = _set.__doc__)
+##
+## @property
+## def hFont(self):
+## '-no docstring-'
+## #return phfont
+##
+## def Clone(self):
+## '-no docstring-'
+## #return ppfont
+##
+## def IsEqual(self, pfontOther):
+## '-no docstring-'
+## #return
+##
+## def SetRatio(self, cyLogical, cyHimetric):
+## '-no docstring-'
+## #return
+##
+## def AddRefHfont(self, hFont):
+## '-no docstring-'
+## #return
+##
+## def ReleaseHfont(self, hFont):
+## '-no docstring-'
+## #return
+##
+
+class StdPicture(CoClass):
+ _reg_clsid_ = GUID('{0BE35204-8F91-11CE-9DE3-00AA004BB851}')
+ _idlflags_ = []
+ _typelib_path_ = typelib_path
+ _reg_typelib_ = ('{00020430-0000-0000-C000-000000000046}', 2, 0)
+class IPicture(IUnknown):
+ _case_insensitive_ = True
+ 'Picture Object'
+ _iid_ = GUID('{7BF80980-BF32-101A-8BBB-00AA00300CAB}')
+ _idlflags_ = ['hidden']
+StdPicture._com_interfaces_ = [Picture, IPicture]
+
+class Library(object):
+ 'OLE Automation'
+ name = 'stdole'
+ _reg_typelib_ = ('{00020430-0000-0000-C000-000000000046}', 2, 0)
+
+IFontEventsDisp = FontEvents
+class StdFont(CoClass):
+ _reg_clsid_ = GUID('{0BE35203-8F91-11CE-9DE3-00AA004BB851}')
+ _idlflags_ = []
+ _typelib_path_ = typelib_path
+ _reg_typelib_ = ('{00020430-0000-0000-C000-000000000046}', 2, 0)
+class Font(IDispatch):
+ _case_insensitive_ = True
+ _iid_ = GUID('{BEF6E003-A874-101A-8BBA-00AA00300CAB}')
+ _idlflags_ = []
+ _methods_ = []
+StdFont._com_interfaces_ = [Font, IFont]
+StdFont._outgoing_interfaces_ = [FontEvents]
+
+IPicture._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'Handle',
+ ( ['out', 'retval'], POINTER(OLE_HANDLE), 'phandle' )),
+ COMMETHOD(['propget'], HRESULT, 'hPal',
+ ( ['out', 'retval'], POINTER(OLE_HANDLE), 'phpal' )),
+ COMMETHOD(['propget'], HRESULT, 'Type',
+ ( ['out', 'retval'], POINTER(c_short), 'ptype' )),
+ COMMETHOD(['propget'], HRESULT, 'Width',
+ ( ['out', 'retval'], POINTER(OLE_XSIZE_HIMETRIC), 'pwidth' )),
+ COMMETHOD(['propget'], HRESULT, 'Height',
+ ( ['out', 'retval'], POINTER(OLE_YSIZE_HIMETRIC), 'pheight' )),
+ COMMETHOD([], HRESULT, 'Render',
+ ( ['in'], c_int, 'hdc' ),
+ ( ['in'], c_int, 'x' ),
+ ( ['in'], c_int, 'y' ),
+ ( ['in'], c_int, 'cx' ),
+ ( ['in'], c_int, 'cy' ),
+ ( ['in'], OLE_XPOS_HIMETRIC, 'xSrc' ),
+ ( ['in'], OLE_YPOS_HIMETRIC, 'ySrc' ),
+ ( ['in'], OLE_XSIZE_HIMETRIC, 'cxSrc' ),
+ ( ['in'], OLE_YSIZE_HIMETRIC, 'cySrc' ),
+ ( ['in'], c_void_p, 'prcWBounds' )),
+ COMMETHOD(['propput'], HRESULT, 'hPal',
+ ( ['in'], OLE_HANDLE, 'phpal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurDC',
+ ( ['out', 'retval'], POINTER(c_int), 'phdcOut' )),
+ COMMETHOD([], HRESULT, 'SelectPicture',
+ ( ['in'], c_int, 'hdcIn' ),
+ ( ['out'], POINTER(c_int), 'phdcOut' ),
+ ( ['out'], POINTER(OLE_HANDLE), 'phbmpOut' )),
+ COMMETHOD(['propget'], HRESULT, 'KeepOriginalFormat',
+ ( ['out', 'retval'], POINTER(VARIANT_BOOL), 'pfkeep' )),
+ COMMETHOD(['propput'], HRESULT, 'KeepOriginalFormat',
+ ( ['in'], VARIANT_BOOL, 'pfkeep' )),
+ COMMETHOD([], HRESULT, 'PictureChanged'),
+ COMMETHOD([], HRESULT, 'SaveAsFile',
+ ( ['in'], c_void_p, 'pstm' ),
+ ( ['in'], VARIANT_BOOL, 'fSaveMemCopy' ),
+ ( ['out'], POINTER(c_int), 'pcbSize' )),
+ COMMETHOD(['propget'], HRESULT, 'Attributes',
+ ( ['out', 'retval'], POINTER(c_int), 'pdwAttr' )),
+ COMMETHOD([], HRESULT, 'SetHdc',
+ ( ['in'], OLE_HANDLE, 'hdc' )),
+]
+################################################################
+## code template for IPicture implementation
+##class IPicture_Impl(object):
+## @property
+## def Handle(self):
+## '-no docstring-'
+## #return phandle
+##
+## def _get(self):
+## '-no docstring-'
+## #return phpal
+## def _set(self, phpal):
+## '-no docstring-'
+## hPal = property(_get, _set, doc = _set.__doc__)
+##
+## @property
+## def Type(self):
+## '-no docstring-'
+## #return ptype
+##
+## @property
+## def Width(self):
+## '-no docstring-'
+## #return pwidth
+##
+## @property
+## def Height(self):
+## '-no docstring-'
+## #return pheight
+##
+## def Render(self, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurDC(self):
+## '-no docstring-'
+## #return phdcOut
+##
+## def SelectPicture(self, hdcIn):
+## '-no docstring-'
+## #return phdcOut, phbmpOut
+##
+## def _get(self):
+## '-no docstring-'
+## #return pfkeep
+## def _set(self, pfkeep):
+## '-no docstring-'
+## KeepOriginalFormat = property(_get, _set, doc = _set.__doc__)
+##
+## def PictureChanged(self):
+## '-no docstring-'
+## #return
+##
+## def SaveAsFile(self, pstm, fSaveMemCopy):
+## '-no docstring-'
+## #return pcbSize
+##
+## @property
+## def Attributes(self):
+## '-no docstring-'
+## #return pdwAttr
+##
+## def SetHdc(self, hdc):
+## '-no docstring-'
+## #return
+##
+
+
+# values for enumeration 'OLE_TRISTATE'
+Unchecked = 0
+Checked = 1
+Gray = 2
+OLE_TRISTATE = c_int # enum
+Font._disp_methods_ = [
+ DISPPROPERTY([dispid(0)], BSTR, 'Name'),
+ DISPPROPERTY([dispid(2)], c_longlong, 'Size'),
+ DISPPROPERTY([dispid(3)], VARIANT_BOOL, 'Bold'),
+ DISPPROPERTY([dispid(4)], VARIANT_BOOL, 'Italic'),
+ DISPPROPERTY([dispid(5)], VARIANT_BOOL, 'Underline'),
+ DISPPROPERTY([dispid(6)], VARIANT_BOOL, 'Strikethrough'),
+ DISPPROPERTY([dispid(7)], c_short, 'Weight'),
+ DISPPROPERTY([dispid(8)], c_short, 'Charset'),
+]
+IFontDisp = Font
+__all__ = [ 'OLE_TRISTATE', 'FONTITALIC', 'OLE_OPTEXCLUSIVE', 'Font',
+ 'OLE_ENABLEDEFAULTBOOL', 'OLE_YPOS_CONTAINER',
+ 'OLE_XPOS_HIMETRIC', 'OLE_XSIZE_CONTAINER', 'IPictureDisp',
+ 'OLE_YSIZE_CONTAINER', 'OLE_XPOS_CONTAINER',
+ 'OLE_CANCELBOOL', 'LoadPictureConstants', 'Color',
+ 'FONTBOLD', 'OLE_HANDLE', 'Checked', 'Default', 'FONTSIZE',
+ 'StdPicture', 'StdFont', 'FontEvents', 'FONTSTRIKETHROUGH',
+ 'IPicture', 'Unchecked', 'OLE_XSIZE_HIMETRIC', 'IFont',
+ 'Monochrome', 'OLE_COLOR', 'Gray', 'OLE_YPOS_HIMETRIC',
+ 'OLE_YPOS_PIXELS', 'OLE_YSIZE_PIXELS', 'OLE_XPOS_PIXELS',
+ 'IFontEventsDisp', 'IFontDisp', 'FONTUNDERSCORE',
+ 'OLE_XSIZE_PIXELS', 'VgaColor', 'Picture',
+ 'OLE_YSIZE_HIMETRIC', 'FONTNAME']
+from comtypes import _check_version; _check_version('')
diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py
new file mode 100644
index 00000000..9a6fd0f5
--- /dev/null
+++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py
@@ -0,0 +1,5044 @@
+# -*- coding: mbcs -*-
+typelib_path = 'UIAutomationCore.dll'
+_lcid = 0 # change this if required
+from ctypes import *
+import comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0
+from comtypes import GUID
+from ctypes import HRESULT
+from comtypes import helpstring
+from comtypes import COMMETHOD
+from comtypes import dispid
+from ctypes.wintypes import tagPOINT
+from comtypes.automation import VARIANT
+from comtypes.automation import _midlSAFEARRAY
+from comtypes import BSTR
+from comtypes import IUnknown
+from ctypes.wintypes import tagRECT
+from comtypes import CoClass
+from ctypes.wintypes import tagRECT
+from comtypes.automation import IDispatch
+WSTRING = c_wchar_p
+
+
+UIA_WindowWindowInteractionStatePropertyId = 30076 # Constant c_int
+UIA_FlowsFromPropertyId = 30148 # Constant c_int
+UIA_WindowWindowVisualStatePropertyId = 30075 # Constant c_int
+UIA_Transform2ZoomMaximumPropertyId = 30147 # Constant c_int
+UIA_WindowCanMinimizePropertyId = 30074 # Constant c_int
+UIA_Transform2ZoomMinimumPropertyId = 30146 # Constant c_int
+class IUIAutomationTextRangeArray(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{CE4AE76A-E717-4C98-81EA-47371D028EB6}')
+ _idlflags_ = []
+class IUIAutomationTextRange(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{A543CC6A-F4AE-494B-8239-C814481187A8}')
+ _idlflags_ = []
+IUIAutomationTextRangeArray._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'Length',
+ ( ['out', 'retval'], POINTER(c_int), 'Length' )),
+ COMMETHOD([], HRESULT, 'GetElement',
+ ( ['in'], c_int, 'index' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'element' )),
+]
+################################################################
+## code template for IUIAutomationTextRangeArray implementation
+##class IUIAutomationTextRangeArray_Impl(object):
+## @property
+## def Length(self):
+## '-no docstring-'
+## #return Length
+##
+## def GetElement(self, index):
+## '-no docstring-'
+## #return element
+##
+
+UIA_WindowIsModalPropertyId = 30077 # Constant c_int
+UIA_IsTextEditPatternAvailablePropertyId = 30149 # Constant c_int
+UIA_AcceleratorKeyPropertyId = 30006 # Constant c_int
+UIA_WindowIsTopmostPropertyId = 30078 # Constant c_int
+UIA_AccessKeyPropertyId = 30007 # Constant c_int
+UIA_SelectionItemIsSelectedPropertyId = 30079 # Constant c_int
+UIA_HasKeyboardFocusPropertyId = 30008 # Constant c_int
+UIA_SelectionItemSelectionContainerPropertyId = 30080 # Constant c_int
+UIA_IsKeyboardFocusablePropertyId = 30009 # Constant c_int
+UIA_TableRowHeadersPropertyId = 30081 # Constant c_int
+UIA_IsEnabledPropertyId = 30010 # Constant c_int
+UIA_TableColumnHeadersPropertyId = 30082 # Constant c_int
+UIA_AutomationIdPropertyId = 30011 # Constant c_int
+UIA_TableRowOrColumnMajorPropertyId = 30083 # Constant c_int
+UIA_ClassNamePropertyId = 30012 # Constant c_int
+UIA_TableItemRowHeaderItemsPropertyId = 30084 # Constant c_int
+UIA_HelpTextPropertyId = 30013 # Constant c_int
+UIA_TableItemColumnHeaderItemsPropertyId = 30085 # Constant c_int
+UIA_ClickablePointPropertyId = 30014 # Constant c_int
+UIA_ToggleToggleStatePropertyId = 30086 # Constant c_int
+class IUIAutomationTextPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{32EBA289-3583-42C9-9C59-3B6D9A1E9B6A}')
+ _idlflags_ = []
+class IUIAutomationElement(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{D22108AA-8AC5-49A5-837B-37BBB3D7591E}')
+ _idlflags_ = []
+
+# values for enumeration 'SupportedTextSelection'
+SupportedTextSelection_None = 0
+SupportedTextSelection_Single = 1
+SupportedTextSelection_Multiple = 2
+SupportedTextSelection = c_int # enum
+IUIAutomationTextPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'RangeFromPoint',
+ ( ['in'], tagPOINT, 'pt' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+ COMMETHOD([], HRESULT, 'RangeFromChild',
+ ( ['in'], POINTER(IUIAutomationElement), 'child' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+ COMMETHOD([], HRESULT, 'GetSelection',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRangeArray)), 'ranges' )),
+ COMMETHOD([], HRESULT, 'GetVisibleRanges',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRangeArray)), 'ranges' )),
+ COMMETHOD(['propget'], HRESULT, 'DocumentRange',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+ COMMETHOD(['propget'], HRESULT, 'SupportedTextSelection',
+ ( ['out', 'retval'], POINTER(SupportedTextSelection), 'SupportedTextSelection' )),
+]
+################################################################
+## code template for IUIAutomationTextPattern implementation
+##class IUIAutomationTextPattern_Impl(object):
+## def RangeFromPoint(self, pt):
+## '-no docstring-'
+## #return range
+##
+## def RangeFromChild(self, child):
+## '-no docstring-'
+## #return range
+##
+## def GetSelection(self):
+## '-no docstring-'
+## #return ranges
+##
+## def GetVisibleRanges(self):
+## '-no docstring-'
+## #return ranges
+##
+## @property
+## def DocumentRange(self):
+## '-no docstring-'
+## #return range
+##
+## @property
+## def SupportedTextSelection(self):
+## '-no docstring-'
+## #return SupportedTextSelection
+##
+
+UIA_CulturePropertyId = 30015 # Constant c_int
+UIA_TransformCanMovePropertyId = 30087 # Constant c_int
+UIA_IsControlElementPropertyId = 30016 # Constant c_int
+UIA_TransformCanResizePropertyId = 30088 # Constant c_int
+UIA_IsContentElementPropertyId = 30017 # Constant c_int
+UIA_TransformCanRotatePropertyId = 30089 # Constant c_int
+UIA_LabeledByPropertyId = 30018 # Constant c_int
+UIA_IsLegacyIAccessiblePatternAvailablePropertyId = 30090 # Constant c_int
+UIA_IsPasswordPropertyId = 30019 # Constant c_int
+UIA_LegacyIAccessibleChildIdPropertyId = 30091 # Constant c_int
+UIA_NativeWindowHandlePropertyId = 30020 # Constant c_int
+UIA_LegacyIAccessibleNamePropertyId = 30092 # Constant c_int
+UIA_ItemTypePropertyId = 30021 # Constant c_int
+UIA_LegacyIAccessibleValuePropertyId = 30093 # Constant c_int
+UIA_IsOffscreenPropertyId = 30022 # Constant c_int
+UIA_LegacyIAccessibleDescriptionPropertyId = 30094 # Constant c_int
+UIA_OrientationPropertyId = 30023 # Constant c_int
+UIA_LegacyIAccessibleRolePropertyId = 30095 # Constant c_int
+UIA_FrameworkIdPropertyId = 30024 # Constant c_int
+UIA_LegacyIAccessibleStatePropertyId = 30096 # Constant c_int
+UIA_IsRequiredForFormPropertyId = 30025 # Constant c_int
+UIA_LegacyIAccessibleHelpPropertyId = 30097 # Constant c_int
+UIA_ItemStatusPropertyId = 30026 # Constant c_int
+UIA_LegacyIAccessibleKeyboardShortcutPropertyId = 30098 # Constant c_int
+UIA_IsDockPatternAvailablePropertyId = 30027 # Constant c_int
+UIA_LegacyIAccessibleSelectionPropertyId = 30099 # Constant c_int
+UIA_IsExpandCollapsePatternAvailablePropertyId = 30028 # Constant c_int
+UIA_LegacyIAccessibleDefaultActionPropertyId = 30100 # Constant c_int
+class IUIAutomationScrollItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{B488300F-D015-4F19-9C29-BB595E3645EF}')
+ _idlflags_ = []
+IUIAutomationScrollItemPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'ScrollIntoView'),
+]
+################################################################
+## code template for IUIAutomationScrollItemPattern implementation
+##class IUIAutomationScrollItemPattern_Impl(object):
+## def ScrollIntoView(self):
+## '-no docstring-'
+## #return
+##
+
+UIA_IsGridItemPatternAvailablePropertyId = 30029 # Constant c_int
+UIA_AriaRolePropertyId = 30101 # Constant c_int
+UIA_IsGridPatternAvailablePropertyId = 30030 # Constant c_int
+UIA_AriaPropertiesPropertyId = 30102 # Constant c_int
+UIA_IsInvokePatternAvailablePropertyId = 30031 # Constant c_int
+UIA_IsDataValidForFormPropertyId = 30103 # Constant c_int
+class IUIAutomationSelectionPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{5ED5202E-B2AC-47A6-B638-4B0BF140D78E}')
+ _idlflags_ = []
+class IUIAutomationElementArray(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{14314595-B4BC-4055-95F2-58F2E42C9855}')
+ _idlflags_ = []
+IUIAutomationSelectionPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetCurrentSelection',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanSelectMultiple',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsSelectionRequired',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedSelection',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanSelectMultiple',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsSelectionRequired',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationSelectionPattern implementation
+##class IUIAutomationSelectionPattern_Impl(object):
+## def GetCurrentSelection(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentCanSelectMultiple(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsSelectionRequired(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedSelection(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanSelectMultiple(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsSelectionRequired(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_IsMultipleViewPatternAvailablePropertyId = 30032 # Constant c_int
+UIA_ControllerForPropertyId = 30104 # Constant c_int
+UIA_IsRangeValuePatternAvailablePropertyId = 30033 # Constant c_int
+UIA_DescribedByPropertyId = 30105 # Constant c_int
+UIA_IsScrollPatternAvailablePropertyId = 30034 # Constant c_int
+UIA_FlowsToPropertyId = 30106 # Constant c_int
+UIA_IsScrollItemPatternAvailablePropertyId = 30035 # Constant c_int
+UIA_ProviderDescriptionPropertyId = 30107 # Constant c_int
+UIA_IsSelectionItemPatternAvailablePropertyId = 30036 # Constant c_int
+UIA_IsItemContainerPatternAvailablePropertyId = 30108 # Constant c_int
+UIA_IsSelectionPatternAvailablePropertyId = 30037 # Constant c_int
+UIA_IsVirtualizedItemPatternAvailablePropertyId = 30109 # Constant c_int
+UIA_IsTablePatternAvailablePropertyId = 30038 # Constant c_int
+UIA_IsSynchronizedInputPatternAvailablePropertyId = 30110 # Constant c_int
+UIA_IsTableItemPatternAvailablePropertyId = 30039 # Constant c_int
+UIA_OptimizeForVisualContentPropertyId = 30111 # Constant c_int
+UIA_IsTextPatternAvailablePropertyId = 30040 # Constant c_int
+UIA_IsObjectModelPatternAvailablePropertyId = 30112 # Constant c_int
+UIA_IsTogglePatternAvailablePropertyId = 30041 # Constant c_int
+UIA_AnnotationAnnotationTypeIdPropertyId = 30113 # Constant c_int
+UIA_IsTransformPatternAvailablePropertyId = 30042 # Constant c_int
+UIA_AnnotationAnnotationTypeNamePropertyId = 30114 # Constant c_int
+UIA_IsValuePatternAvailablePropertyId = 30043 # Constant c_int
+UIA_AnnotationAuthorPropertyId = 30115 # Constant c_int
+UIA_IsWindowPatternAvailablePropertyId = 30044 # Constant c_int
+UIA_AnnotationDateTimePropertyId = 30116 # Constant c_int
+UIA_ValueValuePropertyId = 30045 # Constant c_int
+UIA_AnnotationTargetPropertyId = 30117 # Constant c_int
+UIA_ValueIsReadOnlyPropertyId = 30046 # Constant c_int
+UIA_IsAnnotationPatternAvailablePropertyId = 30118 # Constant c_int
+UIA_RangeValueValuePropertyId = 30047 # Constant c_int
+UIA_IsTextPattern2AvailablePropertyId = 30119 # Constant c_int
+UIA_RangeValueIsReadOnlyPropertyId = 30048 # Constant c_int
+UIA_StylesStyleIdPropertyId = 30120 # Constant c_int
+class IUIAutomationSelectionItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{A8EFA66A-0FDA-421A-9194-38021F3578EA}')
+ _idlflags_ = []
+IUIAutomationSelectionItemPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Select'),
+ COMMETHOD([], HRESULT, 'AddToSelection'),
+ COMMETHOD([], HRESULT, 'RemoveFromSelection'),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsSelected',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentSelectionContainer',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsSelected',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedSelectionContainer',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationSelectionItemPattern implementation
+##class IUIAutomationSelectionItemPattern_Impl(object):
+## def Select(self):
+## '-no docstring-'
+## #return
+##
+## def AddToSelection(self):
+## '-no docstring-'
+## #return
+##
+## def RemoveFromSelection(self):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentIsSelected(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentSelectionContainer(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsSelected(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedSelectionContainer(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_RangeValueMinimumPropertyId = 30049 # Constant c_int
+UIA_StylesStyleNamePropertyId = 30121 # Constant c_int
+UIA_RangeValueMaximumPropertyId = 30050 # Constant c_int
+UIA_StylesFillColorPropertyId = 30122 # Constant c_int
+UIA_RangeValueLargeChangePropertyId = 30051 # Constant c_int
+UIA_StylesFillPatternStylePropertyId = 30123 # Constant c_int
+UIA_RangeValueSmallChangePropertyId = 30052 # Constant c_int
+UIA_StylesShapePropertyId = 30124 # Constant c_int
+UIA_ScrollHorizontalScrollPercentPropertyId = 30053 # Constant c_int
+UIA_StylesFillPatternColorPropertyId = 30125 # Constant c_int
+UIA_ScrollHorizontalViewSizePropertyId = 30054 # Constant c_int
+UIA_StylesExtendedPropertiesPropertyId = 30126 # Constant c_int
+UIA_ScrollVerticalScrollPercentPropertyId = 30055 # Constant c_int
+UIA_IsStylesPatternAvailablePropertyId = 30127 # Constant c_int
+UIA_ScrollVerticalViewSizePropertyId = 30056 # Constant c_int
+UIA_IsSpreadsheetPatternAvailablePropertyId = 30128 # Constant c_int
+class IUIAutomationTextPattern2(IUIAutomationTextPattern):
+ _case_insensitive_ = True
+ _iid_ = GUID('{506A921A-FCC9-409F-B23B-37EB74106872}')
+ _idlflags_ = []
+IUIAutomationTextPattern2._methods_ = [
+ COMMETHOD([], HRESULT, 'RangeFromAnnotation',
+ ( ['in'], POINTER(IUIAutomationElement), 'annotation' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+ COMMETHOD([], HRESULT, 'GetCaretRange',
+ ( ['out'], POINTER(c_int), 'isActive' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+]
+################################################################
+## code template for IUIAutomationTextPattern2 implementation
+##class IUIAutomationTextPattern2_Impl(object):
+## def RangeFromAnnotation(self, annotation):
+## '-no docstring-'
+## #return range
+##
+## def GetCaretRange(self):
+## '-no docstring-'
+## #return isActive, range
+##
+
+UIA_ScrollHorizontallyScrollablePropertyId = 30057 # Constant c_int
+UIA_SpreadsheetItemFormulaPropertyId = 30129 # Constant c_int
+UIA_ScrollVerticallyScrollablePropertyId = 30058 # Constant c_int
+UIA_SpreadsheetItemAnnotationObjectsPropertyId = 30130 # Constant c_int
+UIA_SelectionSelectionPropertyId = 30059 # Constant c_int
+UIA_SpreadsheetItemAnnotationTypesPropertyId = 30131 # Constant c_int
+UIA_SelectionCanSelectMultiplePropertyId = 30060 # Constant c_int
+UIA_IsSpreadsheetItemPatternAvailablePropertyId = 30132 # Constant c_int
+UIA_SelectionIsSelectionRequiredPropertyId = 30061 # Constant c_int
+UIA_Transform2CanZoomPropertyId = 30133 # Constant c_int
+UIA_GridRowCountPropertyId = 30062 # Constant c_int
+UIA_IsTransformPattern2AvailablePropertyId = 30134 # Constant c_int
+UIA_GridColumnCountPropertyId = 30063 # Constant c_int
+UIA_LiveSettingPropertyId = 30135 # Constant c_int
+UIA_GridItemRowPropertyId = 30064 # Constant c_int
+UIA_IsTextChildPatternAvailablePropertyId = 30136 # Constant c_int
+class IUIAutomationTextEditPattern(IUIAutomationTextPattern):
+ _case_insensitive_ = True
+ _iid_ = GUID('{17E21576-996C-4870-99D9-BFF323380C06}')
+ _idlflags_ = []
+IUIAutomationTextEditPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetActiveComposition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+ COMMETHOD([], HRESULT, 'GetConversionTarget',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+]
+################################################################
+## code template for IUIAutomationTextEditPattern implementation
+##class IUIAutomationTextEditPattern_Impl(object):
+## def GetActiveComposition(self):
+## '-no docstring-'
+## #return range
+##
+## def GetConversionTarget(self):
+## '-no docstring-'
+## #return range
+##
+
+UIA_GridItemColumnPropertyId = 30065 # Constant c_int
+UIA_IsDragPatternAvailablePropertyId = 30137 # Constant c_int
+UIA_GridItemRowSpanPropertyId = 30066 # Constant c_int
+UIA_DragIsGrabbedPropertyId = 30138 # Constant c_int
+UIA_GridItemColumnSpanPropertyId = 30067 # Constant c_int
+UIA_DragDropEffectPropertyId = 30139 # Constant c_int
+UIA_GridItemContainingGridPropertyId = 30068 # Constant c_int
+UIA_DragDropEffectsPropertyId = 30140 # Constant c_int
+UIA_DockDockPositionPropertyId = 30069 # Constant c_int
+UIA_IsDropTargetPatternAvailablePropertyId = 30141 # Constant c_int
+UIA_ExpandCollapseExpandCollapseStatePropertyId = 30070 # Constant c_int
+UIA_DropTargetDropTargetEffectPropertyId = 30142 # Constant c_int
+UIA_MultipleViewCurrentViewPropertyId = 30071 # Constant c_int
+UIA_DropTargetDropTargetEffectsPropertyId = 30143 # Constant c_int
+UIA_MultipleViewSupportedViewsPropertyId = 30072 # Constant c_int
+UIA_DragGrabbedItemsPropertyId = 30144 # Constant c_int
+UIA_WindowCanMaximizePropertyId = 30073 # Constant c_int
+UIA_Transform2ZoomLevelPropertyId = 30145 # Constant c_int
+StyleId_Custom = 70000 # Constant c_int
+AnnotationType_Unknown = 60000 # Constant c_int
+UIA_SummaryChangeId = 90000 # Constant c_int
+class IUIAutomationRangeValuePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{59213F4F-7346-49E5-B120-80555987A148}')
+ _idlflags_ = []
+IUIAutomationRangeValuePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'SetValue',
+ ( ['in'], c_double, 'val' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentValue',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsReadOnly',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentMaximum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentMinimum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLargeChange',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentSmallChange',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedValue',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsReadOnly',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedMaximum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedMinimum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLargeChange',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedSmallChange',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationRangeValuePattern implementation
+##class IUIAutomationRangeValuePattern_Impl(object):
+## def SetValue(self, val):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentValue(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsReadOnly(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentMaximum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentMinimum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLargeChange(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentSmallChange(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedValue(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsReadOnly(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedMaximum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedMinimum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLargeChange(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedSmallChange(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_ToolTipControlTypeId = 50022 # Constant c_int
+UIA_TreeControlTypeId = 50023 # Constant c_int
+UIA_TreeItemControlTypeId = 50024 # Constant c_int
+UIA_CustomControlTypeId = 50025 # Constant c_int
+UIA_GroupControlTypeId = 50026 # Constant c_int
+class IUIAutomationPropertyChangedEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{40CD37D4-C756-4B0C-8C6F-BDDFEEB13B50}')
+ _idlflags_ = ['oleautomation']
+IUIAutomationPropertyChangedEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandlePropertyChangedEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' ),
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], VARIANT, 'newValue' )),
+]
+################################################################
+## code template for IUIAutomationPropertyChangedEventHandler implementation
+##class IUIAutomationPropertyChangedEventHandler_Impl(object):
+## def HandlePropertyChangedEvent(self, sender, propertyId, newValue):
+## '-no docstring-'
+## #return
+##
+
+UIA_ThumbControlTypeId = 50027 # Constant c_int
+UIA_DataGridControlTypeId = 50028 # Constant c_int
+class IUIAutomationScrollPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{88F4D42A-E881-459D-A77C-73BBBB7E02DC}')
+ _idlflags_ = []
+
+# values for enumeration 'ScrollAmount'
+ScrollAmount_LargeDecrement = 0
+ScrollAmount_SmallDecrement = 1
+ScrollAmount_NoAmount = 2
+ScrollAmount_LargeIncrement = 3
+ScrollAmount_SmallIncrement = 4
+ScrollAmount = c_int # enum
+IUIAutomationScrollPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Scroll',
+ ( ['in'], ScrollAmount, 'horizontalAmount' ),
+ ( ['in'], ScrollAmount, 'verticalAmount' )),
+ COMMETHOD([], HRESULT, 'SetScrollPercent',
+ ( ['in'], c_double, 'horizontalPercent' ),
+ ( ['in'], c_double, 'verticalPercent' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHorizontalScrollPercent',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentVerticalScrollPercent',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHorizontalViewSize',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentVerticalViewSize',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHorizontallyScrollable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentVerticallyScrollable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHorizontalScrollPercent',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedVerticalScrollPercent',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHorizontalViewSize',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedVerticalViewSize',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHorizontallyScrollable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedVerticallyScrollable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationScrollPattern implementation
+##class IUIAutomationScrollPattern_Impl(object):
+## def Scroll(self, horizontalAmount, verticalAmount):
+## '-no docstring-'
+## #return
+##
+## def SetScrollPercent(self, horizontalPercent, verticalPercent):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentHorizontalScrollPercent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentVerticalScrollPercent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentHorizontalViewSize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentVerticalViewSize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentHorizontallyScrollable(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentVerticallyScrollable(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedHorizontalScrollPercent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedVerticalScrollPercent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedHorizontalViewSize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedVerticalViewSize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedHorizontallyScrollable(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedVerticallyScrollable(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_DataItemControlTypeId = 50029 # Constant c_int
+UIA_DocumentControlTypeId = 50030 # Constant c_int
+UIA_SplitButtonControlTypeId = 50031 # Constant c_int
+UIA_WindowControlTypeId = 50032 # Constant c_int
+class IUIAutomationStructureChangedEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{E81D1B4E-11C5-42F8-9754-E7036C79F054}')
+ _idlflags_ = ['oleautomation']
+
+# values for enumeration 'StructureChangeType'
+StructureChangeType_ChildAdded = 0
+StructureChangeType_ChildRemoved = 1
+StructureChangeType_ChildrenInvalidated = 2
+StructureChangeType_ChildrenBulkAdded = 3
+StructureChangeType_ChildrenBulkRemoved = 4
+StructureChangeType_ChildrenReordered = 5
+StructureChangeType = c_int # enum
+IUIAutomationStructureChangedEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandleStructureChangedEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' ),
+ ( ['in'], StructureChangeType, 'changeType' ),
+ ( ['in'], _midlSAFEARRAY(c_int), 'runtimeId' )),
+]
+################################################################
+## code template for IUIAutomationStructureChangedEventHandler implementation
+##class IUIAutomationStructureChangedEventHandler_Impl(object):
+## def HandleStructureChangedEvent(self, sender, changeType, runtimeId):
+## '-no docstring-'
+## #return
+##
+
+class ExtendedProperty(Structure):
+ pass
+ExtendedProperty._fields_ = [
+ ('PropertyName', BSTR),
+ ('PropertyValue', BSTR),
+]
+assert sizeof(ExtendedProperty) == 16, sizeof(ExtendedProperty)
+assert alignment(ExtendedProperty) == 8, alignment(ExtendedProperty)
+UIA_PaneControlTypeId = 50033 # Constant c_int
+UIA_HeaderControlTypeId = 50034 # Constant c_int
+UIA_HeaderItemControlTypeId = 50035 # Constant c_int
+UIA_TableControlTypeId = 50036 # Constant c_int
+UIA_TitleBarControlTypeId = 50037 # Constant c_int
+UIA_SeparatorControlTypeId = 50038 # Constant c_int
+UIA_SemanticZoomControlTypeId = 50039 # Constant c_int
+UIA_AppBarControlTypeId = 50040 # Constant c_int
+UIA_CustomLandmarkTypeId = 80000 # Constant c_int
+AnnotationType_SpellingError = 60001 # Constant c_int
+AnnotationType_GrammarError = 60002 # Constant c_int
+AnnotationType_Comment = 60003 # Constant c_int
+AnnotationType_FormulaError = 60004 # Constant c_int
+AnnotationType_TrackChanges = 60005 # Constant c_int
+AnnotationType_Header = 60006 # Constant c_int
+AnnotationType_Footer = 60007 # Constant c_int
+AnnotationType_Highlighted = 60008 # Constant c_int
+AnnotationType_Endnote = 60009 # Constant c_int
+UIA_ToolTipOpenedEventId = 20000 # Constant c_int
+AnnotationType_Footnote = 60010 # Constant c_int
+AnnotationType_InsertionChange = 60011 # Constant c_int
+class IUIAutomationFocusChangedEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{C270F6B5-5C69-4290-9745-7A7F97169468}')
+ _idlflags_ = ['oleautomation']
+IUIAutomationFocusChangedEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandleFocusChangedEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' )),
+]
+################################################################
+## code template for IUIAutomationFocusChangedEventHandler implementation
+##class IUIAutomationFocusChangedEventHandler_Impl(object):
+## def HandleFocusChangedEvent(self, sender):
+## '-no docstring-'
+## #return
+##
+
+AnnotationType_DeletionChange = 60012 # Constant c_int
+AnnotationType_MoveChange = 60013 # Constant c_int
+AnnotationType_FormatChange = 60014 # Constant c_int
+AnnotationType_UnsyncedChange = 60015 # Constant c_int
+class IUIAutomationTextEditTextChangedEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{92FAA680-E704-4156-931A-E32D5BB38F3F}')
+ _idlflags_ = ['oleautomation']
+
+# values for enumeration 'TextEditChangeType'
+TextEditChangeType_None = 0
+TextEditChangeType_AutoCorrect = 1
+TextEditChangeType_Composition = 2
+TextEditChangeType_CompositionFinalized = 3
+TextEditChangeType_AutoComplete = 4
+TextEditChangeType = c_int # enum
+IUIAutomationTextEditTextChangedEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandleTextEditTextChangedEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' ),
+ ( ['in'], TextEditChangeType, 'TextEditChangeType' ),
+ ( ['in'], _midlSAFEARRAY(BSTR), 'eventStrings' )),
+]
+################################################################
+## code template for IUIAutomationTextEditTextChangedEventHandler implementation
+##class IUIAutomationTextEditTextChangedEventHandler_Impl(object):
+## def HandleTextEditTextChangedEvent(self, sender, TextEditChangeType, eventStrings):
+## '-no docstring-'
+## #return
+##
+
+AnnotationType_EditingLockedChange = 60016 # Constant c_int
+AnnotationType_ExternalChange = 60017 # Constant c_int
+AnnotationType_ConflictingChange = 60018 # Constant c_int
+AnnotationType_Author = 60019 # Constant c_int
+AnnotationType_AdvancedProofingIssue = 60020 # Constant c_int
+AnnotationType_DataValidationError = 60021 # Constant c_int
+AnnotationType_CircularReferenceError = 60022 # Constant c_int
+
+# values for enumeration 'TreeScope'
+TreeScope_Element = 1
+TreeScope_Children = 2
+TreeScope_Descendants = 4
+TreeScope_Parent = 8
+TreeScope_Ancestors = 16
+TreeScope_Subtree = 7
+TreeScope = c_int # enum
+class IUIAutomationCondition(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{352FFBA8-0973-437C-A61F-F64CAFD81DF9}')
+ _idlflags_ = []
+class IUIAutomationCacheRequest(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{B32A92B5-BC25-4078-9C08-D7EE95C48E03}')
+ _idlflags_ = []
+
+# values for enumeration 'OrientationType'
+OrientationType_None = 0
+OrientationType_Horizontal = 1
+OrientationType_Vertical = 2
+OrientationType = c_int # enum
+IUIAutomationElement._methods_ = [
+ COMMETHOD([], HRESULT, 'SetFocus'),
+ COMMETHOD([], HRESULT, 'GetRuntimeId',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'runtimeId' )),
+ COMMETHOD([], HRESULT, 'FindFirst',
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'found' )),
+ COMMETHOD([], HRESULT, 'FindAll',
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'found' )),
+ COMMETHOD([], HRESULT, 'FindFirstBuildCache',
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'found' )),
+ COMMETHOD([], HRESULT, 'FindAllBuildCache',
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'found' )),
+ COMMETHOD([], HRESULT, 'BuildUpdatedCache',
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'updatedElement' )),
+ COMMETHOD([], HRESULT, 'GetCurrentPropertyValue',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentPropertyValueEx',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], c_int, 'ignoreDefaultValue' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedPropertyValue',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedPropertyValueEx',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], c_int, 'ignoreDefaultValue' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentPatternAs',
+ ( ['in'], c_int, 'patternId' ),
+ ( ['in'], POINTER(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.GUID), 'riid' ),
+ ( ['out', 'retval'], POINTER(c_void_p), 'patternObject' )),
+ COMMETHOD([], HRESULT, 'GetCachedPatternAs',
+ ( ['in'], c_int, 'patternId' ),
+ ( ['in'], POINTER(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.GUID), 'riid' ),
+ ( ['out', 'retval'], POINTER(c_void_p), 'patternObject' )),
+ COMMETHOD([], HRESULT, 'GetCurrentPattern',
+ ( ['in'], c_int, 'patternId' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'patternObject' )),
+ COMMETHOD([], HRESULT, 'GetCachedPattern',
+ ( ['in'], c_int, 'patternId' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'patternObject' )),
+ COMMETHOD([], HRESULT, 'GetCachedParent',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'parent' )),
+ COMMETHOD([], HRESULT, 'GetCachedChildren',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'children' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentProcessId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentControlType',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLocalizedControlType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAcceleratorKey',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAccessKey',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHasKeyboardFocus',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsKeyboardFocusable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsEnabled',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAutomationId',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentClassName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHelpText',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCulture',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsControlElement',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsContentElement',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsPassword',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentNativeWindowHandle',
+ ( ['out', 'retval'], POINTER(c_void_p), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentItemType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsOffscreen',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentOrientation',
+ ( ['out', 'retval'], POINTER(OrientationType), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFrameworkId',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsRequiredForForm',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentItemStatus',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentBoundingRectangle',
+ ( ['out', 'retval'], POINTER(tagRECT), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLabeledBy',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAriaRole',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAriaProperties',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsDataValidForForm',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentControllerFor',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDescribedBy',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFlowsTo',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentProviderDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedProcessId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedControlType',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLocalizedControlType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAcceleratorKey',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAccessKey',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHasKeyboardFocus',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsKeyboardFocusable',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsEnabled',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAutomationId',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedClassName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHelpText',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCulture',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsControlElement',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsContentElement',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsPassword',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedNativeWindowHandle',
+ ( ['out', 'retval'], POINTER(c_void_p), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedItemType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsOffscreen',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedOrientation',
+ ( ['out', 'retval'], POINTER(OrientationType), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFrameworkId',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsRequiredForForm',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedItemStatus',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedBoundingRectangle',
+ ( ['out', 'retval'], POINTER(tagRECT), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLabeledBy',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAriaRole',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAriaProperties',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsDataValidForForm',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedControllerFor',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDescribedBy',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFlowsTo',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedProviderDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetClickablePoint',
+ ( ['out'], POINTER(tagPOINT), 'clickable' ),
+ ( ['out', 'retval'], POINTER(c_int), 'gotClickable' )),
+]
+################################################################
+## code template for IUIAutomationElement implementation
+##class IUIAutomationElement_Impl(object):
+## def SetFocus(self):
+## '-no docstring-'
+## #return
+##
+## def GetRuntimeId(self):
+## '-no docstring-'
+## #return runtimeId
+##
+## def FindFirst(self, scope, condition):
+## '-no docstring-'
+## #return found
+##
+## def FindAll(self, scope, condition):
+## '-no docstring-'
+## #return found
+##
+## def FindFirstBuildCache(self, scope, condition, cacheRequest):
+## '-no docstring-'
+## #return found
+##
+## def FindAllBuildCache(self, scope, condition, cacheRequest):
+## '-no docstring-'
+## #return found
+##
+## def BuildUpdatedCache(self, cacheRequest):
+## '-no docstring-'
+## #return updatedElement
+##
+## def GetCurrentPropertyValue(self, propertyId):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentPropertyValueEx(self, propertyId, ignoreDefaultValue):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedPropertyValue(self, propertyId):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedPropertyValueEx(self, propertyId, ignoreDefaultValue):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentPatternAs(self, patternId, riid):
+## '-no docstring-'
+## #return patternObject
+##
+## def GetCachedPatternAs(self, patternId, riid):
+## '-no docstring-'
+## #return patternObject
+##
+## def GetCurrentPattern(self, patternId):
+## '-no docstring-'
+## #return patternObject
+##
+## def GetCachedPattern(self, patternId):
+## '-no docstring-'
+## #return patternObject
+##
+## def GetCachedParent(self):
+## '-no docstring-'
+## #return parent
+##
+## def GetCachedChildren(self):
+## '-no docstring-'
+## #return children
+##
+## @property
+## def CurrentProcessId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentControlType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLocalizedControlType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAcceleratorKey(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAccessKey(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentHasKeyboardFocus(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsKeyboardFocusable(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsEnabled(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAutomationId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentClassName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentHelpText(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentCulture(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsControlElement(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsContentElement(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsPassword(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentNativeWindowHandle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentItemType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsOffscreen(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentOrientation(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFrameworkId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsRequiredForForm(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentItemStatus(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentBoundingRectangle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLabeledBy(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAriaRole(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAriaProperties(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsDataValidForForm(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentControllerFor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentDescribedBy(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFlowsTo(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentProviderDescription(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedProcessId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedControlType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLocalizedControlType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAcceleratorKey(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAccessKey(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedHasKeyboardFocus(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsKeyboardFocusable(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsEnabled(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAutomationId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedClassName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedHelpText(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCulture(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsControlElement(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsContentElement(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsPassword(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedNativeWindowHandle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedItemType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsOffscreen(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedOrientation(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFrameworkId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsRequiredForForm(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedItemStatus(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedBoundingRectangle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLabeledBy(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAriaRole(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAriaProperties(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsDataValidForForm(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedControllerFor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDescribedBy(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFlowsTo(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedProviderDescription(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetClickablePoint(self):
+## '-no docstring-'
+## #return clickable, gotClickable
+##
+
+StyleId_Heading1 = 70001 # Constant c_int
+StyleId_Heading2 = 70002 # Constant c_int
+StyleId_Heading3 = 70003 # Constant c_int
+class IUIAutomationSpreadsheetPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{7517A7C8-FAAE-4DE9-9F08-29B91E8595C1}')
+ _idlflags_ = []
+IUIAutomationSpreadsheetPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetItemByName',
+ ( ['in'], BSTR, 'name' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+]
+################################################################
+## code template for IUIAutomationSpreadsheetPattern implementation
+##class IUIAutomationSpreadsheetPattern_Impl(object):
+## def GetItemByName(self, name):
+## '-no docstring-'
+## #return element
+##
+
+StyleId_Heading4 = 70004 # Constant c_int
+StyleId_Heading5 = 70005 # Constant c_int
+StyleId_Heading6 = 70006 # Constant c_int
+StyleId_Heading7 = 70007 # Constant c_int
+StyleId_Heading8 = 70008 # Constant c_int
+class IUIAutomationSpreadsheetItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{7D4FB86C-8D34-40E1-8E83-62C15204E335}')
+ _idlflags_ = []
+IUIAutomationSpreadsheetItemPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentFormula',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentAnnotationObjects',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentAnnotationTypes',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFormula',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedAnnotationObjects',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedAnnotationTypes',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationSpreadsheetItemPattern implementation
+##class IUIAutomationSpreadsheetItemPattern_Impl(object):
+## @property
+## def CurrentFormula(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentAnnotationObjects(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentAnnotationTypes(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFormula(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedAnnotationObjects(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedAnnotationTypes(self):
+## '-no docstring-'
+## #return retVal
+##
+
+StyleId_Heading9 = 70009 # Constant c_int
+StyleId_Title = 70010 # Constant c_int
+StyleId_Subtitle = 70011 # Constant c_int
+class IUIAutomationChangesEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{58EDCA55-2C3E-4980-B1B9-56C17F27A2A0}')
+ _idlflags_ = ['oleautomation']
+class UiaChangeInfo(Structure):
+ pass
+IUIAutomationChangesEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandleChangesEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' ),
+ ( ['in'], POINTER(UiaChangeInfo), 'uiaChanges' ),
+ ( ['in'], c_int, 'changesCount' )),
+]
+################################################################
+## code template for IUIAutomationChangesEventHandler implementation
+##class IUIAutomationChangesEventHandler_Impl(object):
+## def HandleChangesEvent(self, sender, uiaChanges, changesCount):
+## '-no docstring-'
+## #return
+##
+
+StyleId_Normal = 70012 # Constant c_int
+StyleId_Emphasis = 70013 # Constant c_int
+StyleId_Quote = 70014 # Constant c_int
+StyleId_BulletedList = 70015 # Constant c_int
+UiaChangeInfo._fields_ = [
+ ('uiaId', c_int),
+ ('payload', VARIANT),
+ ('extraInfo', VARIANT),
+]
+assert sizeof(UiaChangeInfo) == 56, sizeof(UiaChangeInfo)
+assert alignment(UiaChangeInfo) == 8, alignment(UiaChangeInfo)
+StyleId_NumberedList = 70016 # Constant c_int
+UIA_FormLandmarkTypeId = 80001 # Constant c_int
+UIA_MainLandmarkTypeId = 80002 # Constant c_int
+UIA_NavigationLandmarkTypeId = 80003 # Constant c_int
+class IUIAutomationInvokePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{FB377FBE-8EA6-46D5-9C73-6499642D3059}')
+ _idlflags_ = []
+IUIAutomationInvokePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Invoke'),
+]
+################################################################
+## code template for IUIAutomationInvokePattern implementation
+##class IUIAutomationInvokePattern_Impl(object):
+## def Invoke(self):
+## '-no docstring-'
+## #return
+##
+
+UIA_SearchLandmarkTypeId = 80004 # Constant c_int
+UIA_TextControlTypeId = 50020 # Constant c_int
+class IUIAutomationElement2(IUIAutomationElement):
+ _case_insensitive_ = True
+ _iid_ = GUID('{6749C683-F70D-4487-A698-5F79D55290D6}')
+ _idlflags_ = []
+class IUIAutomationElement3(IUIAutomationElement2):
+ _case_insensitive_ = True
+ _iid_ = GUID('{8471DF34-AEE0-4A01-A7DE-7DB9AF12C296}')
+ _idlflags_ = []
+class IUIAutomationElement4(IUIAutomationElement3):
+ _case_insensitive_ = True
+ _iid_ = GUID('{3B6E233C-52FB-4063-A4C9-77C075C2A06B}')
+ _idlflags_ = []
+
+# values for enumeration 'LiveSetting'
+Off = 0
+Polite = 1
+Assertive = 2
+LiveSetting = c_int # enum
+IUIAutomationElement2._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentOptimizeForVisualContent',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedOptimizeForVisualContent',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLiveSetting',
+ ( ['out', 'retval'], POINTER(LiveSetting), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLiveSetting',
+ ( ['out', 'retval'], POINTER(LiveSetting), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFlowsFrom',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFlowsFrom',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationElement2 implementation
+##class IUIAutomationElement2_Impl(object):
+## @property
+## def CurrentOptimizeForVisualContent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedOptimizeForVisualContent(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLiveSetting(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLiveSetting(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFlowsFrom(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFlowsFrom(self):
+## '-no docstring-'
+## #return retVal
+##
+
+IUIAutomationElement3._methods_ = [
+ COMMETHOD([], HRESULT, 'ShowContextMenu'),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsPeripheral',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsPeripheral',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationElement3 implementation
+##class IUIAutomationElement3_Impl(object):
+## def ShowContextMenu(self):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentIsPeripheral(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsPeripheral(self):
+## '-no docstring-'
+## #return retVal
+##
+
+IUIAutomationElement4._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentPositionInSet',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentSizeOfSet',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLevel',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAnnotationTypes',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAnnotationObjects',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedPositionInSet',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedSizeOfSet',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLevel',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAnnotationTypes',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAnnotationObjects',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationElement4 implementation
+##class IUIAutomationElement4_Impl(object):
+## @property
+## def CurrentPositionInSet(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentSizeOfSet(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLevel(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAnnotationTypes(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAnnotationObjects(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedPositionInSet(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedSizeOfSet(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLevel(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAnnotationTypes(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAnnotationObjects(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_TabItemControlTypeId = 50019 # Constant c_int
+IUIAutomationCondition._methods_ = [
+]
+################################################################
+## code template for IUIAutomationCondition implementation
+##class IUIAutomationCondition_Impl(object):
+
+class CUIAutomation(CoClass):
+ 'The Central Class for UIAutomation'
+ _reg_clsid_ = GUID('{FF48DBA4-60EF-4201-AA87-54103EEF594E}')
+ _idlflags_ = []
+ _typelib_path_ = typelib_path
+ _reg_typelib_ = ('{944DE083-8FB8-45CF-BCB7-C477ACB2F897}', 1, 0)
+class IUIAutomation(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{30CBE57D-D9D0-452A-AB13-7AC5AC4825EE}')
+ _idlflags_ = []
+CUIAutomation._com_interfaces_ = [IUIAutomation]
+
+UIA_TabControlTypeId = 50018 # Constant c_int
+class IUIAutomationTogglePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{94CF8058-9B8D-4AB9-8BFD-4CD0A33C8C70}')
+ _idlflags_ = []
+
+# values for enumeration 'ToggleState'
+ToggleState_Off = 0
+ToggleState_On = 1
+ToggleState_Indeterminate = 2
+ToggleState = c_int # enum
+IUIAutomationTogglePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Toggle'),
+ COMMETHOD(['propget'], HRESULT, 'CurrentToggleState',
+ ( ['out', 'retval'], POINTER(ToggleState), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedToggleState',
+ ( ['out', 'retval'], POINTER(ToggleState), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationTogglePattern implementation
+##class IUIAutomationTogglePattern_Impl(object):
+## def Toggle(self):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentToggleState(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedToggleState(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_AnimationStyleAttributeId = 40000 # Constant c_int
+UIA_IsPeripheralPropertyId = 30150 # Constant c_int
+class CUIAutomation8(CoClass):
+ 'The Central Class for UIAutomation8'
+ _reg_clsid_ = GUID('{E22AD333-B25F-460C-83D0-0581107395C9}')
+ _idlflags_ = []
+ _typelib_path_ = typelib_path
+ _reg_typelib_ = ('{944DE083-8FB8-45CF-BCB7-C477ACB2F897}', 1, 0)
+class IUIAutomation2(IUIAutomation):
+ _case_insensitive_ = True
+ _iid_ = GUID('{34723AFF-0C9D-49D0-9896-7AB52DF8CD8A}')
+ _idlflags_ = []
+class IUIAutomation3(IUIAutomation2):
+ _case_insensitive_ = True
+ _iid_ = GUID('{73D768DA-9B51-4B89-936E-C209290973E7}')
+ _idlflags_ = []
+class IUIAutomation4(IUIAutomation3):
+ _case_insensitive_ = True
+ _iid_ = GUID('{1189C02A-05F8-4319-8E21-E817E3DB2860}')
+ _idlflags_ = []
+CUIAutomation8._com_interfaces_ = [IUIAutomation2, IUIAutomation3, IUIAutomation4]
+
+UIA_IsCustomNavigationPatternAvailablePropertyId = 30151 # Constant c_int
+UIA_PositionInSetPropertyId = 30152 # Constant c_int
+UIA_SizeOfSetPropertyId = 30153 # Constant c_int
+UIA_LevelPropertyId = 30154 # Constant c_int
+UIA_AnnotationTypesPropertyId = 30155 # Constant c_int
+UIA_AnnotationObjectsPropertyId = 30156 # Constant c_int
+UIA_LandmarkTypePropertyId = 30157 # Constant c_int
+UIA_LocalizedLandmarkTypePropertyId = 30158 # Constant c_int
+UIA_FullDescriptionPropertyId = 30159 # Constant c_int
+UIA_ButtonControlTypeId = 50000 # Constant c_int
+UIA_BackgroundColorAttributeId = 40001 # Constant c_int
+UIA_BulletStyleAttributeId = 40002 # Constant c_int
+UIA_CapStyleAttributeId = 40003 # Constant c_int
+UIA_CultureAttributeId = 40004 # Constant c_int
+class IUIAutomationTransformPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{A9B55844-A55D-4EF0-926D-569C16FF89BB}')
+ _idlflags_ = []
+IUIAutomationTransformPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Move',
+ ( ['in'], c_double, 'x' ),
+ ( ['in'], c_double, 'y' )),
+ COMMETHOD([], HRESULT, 'Resize',
+ ( ['in'], c_double, 'width' ),
+ ( ['in'], c_double, 'height' )),
+ COMMETHOD([], HRESULT, 'Rotate',
+ ( ['in'], c_double, 'degrees' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanMove',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanResize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanRotate',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanMove',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanResize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanRotate',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationTransformPattern implementation
+##class IUIAutomationTransformPattern_Impl(object):
+## def Move(self, x, y):
+## '-no docstring-'
+## #return
+##
+## def Resize(self, width, height):
+## '-no docstring-'
+## #return
+##
+## def Rotate(self, degrees):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentCanMove(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentCanResize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentCanRotate(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanMove(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanResize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanRotate(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_FontNameAttributeId = 40005 # Constant c_int
+UIA_FontSizeAttributeId = 40006 # Constant c_int
+UIA_FontWeightAttributeId = 40007 # Constant c_int
+UIA_ForegroundColorAttributeId = 40008 # Constant c_int
+UIA_HorizontalTextAlignmentAttributeId = 40009 # Constant c_int
+UIA_IndentationFirstLineAttributeId = 40010 # Constant c_int
+UIA_IndentationLeadingAttributeId = 40011 # Constant c_int
+UIA_IndentationTrailingAttributeId = 40012 # Constant c_int
+UIA_IsHiddenAttributeId = 40013 # Constant c_int
+UIA_IsItalicAttributeId = 40014 # Constant c_int
+UIA_IsReadOnlyAttributeId = 40015 # Constant c_int
+UIA_IsSubscriptAttributeId = 40016 # Constant c_int
+UIA_IsSuperscriptAttributeId = 40017 # Constant c_int
+IUIAutomationElementArray._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'Length',
+ ( ['out', 'retval'], POINTER(c_int), 'Length' )),
+ COMMETHOD([], HRESULT, 'GetElement',
+ ( ['in'], c_int, 'index' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+]
+################################################################
+## code template for IUIAutomationElementArray implementation
+##class IUIAutomationElementArray_Impl(object):
+## @property
+## def Length(self):
+## '-no docstring-'
+## #return Length
+##
+## def GetElement(self, index):
+## '-no docstring-'
+## #return element
+##
+
+UIA_MarginBottomAttributeId = 40018 # Constant c_int
+UIA_MarginLeadingAttributeId = 40019 # Constant c_int
+UIA_MarginTopAttributeId = 40020 # Constant c_int
+UIA_MarginTrailingAttributeId = 40021 # Constant c_int
+UIA_OutlineStylesAttributeId = 40022 # Constant c_int
+UIA_OverlineColorAttributeId = 40023 # Constant c_int
+UIA_OverlineStyleAttributeId = 40024 # Constant c_int
+class IUIAutomationValuePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{A94CD8B1-0844-4CD6-9D2D-640537AB39E9}')
+ _idlflags_ = []
+IUIAutomationValuePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'SetValue',
+ ( ['in'], BSTR, 'val' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentValue',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsReadOnly',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedValue',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsReadOnly',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationValuePattern implementation
+##class IUIAutomationValuePattern_Impl(object):
+## def SetValue(self, val):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentValue(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsReadOnly(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedValue(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsReadOnly(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_StrikethroughColorAttributeId = 40025 # Constant c_int
+UIA_StrikethroughStyleAttributeId = 40026 # Constant c_int
+
+# values for enumeration 'AutomationElementMode'
+AutomationElementMode_None = 0
+AutomationElementMode_Full = 1
+AutomationElementMode = c_int # enum
+IUIAutomationCacheRequest._methods_ = [
+ COMMETHOD([], HRESULT, 'AddProperty',
+ ( ['in'], c_int, 'propertyId' )),
+ COMMETHOD([], HRESULT, 'AddPattern',
+ ( ['in'], c_int, 'patternId' )),
+ COMMETHOD([], HRESULT, 'Clone',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCacheRequest)), 'clonedRequest' )),
+ COMMETHOD(['propget'], HRESULT, 'TreeScope',
+ ( ['out', 'retval'], POINTER(TreeScope), 'scope' )),
+ COMMETHOD(['propput'], HRESULT, 'TreeScope',
+ ( ['in'], TreeScope, 'scope' )),
+ COMMETHOD(['propget'], HRESULT, 'TreeFilter',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'filter' )),
+ COMMETHOD(['propput'], HRESULT, 'TreeFilter',
+ ( ['in'], POINTER(IUIAutomationCondition), 'filter' )),
+ COMMETHOD(['propget'], HRESULT, 'AutomationElementMode',
+ ( ['out', 'retval'], POINTER(AutomationElementMode), 'mode' )),
+ COMMETHOD(['propput'], HRESULT, 'AutomationElementMode',
+ ( ['in'], AutomationElementMode, 'mode' )),
+]
+################################################################
+## code template for IUIAutomationCacheRequest implementation
+##class IUIAutomationCacheRequest_Impl(object):
+## def AddProperty(self, propertyId):
+## '-no docstring-'
+## #return
+##
+## def AddPattern(self, patternId):
+## '-no docstring-'
+## #return
+##
+## def Clone(self):
+## '-no docstring-'
+## #return clonedRequest
+##
+## def _get(self):
+## '-no docstring-'
+## #return scope
+## def _set(self, scope):
+## '-no docstring-'
+## TreeScope = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return filter
+## def _set(self, filter):
+## '-no docstring-'
+## TreeFilter = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return mode
+## def _set(self, mode):
+## '-no docstring-'
+## AutomationElementMode = property(_get, _set, doc = _set.__doc__)
+##
+
+class IUIAutomationElement5(IUIAutomationElement4):
+ _case_insensitive_ = True
+ _iid_ = GUID('{98141C1D-0D0E-4175-BBE2-6BFF455842A7}')
+ _idlflags_ = []
+IUIAutomationElement5._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentLandmarkType',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentLocalizedLandmarkType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLandmarkType',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedLocalizedLandmarkType',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationElement5 implementation
+##class IUIAutomationElement5_Impl(object):
+## @property
+## def CurrentLandmarkType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentLocalizedLandmarkType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLandmarkType(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedLocalizedLandmarkType(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_TabsAttributeId = 40027 # Constant c_int
+UIA_TextFlowDirectionsAttributeId = 40028 # Constant c_int
+UIA_UnderlineColorAttributeId = 40029 # Constant c_int
+UIA_UnderlineStyleAttributeId = 40030 # Constant c_int
+UIA_AnnotationTypesAttributeId = 40031 # Constant c_int
+UIA_AnnotationObjectsAttributeId = 40032 # Constant c_int
+UIA_StyleNameAttributeId = 40033 # Constant c_int
+UIA_StyleIdAttributeId = 40034 # Constant c_int
+UIA_LinkAttributeId = 40035 # Constant c_int
+UIA_IsActiveAttributeId = 40036 # Constant c_int
+UIA_SelectionActiveEndAttributeId = 40037 # Constant c_int
+UIA_CaretPositionAttributeId = 40038 # Constant c_int
+UIA_CaretBidiModeAttributeId = 40039 # Constant c_int
+UIA_ToolBarControlTypeId = 50021 # Constant c_int
+UIA_CalendarControlTypeId = 50001 # Constant c_int
+UIA_CheckBoxControlTypeId = 50002 # Constant c_int
+UIA_ComboBoxControlTypeId = 50003 # Constant c_int
+UIA_EditControlTypeId = 50004 # Constant c_int
+UIA_HyperlinkControlTypeId = 50005 # Constant c_int
+class IUIAutomationElement6(IUIAutomationElement5):
+ _case_insensitive_ = True
+ _iid_ = GUID('{4780D450-8BCA-4977-AFA5-A4A517F555E3}')
+ _idlflags_ = []
+IUIAutomationElement6._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentFullDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFullDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationElement6 implementation
+##class IUIAutomationElement6_Impl(object):
+## @property
+## def CurrentFullDescription(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFullDescription(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_ImageControlTypeId = 50006 # Constant c_int
+UIA_ListItemControlTypeId = 50007 # Constant c_int
+UIA_ListControlTypeId = 50008 # Constant c_int
+UIA_MenuControlTypeId = 50009 # Constant c_int
+UIA_MenuBarControlTypeId = 50010 # Constant c_int
+class IUIAutomationProxyFactory(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{85B94ECD-849D-42B6-B94D-D6DB23FDF5A4}')
+ _idlflags_ = []
+class IRawElementProviderSimple(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{D6DD68D1-86FD-4332-8666-9ABEDEA2D24C}')
+ _idlflags_ = ['oleautomation']
+IUIAutomationProxyFactory._methods_ = [
+ COMMETHOD([], HRESULT, 'CreateProvider',
+ ( ['in'], c_void_p, 'hwnd' ),
+ ( ['in'], c_int, 'idObject' ),
+ ( ['in'], c_int, 'idChild' ),
+ ( ['out', 'retval'], POINTER(POINTER(IRawElementProviderSimple)), 'provider' )),
+ COMMETHOD(['propget'], HRESULT, 'ProxyFactoryId',
+ ( ['out', 'retval'], POINTER(BSTR), 'factoryId' )),
+]
+################################################################
+## code template for IUIAutomationProxyFactory implementation
+##class IUIAutomationProxyFactory_Impl(object):
+## def CreateProvider(self, hwnd, idObject, idChild):
+## '-no docstring-'
+## #return provider
+##
+## @property
+## def ProxyFactoryId(self):
+## '-no docstring-'
+## #return factoryId
+##
+
+UIA_MenuItemControlTypeId = 50011 # Constant c_int
+UIA_ProgressBarControlTypeId = 50012 # Constant c_int
+UIA_RadioButtonControlTypeId = 50013 # Constant c_int
+UIA_ScrollBarControlTypeId = 50014 # Constant c_int
+UIA_SliderControlTypeId = 50015 # Constant c_int
+UIA_SpinnerControlTypeId = 50016 # Constant c_int
+class IUIAutomationWindowPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{0FAEF453-9208-43EF-BBB2-3B485177864F}')
+ _idlflags_ = []
+
+# values for enumeration 'WindowVisualState'
+WindowVisualState_Normal = 0
+WindowVisualState_Maximized = 1
+WindowVisualState_Minimized = 2
+WindowVisualState = c_int # enum
+
+# values for enumeration 'WindowInteractionState'
+WindowInteractionState_Running = 0
+WindowInteractionState_Closing = 1
+WindowInteractionState_ReadyForUserInteraction = 2
+WindowInteractionState_BlockedByModalWindow = 3
+WindowInteractionState_NotResponding = 4
+WindowInteractionState = c_int # enum
+IUIAutomationWindowPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Close'),
+ COMMETHOD([], HRESULT, 'WaitForInputIdle',
+ ( ['in'], c_int, 'milliseconds' ),
+ ( ['out', 'retval'], POINTER(c_int), 'success' )),
+ COMMETHOD([], HRESULT, 'SetWindowVisualState',
+ ( ['in'], WindowVisualState, 'state' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanMaximize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanMinimize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsModal',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsTopmost',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentWindowVisualState',
+ ( ['out', 'retval'], POINTER(WindowVisualState), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentWindowInteractionState',
+ ( ['out', 'retval'], POINTER(WindowInteractionState), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanMaximize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanMinimize',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsModal',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsTopmost',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedWindowVisualState',
+ ( ['out', 'retval'], POINTER(WindowVisualState), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedWindowInteractionState',
+ ( ['out', 'retval'], POINTER(WindowInteractionState), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationWindowPattern implementation
+##class IUIAutomationWindowPattern_Impl(object):
+## def Close(self):
+## '-no docstring-'
+## #return
+##
+## def WaitForInputIdle(self, milliseconds):
+## '-no docstring-'
+## #return success
+##
+## def SetWindowVisualState(self, state):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentCanMaximize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentCanMinimize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsModal(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentIsTopmost(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentWindowVisualState(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentWindowInteractionState(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanMaximize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanMinimize(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsModal(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsTopmost(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedWindowVisualState(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedWindowInteractionState(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_StatusBarControlTypeId = 50017 # Constant c_int
+
+# values for enumeration 'TextPatternRangeEndpoint'
+TextPatternRangeEndpoint_Start = 0
+TextPatternRangeEndpoint_End = 1
+TextPatternRangeEndpoint = c_int # enum
+
+# values for enumeration 'TextUnit'
+TextUnit_Character = 0
+TextUnit_Format = 1
+TextUnit_Word = 2
+TextUnit_Line = 3
+TextUnit_Paragraph = 4
+TextUnit_Page = 5
+TextUnit_Document = 6
+TextUnit = c_int # enum
+class IUIAutomationTextRange2(IUIAutomationTextRange):
+ _case_insensitive_ = True
+ _iid_ = GUID('{BB9B40E0-5E04-46BD-9BE0-4B601B9AFAD4}')
+ _idlflags_ = []
+IUIAutomationTextRange._methods_ = [
+ COMMETHOD([], HRESULT, 'Clone',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'clonedRange' )),
+ COMMETHOD([], HRESULT, 'Compare',
+ ( ['in'], POINTER(IUIAutomationTextRange), 'range' ),
+ ( ['out', 'retval'], POINTER(c_int), 'areSame' )),
+ COMMETHOD([], HRESULT, 'CompareEndpoints',
+ ( ['in'], TextPatternRangeEndpoint, 'srcEndPoint' ),
+ ( ['in'], POINTER(IUIAutomationTextRange), 'range' ),
+ ( ['in'], TextPatternRangeEndpoint, 'targetEndPoint' ),
+ ( ['out', 'retval'], POINTER(c_int), 'compValue' )),
+ COMMETHOD([], HRESULT, 'ExpandToEnclosingUnit',
+ ( ['in'], TextUnit, 'TextUnit' )),
+ COMMETHOD([], HRESULT, 'FindAttribute',
+ ( ['in'], c_int, 'attr' ),
+ ( ['in'], VARIANT, 'val' ),
+ ( ['in'], c_int, 'backward' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'found' )),
+ COMMETHOD([], HRESULT, 'FindText',
+ ( ['in'], BSTR, 'text' ),
+ ( ['in'], c_int, 'backward' ),
+ ( ['in'], c_int, 'ignoreCase' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'found' )),
+ COMMETHOD([], HRESULT, 'GetAttributeValue',
+ ( ['in'], c_int, 'attr' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'value' )),
+ COMMETHOD([], HRESULT, 'GetBoundingRectangles',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_double)), 'boundingRects' )),
+ COMMETHOD([], HRESULT, 'GetEnclosingElement',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'enclosingElement' )),
+ COMMETHOD([], HRESULT, 'GetText',
+ ( ['in'], c_int, 'maxLength' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'text' )),
+ COMMETHOD([], HRESULT, 'Move',
+ ( ['in'], TextUnit, 'unit' ),
+ ( ['in'], c_int, 'count' ),
+ ( ['out', 'retval'], POINTER(c_int), 'moved' )),
+ COMMETHOD([], HRESULT, 'MoveEndpointByUnit',
+ ( ['in'], TextPatternRangeEndpoint, 'endpoint' ),
+ ( ['in'], TextUnit, 'unit' ),
+ ( ['in'], c_int, 'count' ),
+ ( ['out', 'retval'], POINTER(c_int), 'moved' )),
+ COMMETHOD([], HRESULT, 'MoveEndpointByRange',
+ ( ['in'], TextPatternRangeEndpoint, 'srcEndPoint' ),
+ ( ['in'], POINTER(IUIAutomationTextRange), 'range' ),
+ ( ['in'], TextPatternRangeEndpoint, 'targetEndPoint' )),
+ COMMETHOD([], HRESULT, 'Select'),
+ COMMETHOD([], HRESULT, 'AddToSelection'),
+ COMMETHOD([], HRESULT, 'RemoveFromSelection'),
+ COMMETHOD([], HRESULT, 'ScrollIntoView',
+ ( ['in'], c_int, 'alignToTop' )),
+ COMMETHOD([], HRESULT, 'GetChildren',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'children' )),
+]
+################################################################
+## code template for IUIAutomationTextRange implementation
+##class IUIAutomationTextRange_Impl(object):
+## def Clone(self):
+## '-no docstring-'
+## #return clonedRange
+##
+## def Compare(self, range):
+## '-no docstring-'
+## #return areSame
+##
+## def CompareEndpoints(self, srcEndPoint, range, targetEndPoint):
+## '-no docstring-'
+## #return compValue
+##
+## def ExpandToEnclosingUnit(self, TextUnit):
+## '-no docstring-'
+## #return
+##
+## def FindAttribute(self, attr, val, backward):
+## '-no docstring-'
+## #return found
+##
+## def FindText(self, text, backward, ignoreCase):
+## '-no docstring-'
+## #return found
+##
+## def GetAttributeValue(self, attr):
+## '-no docstring-'
+## #return value
+##
+## def GetBoundingRectangles(self):
+## '-no docstring-'
+## #return boundingRects
+##
+## def GetEnclosingElement(self):
+## '-no docstring-'
+## #return enclosingElement
+##
+## def GetText(self, maxLength):
+## '-no docstring-'
+## #return text
+##
+## def Move(self, unit, count):
+## '-no docstring-'
+## #return moved
+##
+## def MoveEndpointByUnit(self, endpoint, unit, count):
+## '-no docstring-'
+## #return moved
+##
+## def MoveEndpointByRange(self, srcEndPoint, range, targetEndPoint):
+## '-no docstring-'
+## #return
+##
+## def Select(self):
+## '-no docstring-'
+## #return
+##
+## def AddToSelection(self):
+## '-no docstring-'
+## #return
+##
+## def RemoveFromSelection(self):
+## '-no docstring-'
+## #return
+##
+## def ScrollIntoView(self, alignToTop):
+## '-no docstring-'
+## #return
+##
+## def GetChildren(self):
+## '-no docstring-'
+## #return children
+##
+
+IUIAutomationTextRange2._methods_ = [
+ COMMETHOD([], HRESULT, 'ShowContextMenu'),
+]
+################################################################
+## code template for IUIAutomationTextRange2 implementation
+##class IUIAutomationTextRange2_Impl(object):
+## def ShowContextMenu(self):
+## '-no docstring-'
+## #return
+##
+
+class IUIAutomationGridItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{78F8EF57-66C3-4E09-BD7C-E79B2004894D}')
+ _idlflags_ = []
+IUIAutomationGridItemPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentContainingGrid',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentRow',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentColumn',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentRowSpan',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentColumnSpan',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedContainingGrid',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedRow',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedColumn',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedRowSpan',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedColumnSpan',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationGridItemPattern implementation
+##class IUIAutomationGridItemPattern_Impl(object):
+## @property
+## def CurrentContainingGrid(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentRow(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentColumn(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentRowSpan(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentColumnSpan(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedContainingGrid(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedRow(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedColumn(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedRowSpan(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedColumnSpan(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationSynchronizedInputPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{2233BE0B-AFB7-448B-9FDA-3B378AA5EAE1}')
+ _idlflags_ = []
+
+# values for enumeration 'SynchronizedInputType'
+SynchronizedInputType_KeyUp = 1
+SynchronizedInputType_KeyDown = 2
+SynchronizedInputType_LeftMouseUp = 4
+SynchronizedInputType_LeftMouseDown = 8
+SynchronizedInputType_RightMouseUp = 16
+SynchronizedInputType_RightMouseDown = 32
+SynchronizedInputType = c_int # enum
+IUIAutomationSynchronizedInputPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'StartListening',
+ ( ['in'], SynchronizedInputType, 'inputType' )),
+ COMMETHOD([], HRESULT, 'Cancel'),
+]
+################################################################
+## code template for IUIAutomationSynchronizedInputPattern implementation
+##class IUIAutomationSynchronizedInputPattern_Impl(object):
+## def StartListening(self, inputType):
+## '-no docstring-'
+## #return
+##
+## def Cancel(self):
+## '-no docstring-'
+## #return
+##
+
+class IUIAutomationDropTargetPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{69A095F7-EEE4-430E-A46B-FB73B1AE39A5}')
+ _idlflags_ = []
+IUIAutomationDropTargetPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentDropTargetEffect',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDropTargetEffect',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDropTargetEffects',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(BSTR)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDropTargetEffects',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(BSTR)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationDropTargetPattern implementation
+##class IUIAutomationDropTargetPattern_Impl(object):
+## @property
+## def CurrentDropTargetEffect(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDropTargetEffect(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentDropTargetEffects(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDropTargetEffects(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationTreeWalker(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{4042C624-389C-4AFC-A630-9DF854A541FC}')
+ _idlflags_ = []
+
+# values for enumeration 'PropertyConditionFlags'
+PropertyConditionFlags_None = 0
+PropertyConditionFlags_IgnoreCase = 1
+PropertyConditionFlags = c_int # enum
+class IUIAutomationEventHandler(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{146C3C17-F12E-4E22-8C27-F894B9B79C69}')
+ _idlflags_ = ['oleautomation']
+class IUIAutomationProxyFactoryEntry(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{D50E472E-B64B-490C-BCA1-D30696F9F289}')
+ _idlflags_ = []
+class IUIAutomationProxyFactoryMapping(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{09E31E18-872D-4873-93D1-1E541EC133FD}')
+ _idlflags_ = []
+class IAccessible(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IDispatch):
+ _case_insensitive_ = True
+ _iid_ = GUID('{618736E0-3C3D-11CF-810C-00AA00389B71}')
+ _idlflags_ = ['hidden', 'dual', 'oleautomation']
+IUIAutomation._methods_ = [
+ COMMETHOD([], HRESULT, 'CompareElements',
+ ( ['in'], POINTER(IUIAutomationElement), 'el1' ),
+ ( ['in'], POINTER(IUIAutomationElement), 'el2' ),
+ ( ['out', 'retval'], POINTER(c_int), 'areSame' )),
+ COMMETHOD([], HRESULT, 'CompareRuntimeIds',
+ ( ['in'], _midlSAFEARRAY(c_int), 'runtimeId1' ),
+ ( ['in'], _midlSAFEARRAY(c_int), 'runtimeId2' ),
+ ( ['out', 'retval'], POINTER(c_int), 'areSame' )),
+ COMMETHOD([], HRESULT, 'GetRootElement',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'root' )),
+ COMMETHOD([], HRESULT, 'ElementFromHandle',
+ ( ['in'], c_void_p, 'hwnd' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'ElementFromPoint',
+ ( ['in'], tagPOINT, 'pt' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'GetFocusedElement',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'GetRootElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'root' )),
+ COMMETHOD([], HRESULT, 'ElementFromHandleBuildCache',
+ ( ['in'], c_void_p, 'hwnd' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'ElementFromPointBuildCache',
+ ( ['in'], tagPOINT, 'pt' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'GetFocusedElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'CreateTreeWalker',
+ ( ['in'], POINTER(IUIAutomationCondition), 'pCondition' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTreeWalker)), 'walker' )),
+ COMMETHOD(['propget'], HRESULT, 'ControlViewWalker',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTreeWalker)), 'walker' )),
+ COMMETHOD(['propget'], HRESULT, 'ContentViewWalker',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTreeWalker)), 'walker' )),
+ COMMETHOD(['propget'], HRESULT, 'RawViewWalker',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTreeWalker)), 'walker' )),
+ COMMETHOD(['propget'], HRESULT, 'RawViewCondition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'condition' )),
+ COMMETHOD(['propget'], HRESULT, 'ControlViewCondition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'condition' )),
+ COMMETHOD(['propget'], HRESULT, 'ContentViewCondition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'condition' )),
+ COMMETHOD([], HRESULT, 'CreateCacheRequest',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCacheRequest)), 'cacheRequest' )),
+ COMMETHOD([], HRESULT, 'CreateTrueCondition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateFalseCondition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreatePropertyCondition',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], VARIANT, 'value' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreatePropertyConditionEx',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], VARIANT, 'value' ),
+ ( ['in'], PropertyConditionFlags, 'flags' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateAndCondition',
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition1' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition2' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateAndConditionFromArray',
+ ( ['in'], _midlSAFEARRAY(POINTER(IUIAutomationCondition)), 'conditions' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateAndConditionFromNativeArray',
+ ( ['in'], POINTER(POINTER(IUIAutomationCondition)), 'conditions' ),
+ ( ['in'], c_int, 'conditionCount' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateOrCondition',
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition1' ),
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition2' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateOrConditionFromArray',
+ ( ['in'], _midlSAFEARRAY(POINTER(IUIAutomationCondition)), 'conditions' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateOrConditionFromNativeArray',
+ ( ['in'], POINTER(POINTER(IUIAutomationCondition)), 'conditions' ),
+ ( ['in'], c_int, 'conditionCount' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'CreateNotCondition',
+ ( ['in'], POINTER(IUIAutomationCondition), 'condition' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'newCondition' )),
+ COMMETHOD([], HRESULT, 'AddAutomationEventHandler',
+ ( ['in'], c_int, 'eventId' ),
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveAutomationEventHandler',
+ ( ['in'], c_int, 'eventId' ),
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'AddPropertyChangedEventHandlerNativeArray',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationPropertyChangedEventHandler), 'handler' ),
+ ( ['in'], POINTER(c_int), 'propertyArray' ),
+ ( ['in'], c_int, 'propertyCount' )),
+ COMMETHOD([], HRESULT, 'AddPropertyChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationPropertyChangedEventHandler), 'handler' ),
+ ( ['in'], _midlSAFEARRAY(c_int), 'propertyArray' )),
+ COMMETHOD([], HRESULT, 'RemovePropertyChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationPropertyChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'AddStructureChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationStructureChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveStructureChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationStructureChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'AddFocusChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationFocusChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveFocusChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationFocusChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveAllEventHandlers'),
+ COMMETHOD([], HRESULT, 'IntNativeArrayToSafeArray',
+ ( ['in'], POINTER(c_int), 'array' ),
+ ( ['in'], c_int, 'arrayCount' ),
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'safeArray' )),
+ COMMETHOD([], HRESULT, 'IntSafeArrayToNativeArray',
+ ( ['in'], _midlSAFEARRAY(c_int), 'intArray' ),
+ ( ['out'], POINTER(POINTER(c_int)), 'array' ),
+ ( ['out', 'retval'], POINTER(c_int), 'arrayCount' )),
+ COMMETHOD([], HRESULT, 'RectToVariant',
+ ( ['in'], tagRECT, 'rc' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'var' )),
+ COMMETHOD([], HRESULT, 'VariantToRect',
+ ( ['in'], VARIANT, 'var' ),
+ ( ['out', 'retval'], POINTER(tagRECT), 'rc' )),
+ COMMETHOD([], HRESULT, 'SafeArrayToRectNativeArray',
+ ( ['in'], _midlSAFEARRAY(c_double), 'rects' ),
+ ( ['out'], POINTER(POINTER(tagRECT)), 'rectArray' ),
+ ( ['out', 'retval'], POINTER(c_int), 'rectArrayCount' )),
+ COMMETHOD([], HRESULT, 'CreateProxyFactoryEntry',
+ ( ['in'], POINTER(IUIAutomationProxyFactory), 'factory' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationProxyFactoryEntry)), 'factoryEntry' )),
+ COMMETHOD(['propget'], HRESULT, 'ProxyFactoryMapping',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationProxyFactoryMapping)), 'factoryMapping' )),
+ COMMETHOD([], HRESULT, 'GetPropertyProgrammaticName',
+ ( ['in'], c_int, 'property' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'name' )),
+ COMMETHOD([], HRESULT, 'GetPatternProgrammaticName',
+ ( ['in'], c_int, 'pattern' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'name' )),
+ COMMETHOD([], HRESULT, 'PollForPotentialSupportedPatterns',
+ ( ['in'], POINTER(IUIAutomationElement), 'pElement' ),
+ ( ['out'], POINTER(_midlSAFEARRAY(c_int)), 'patternIds' ),
+ ( ['out'], POINTER(_midlSAFEARRAY(BSTR)), 'patternNames' )),
+ COMMETHOD([], HRESULT, 'PollForPotentialSupportedProperties',
+ ( ['in'], POINTER(IUIAutomationElement), 'pElement' ),
+ ( ['out'], POINTER(_midlSAFEARRAY(c_int)), 'propertyIds' ),
+ ( ['out'], POINTER(_midlSAFEARRAY(BSTR)), 'propertyNames' )),
+ COMMETHOD([], HRESULT, 'CheckNotSupported',
+ ( ['in'], VARIANT, 'value' ),
+ ( ['out', 'retval'], POINTER(c_int), 'isNotSupported' )),
+ COMMETHOD(['propget'], HRESULT, 'ReservedNotSupportedValue',
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'notSupportedValue' )),
+ COMMETHOD(['propget'], HRESULT, 'ReservedMixedAttributeValue',
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'mixedAttributeValue' )),
+ COMMETHOD([], HRESULT, 'ElementFromIAccessible',
+ ( ['in'], POINTER(IAccessible), 'accessible' ),
+ ( ['in'], c_int, 'childId' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD([], HRESULT, 'ElementFromIAccessibleBuildCache',
+ ( ['in'], POINTER(IAccessible), 'accessible' ),
+ ( ['in'], c_int, 'childId' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+]
+################################################################
+## code template for IUIAutomation implementation
+##class IUIAutomation_Impl(object):
+## def CompareElements(self, el1, el2):
+## '-no docstring-'
+## #return areSame
+##
+## def CompareRuntimeIds(self, runtimeId1, runtimeId2):
+## '-no docstring-'
+## #return areSame
+##
+## def GetRootElement(self):
+## '-no docstring-'
+## #return root
+##
+## def ElementFromHandle(self, hwnd):
+## '-no docstring-'
+## #return element
+##
+## def ElementFromPoint(self, pt):
+## '-no docstring-'
+## #return element
+##
+## def GetFocusedElement(self):
+## '-no docstring-'
+## #return element
+##
+## def GetRootElementBuildCache(self, cacheRequest):
+## '-no docstring-'
+## #return root
+##
+## def ElementFromHandleBuildCache(self, hwnd, cacheRequest):
+## '-no docstring-'
+## #return element
+##
+## def ElementFromPointBuildCache(self, pt, cacheRequest):
+## '-no docstring-'
+## #return element
+##
+## def GetFocusedElementBuildCache(self, cacheRequest):
+## '-no docstring-'
+## #return element
+##
+## def CreateTreeWalker(self, pCondition):
+## '-no docstring-'
+## #return walker
+##
+## @property
+## def ControlViewWalker(self):
+## '-no docstring-'
+## #return walker
+##
+## @property
+## def ContentViewWalker(self):
+## '-no docstring-'
+## #return walker
+##
+## @property
+## def RawViewWalker(self):
+## '-no docstring-'
+## #return walker
+##
+## @property
+## def RawViewCondition(self):
+## '-no docstring-'
+## #return condition
+##
+## @property
+## def ControlViewCondition(self):
+## '-no docstring-'
+## #return condition
+##
+## @property
+## def ContentViewCondition(self):
+## '-no docstring-'
+## #return condition
+##
+## def CreateCacheRequest(self):
+## '-no docstring-'
+## #return cacheRequest
+##
+## def CreateTrueCondition(self):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateFalseCondition(self):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreatePropertyCondition(self, propertyId, value):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreatePropertyConditionEx(self, propertyId, value, flags):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateAndCondition(self, condition1, condition2):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateAndConditionFromArray(self, conditions):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateAndConditionFromNativeArray(self, conditions, conditionCount):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateOrCondition(self, condition1, condition2):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateOrConditionFromArray(self, conditions):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateOrConditionFromNativeArray(self, conditions, conditionCount):
+## '-no docstring-'
+## #return newCondition
+##
+## def CreateNotCondition(self, condition):
+## '-no docstring-'
+## #return newCondition
+##
+## def AddAutomationEventHandler(self, eventId, element, scope, cacheRequest, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveAutomationEventHandler(self, eventId, element, handler):
+## '-no docstring-'
+## #return
+##
+## def AddPropertyChangedEventHandlerNativeArray(self, element, scope, cacheRequest, handler, propertyArray, propertyCount):
+## '-no docstring-'
+## #return
+##
+## def AddPropertyChangedEventHandler(self, element, scope, cacheRequest, handler, propertyArray):
+## '-no docstring-'
+## #return
+##
+## def RemovePropertyChangedEventHandler(self, element, handler):
+## '-no docstring-'
+## #return
+##
+## def AddStructureChangedEventHandler(self, element, scope, cacheRequest, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveStructureChangedEventHandler(self, element, handler):
+## '-no docstring-'
+## #return
+##
+## def AddFocusChangedEventHandler(self, cacheRequest, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveFocusChangedEventHandler(self, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveAllEventHandlers(self):
+## '-no docstring-'
+## #return
+##
+## def IntNativeArrayToSafeArray(self, array, arrayCount):
+## '-no docstring-'
+## #return safeArray
+##
+## def IntSafeArrayToNativeArray(self, intArray):
+## '-no docstring-'
+## #return array, arrayCount
+##
+## def RectToVariant(self, rc):
+## '-no docstring-'
+## #return var
+##
+## def VariantToRect(self, var):
+## '-no docstring-'
+## #return rc
+##
+## def SafeArrayToRectNativeArray(self, rects):
+## '-no docstring-'
+## #return rectArray, rectArrayCount
+##
+## def CreateProxyFactoryEntry(self, factory):
+## '-no docstring-'
+## #return factoryEntry
+##
+## @property
+## def ProxyFactoryMapping(self):
+## '-no docstring-'
+## #return factoryMapping
+##
+## def GetPropertyProgrammaticName(self, property):
+## '-no docstring-'
+## #return name
+##
+## def GetPatternProgrammaticName(self, pattern):
+## '-no docstring-'
+## #return name
+##
+## def PollForPotentialSupportedPatterns(self, pElement):
+## '-no docstring-'
+## #return patternIds, patternNames
+##
+## def PollForPotentialSupportedProperties(self, pElement):
+## '-no docstring-'
+## #return propertyIds, propertyNames
+##
+## def CheckNotSupported(self, value):
+## '-no docstring-'
+## #return isNotSupported
+##
+## @property
+## def ReservedNotSupportedValue(self):
+## '-no docstring-'
+## #return notSupportedValue
+##
+## @property
+## def ReservedMixedAttributeValue(self):
+## '-no docstring-'
+## #return mixedAttributeValue
+##
+## def ElementFromIAccessible(self, accessible, childId):
+## '-no docstring-'
+## #return element
+##
+## def ElementFromIAccessibleBuildCache(self, accessible, childId, cacheRequest):
+## '-no docstring-'
+## #return element
+##
+
+IUIAutomation2._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'AutoSetFocus',
+ ( ['out', 'retval'], POINTER(c_int), 'AutoSetFocus' )),
+ COMMETHOD(['propput'], HRESULT, 'AutoSetFocus',
+ ( ['in'], c_int, 'AutoSetFocus' )),
+ COMMETHOD(['propget'], HRESULT, 'ConnectionTimeout',
+ ( ['out', 'retval'], POINTER(c_ulong), 'timeout' )),
+ COMMETHOD(['propput'], HRESULT, 'ConnectionTimeout',
+ ( ['in'], c_ulong, 'timeout' )),
+ COMMETHOD(['propget'], HRESULT, 'TransactionTimeout',
+ ( ['out', 'retval'], POINTER(c_ulong), 'timeout' )),
+ COMMETHOD(['propput'], HRESULT, 'TransactionTimeout',
+ ( ['in'], c_ulong, 'timeout' )),
+]
+################################################################
+## code template for IUIAutomation2 implementation
+##class IUIAutomation2_Impl(object):
+## def _get(self):
+## '-no docstring-'
+## #return AutoSetFocus
+## def _set(self, AutoSetFocus):
+## '-no docstring-'
+## AutoSetFocus = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return timeout
+## def _set(self, timeout):
+## '-no docstring-'
+## ConnectionTimeout = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return timeout
+## def _set(self, timeout):
+## '-no docstring-'
+## TransactionTimeout = property(_get, _set, doc = _set.__doc__)
+##
+
+class IUIAutomationTablePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{620E691C-EA96-4710-A850-754B24CE2417}')
+ _idlflags_ = []
+
+# values for enumeration 'RowOrColumnMajor'
+RowOrColumnMajor_RowMajor = 0
+RowOrColumnMajor_ColumnMajor = 1
+RowOrColumnMajor_Indeterminate = 2
+RowOrColumnMajor = c_int # enum
+IUIAutomationTablePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetCurrentRowHeaders',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentColumnHeaders',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentRowOrColumnMajor',
+ ( ['out', 'retval'], POINTER(RowOrColumnMajor), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedRowHeaders',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedColumnHeaders',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedRowOrColumnMajor',
+ ( ['out', 'retval'], POINTER(RowOrColumnMajor), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationTablePattern implementation
+##class IUIAutomationTablePattern_Impl(object):
+## def GetCurrentRowHeaders(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentColumnHeaders(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentRowOrColumnMajor(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedRowHeaders(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedColumnHeaders(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedRowOrColumnMajor(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationMultipleViewPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{8D253C91-1DC5-4BB5-B18F-ADE16FA495E8}')
+ _idlflags_ = []
+IUIAutomationMultipleViewPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetViewName',
+ ( ['in'], c_int, 'view' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'name' )),
+ COMMETHOD([], HRESULT, 'SetCurrentView',
+ ( ['in'], c_int, 'view' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCurrentView',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentSupportedViews',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCurrentView',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedSupportedViews',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_int)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationMultipleViewPattern implementation
+##class IUIAutomationMultipleViewPattern_Impl(object):
+## def GetViewName(self, view):
+## '-no docstring-'
+## #return name
+##
+## def SetCurrentView(self, view):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentCurrentView(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentSupportedViews(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCurrentView(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedSupportedViews(self):
+## '-no docstring-'
+## #return retVal
+##
+
+IUIAutomation3._methods_ = [
+ COMMETHOD([], HRESULT, 'AddTextEditTextChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], TextEditChangeType, 'TextEditChangeType' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationTextEditTextChangedEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveTextEditTextChangedEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationTextEditTextChangedEventHandler), 'handler' )),
+]
+################################################################
+## code template for IUIAutomation3 implementation
+##class IUIAutomation3_Impl(object):
+## def AddTextEditTextChangedEventHandler(self, element, scope, TextEditChangeType, cacheRequest, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveTextEditTextChangedEventHandler(self, element, handler):
+## '-no docstring-'
+## #return
+##
+
+IUIAutomation4._methods_ = [
+ COMMETHOD([], HRESULT, 'AddChangesEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], TreeScope, 'scope' ),
+ ( ['in'], POINTER(c_int), 'changeTypes' ),
+ ( ['in'], c_int, 'changesCount' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'pCacheRequest' ),
+ ( ['in'], POINTER(IUIAutomationChangesEventHandler), 'handler' )),
+ COMMETHOD([], HRESULT, 'RemoveChangesEventHandler',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationChangesEventHandler), 'handler' )),
+]
+################################################################
+## code template for IUIAutomation4 implementation
+##class IUIAutomation4_Impl(object):
+## def AddChangesEventHandler(self, element, scope, changeTypes, changesCount, pCacheRequest, handler):
+## '-no docstring-'
+## #return
+##
+## def RemoveChangesEventHandler(self, element, handler):
+## '-no docstring-'
+## #return
+##
+
+class IUIAutomationTableItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{0B964EB3-EF2E-4464-9C79-61D61737A27E}')
+ _idlflags_ = []
+IUIAutomationTableItemPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetCurrentRowHeaderItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentColumnHeaderItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedRowHeaderItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedColumnHeaderItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationTableItemPattern implementation
+##class IUIAutomationTableItemPattern_Impl(object):
+## def GetCurrentRowHeaderItems(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentColumnHeaderItems(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedRowHeaderItems(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedColumnHeaderItems(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationObjectModelPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{71C284B3-C14D-4D14-981E-19751B0D756D}')
+ _idlflags_ = []
+IUIAutomationObjectModelPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetUnderlyingObjectModel',
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationObjectModelPattern implementation
+##class IUIAutomationObjectModelPattern_Impl(object):
+## def GetUnderlyingObjectModel(self):
+## '-no docstring-'
+## #return retVal
+##
+
+
+# values for enumeration 'DockPosition'
+DockPosition_Top = 0
+DockPosition_Left = 1
+DockPosition_Bottom = 2
+DockPosition_Right = 3
+DockPosition_Fill = 4
+DockPosition_None = 5
+DockPosition = c_int # enum
+class IUIAutomationDockPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{FDE5EF97-1464-48F6-90BF-43D0948E86EC}')
+ _idlflags_ = []
+IUIAutomationDockPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'SetDockPosition',
+ ( ['in'], DockPosition, 'dockPos' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDockPosition',
+ ( ['out', 'retval'], POINTER(DockPosition), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDockPosition',
+ ( ['out', 'retval'], POINTER(DockPosition), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationDockPattern implementation
+##class IUIAutomationDockPattern_Impl(object):
+## def SetDockPosition(self, dockPos):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentDockPosition(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDockPosition(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationExpandCollapsePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{619BE086-1F4E-4EE4-BAFA-210128738730}')
+ _idlflags_ = []
+
+# values for enumeration 'ExpandCollapseState'
+ExpandCollapseState_Collapsed = 0
+ExpandCollapseState_Expanded = 1
+ExpandCollapseState_PartiallyExpanded = 2
+ExpandCollapseState_LeafNode = 3
+ExpandCollapseState = c_int # enum
+IUIAutomationExpandCollapsePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Expand'),
+ COMMETHOD([], HRESULT, 'Collapse'),
+ COMMETHOD(['propget'], HRESULT, 'CurrentExpandCollapseState',
+ ( ['out', 'retval'], POINTER(ExpandCollapseState), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedExpandCollapseState',
+ ( ['out', 'retval'], POINTER(ExpandCollapseState), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationExpandCollapsePattern implementation
+##class IUIAutomationExpandCollapsePattern_Impl(object):
+## def Expand(self):
+## '-no docstring-'
+## #return
+##
+## def Collapse(self):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentExpandCollapseState(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedExpandCollapseState(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationGridPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{414C3CDC-856B-4F5B-8538-3131C6302550}')
+ _idlflags_ = []
+IUIAutomationGridPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'GetItem',
+ ( ['in'], c_int, 'row' ),
+ ( ['in'], c_int, 'column' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentRowCount',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentColumnCount',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedRowCount',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedColumnCount',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationGridPattern implementation
+##class IUIAutomationGridPattern_Impl(object):
+## def GetItem(self, row, column):
+## '-no docstring-'
+## #return element
+##
+## @property
+## def CurrentRowCount(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentColumnCount(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedRowCount(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedColumnCount(self):
+## '-no docstring-'
+## #return retVal
+##
+
+IUIAutomationEventHandler._methods_ = [
+ COMMETHOD([], HRESULT, 'HandleAutomationEvent',
+ ( ['in'], POINTER(IUIAutomationElement), 'sender' ),
+ ( ['in'], c_int, 'eventId' )),
+]
+################################################################
+## code template for IUIAutomationEventHandler implementation
+##class IUIAutomationEventHandler_Impl(object):
+## def HandleAutomationEvent(self, sender, eventId):
+## '-no docstring-'
+## #return
+##
+
+UIA_ValuePatternId = 10002 # Constant c_int
+IAccessible._methods_ = [
+ COMMETHOD([dispid(-5000), 'hidden', 'propget'], HRESULT, 'accParent',
+ ( ['out', 'retval'], POINTER(POINTER(IDispatch)), 'ppdispParent' )),
+ COMMETHOD([dispid(-5001), 'hidden', 'propget'], HRESULT, 'accChildCount',
+ ( ['out', 'retval'], POINTER(c_int), 'pcountChildren' )),
+ COMMETHOD([dispid(-5002), 'hidden', 'propget'], HRESULT, 'accChild',
+ ( ['in'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(POINTER(IDispatch)), 'ppdispChild' )),
+ COMMETHOD([dispid(-5003), 'hidden', 'propget'], HRESULT, 'accName',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszName' )),
+ COMMETHOD([dispid(-5004), 'hidden', 'propget'], HRESULT, 'accValue',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszValue' )),
+ COMMETHOD([dispid(-5005), 'hidden', 'propget'], HRESULT, 'accDescription',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDescription' )),
+ COMMETHOD([dispid(-5006), 'hidden', 'propget'], HRESULT, 'accRole',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarRole' )),
+ COMMETHOD([dispid(-5007), 'hidden', 'propget'], HRESULT, 'accState',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarState' )),
+ COMMETHOD([dispid(-5008), 'hidden', 'propget'], HRESULT, 'accHelp',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszHelp' )),
+ COMMETHOD([dispid(-5009), 'hidden', 'propget'], HRESULT, 'accHelpTopic',
+ ( ['out'], POINTER(BSTR), 'pszHelpFile' ),
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(c_int), 'pidTopic' )),
+ COMMETHOD([dispid(-5010), 'hidden', 'propget'], HRESULT, 'accKeyboardShortcut',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszKeyboardShortcut' )),
+ COMMETHOD([dispid(-5011), 'hidden', 'propget'], HRESULT, 'accFocus',
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarChild' )),
+ COMMETHOD([dispid(-5012), 'hidden', 'propget'], HRESULT, 'accSelection',
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarChildren' )),
+ COMMETHOD([dispid(-5013), 'hidden', 'propget'], HRESULT, 'accDefaultAction',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDefaultAction' )),
+ COMMETHOD([dispid(-5014), 'hidden'], HRESULT, 'accSelect',
+ ( ['in'], c_int, 'flagsSelect' ),
+ ( ['in', 'optional'], VARIANT, 'varChild' )),
+ COMMETHOD([dispid(-5015), 'hidden'], HRESULT, 'accLocation',
+ ( ['out'], POINTER(c_int), 'pxLeft' ),
+ ( ['out'], POINTER(c_int), 'pyTop' ),
+ ( ['out'], POINTER(c_int), 'pcxWidth' ),
+ ( ['out'], POINTER(c_int), 'pcyHeight' ),
+ ( ['in', 'optional'], VARIANT, 'varChild' )),
+ COMMETHOD([dispid(-5016), 'hidden'], HRESULT, 'accNavigate',
+ ( ['in'], c_int, 'navDir' ),
+ ( ['in', 'optional'], VARIANT, 'varStart' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarEndUpAt' )),
+ COMMETHOD([dispid(-5017), 'hidden'], HRESULT, 'accHitTest',
+ ( ['in'], c_int, 'xLeft' ),
+ ( ['in'], c_int, 'yTop' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'pvarChild' )),
+ COMMETHOD([dispid(-5018), 'hidden'], HRESULT, 'accDoDefaultAction',
+ ( ['in', 'optional'], VARIANT, 'varChild' )),
+ COMMETHOD([dispid(-5003), 'hidden', 'propput'], HRESULT, 'accName',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['in'], BSTR, 'pszName' )),
+ COMMETHOD([dispid(-5004), 'hidden', 'propput'], HRESULT, 'accValue',
+ ( ['in', 'optional'], VARIANT, 'varChild' ),
+ ( ['in'], BSTR, 'pszValue' )),
+]
+################################################################
+## code template for IAccessible implementation
+##class IAccessible_Impl(object):
+## @property
+## def accParent(self):
+## '-no docstring-'
+## #return ppdispParent
+##
+## @property
+## def accChildCount(self):
+## '-no docstring-'
+## #return pcountChildren
+##
+## @property
+## def accChild(self, varChild):
+## '-no docstring-'
+## #return ppdispChild
+##
+## def _get(self, varChild):
+## '-no docstring-'
+## #return pszName
+## def _set(self, varChild, pszName):
+## '-no docstring-'
+## accName = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self, varChild):
+## '-no docstring-'
+## #return pszValue
+## def _set(self, varChild, pszValue):
+## '-no docstring-'
+## accValue = property(_get, _set, doc = _set.__doc__)
+##
+## @property
+## def accDescription(self, varChild):
+## '-no docstring-'
+## #return pszDescription
+##
+## @property
+## def accRole(self, varChild):
+## '-no docstring-'
+## #return pvarRole
+##
+## @property
+## def accState(self, varChild):
+## '-no docstring-'
+## #return pvarState
+##
+## @property
+## def accHelp(self, varChild):
+## '-no docstring-'
+## #return pszHelp
+##
+## @property
+## def accHelpTopic(self, varChild):
+## '-no docstring-'
+## #return pszHelpFile, pidTopic
+##
+## @property
+## def accKeyboardShortcut(self, varChild):
+## '-no docstring-'
+## #return pszKeyboardShortcut
+##
+## @property
+## def accFocus(self):
+## '-no docstring-'
+## #return pvarChild
+##
+## @property
+## def accSelection(self):
+## '-no docstring-'
+## #return pvarChildren
+##
+## @property
+## def accDefaultAction(self, varChild):
+## '-no docstring-'
+## #return pszDefaultAction
+##
+## def accSelect(self, flagsSelect, varChild):
+## '-no docstring-'
+## #return
+##
+## def accLocation(self, varChild):
+## '-no docstring-'
+## #return pxLeft, pyTop, pcxWidth, pcyHeight
+##
+## def accNavigate(self, navDir, varStart):
+## '-no docstring-'
+## #return pvarEndUpAt
+##
+## def accHitTest(self, xLeft, yTop):
+## '-no docstring-'
+## #return pvarChild
+##
+## def accDoDefaultAction(self, varChild):
+## '-no docstring-'
+## #return
+##
+
+IUIAutomationProxyFactoryMapping._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'count',
+ ( ['out', 'retval'], POINTER(c_uint), 'count' )),
+ COMMETHOD([], HRESULT, 'GetTable',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(POINTER(IUIAutomationProxyFactoryEntry))), 'table' )),
+ COMMETHOD([], HRESULT, 'GetEntry',
+ ( ['in'], c_uint, 'index' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationProxyFactoryEntry)), 'entry' )),
+ COMMETHOD([], HRESULT, 'SetTable',
+ ( ['in'], _midlSAFEARRAY(POINTER(IUIAutomationProxyFactoryEntry)), 'factoryList' )),
+ COMMETHOD([], HRESULT, 'InsertEntries',
+ ( ['in'], c_uint, 'before' ),
+ ( ['in'], _midlSAFEARRAY(POINTER(IUIAutomationProxyFactoryEntry)), 'factoryList' )),
+ COMMETHOD([], HRESULT, 'InsertEntry',
+ ( ['in'], c_uint, 'before' ),
+ ( ['in'], POINTER(IUIAutomationProxyFactoryEntry), 'factory' )),
+ COMMETHOD([], HRESULT, 'RemoveEntry',
+ ( ['in'], c_uint, 'index' )),
+ COMMETHOD([], HRESULT, 'ClearTable'),
+ COMMETHOD([], HRESULT, 'RestoreDefaultTable'),
+]
+################################################################
+## code template for IUIAutomationProxyFactoryMapping implementation
+##class IUIAutomationProxyFactoryMapping_Impl(object):
+## @property
+## def count(self):
+## '-no docstring-'
+## #return count
+##
+## def GetTable(self):
+## '-no docstring-'
+## #return table
+##
+## def GetEntry(self, index):
+## '-no docstring-'
+## #return entry
+##
+## def SetTable(self, factoryList):
+## '-no docstring-'
+## #return
+##
+## def InsertEntries(self, before, factoryList):
+## '-no docstring-'
+## #return
+##
+## def InsertEntry(self, before, factory):
+## '-no docstring-'
+## #return
+##
+## def RemoveEntry(self, index):
+## '-no docstring-'
+## #return
+##
+## def ClearTable(self):
+## '-no docstring-'
+## #return
+##
+## def RestoreDefaultTable(self):
+## '-no docstring-'
+## #return
+##
+
+UIA_InvokePatternId = 10000 # Constant c_int
+UIA_SelectionPatternId = 10001 # Constant c_int
+
+# values for enumeration 'ProviderOptions'
+ProviderOptions_ClientSideProvider = 1
+ProviderOptions_ServerSideProvider = 2
+ProviderOptions_NonClientAreaProvider = 4
+ProviderOptions_OverrideProvider = 8
+ProviderOptions_ProviderOwnsSetFocus = 16
+ProviderOptions_UseComThreading = 32
+ProviderOptions_RefuseNonClientSupport = 64
+ProviderOptions_HasNativeIAccessible = 128
+ProviderOptions_UseClientCoordinates = 256
+ProviderOptions = c_int # enum
+IRawElementProviderSimple._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'ProviderOptions',
+ ( ['out', 'retval'], POINTER(ProviderOptions), 'pRetVal' )),
+ COMMETHOD([], HRESULT, 'GetPatternProvider',
+ ( ['in'], c_int, 'patternId' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUnknown)), 'pRetVal' )),
+ COMMETHOD([], HRESULT, 'GetPropertyValue',
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['out', 'retval'], POINTER(VARIANT), 'pRetVal' )),
+ COMMETHOD(['propget'], HRESULT, 'HostRawElementProvider',
+ ( ['out', 'retval'], POINTER(POINTER(IRawElementProviderSimple)), 'pRetVal' )),
+]
+################################################################
+## code template for IRawElementProviderSimple implementation
+##class IRawElementProviderSimple_Impl(object):
+## @property
+## def ProviderOptions(self):
+## '-no docstring-'
+## #return pRetVal
+##
+## def GetPatternProvider(self, patternId):
+## '-no docstring-'
+## #return pRetVal
+##
+## def GetPropertyValue(self, propertyId):
+## '-no docstring-'
+## #return pRetVal
+##
+## @property
+## def HostRawElementProvider(self):
+## '-no docstring-'
+## #return pRetVal
+##
+
+class IUIAutomationTransformPattern2(IUIAutomationTransformPattern):
+ _case_insensitive_ = True
+ _iid_ = GUID('{6D74D017-6ECB-4381-B38B-3C17A48FF1C2}')
+ _idlflags_ = []
+
+# values for enumeration 'ZoomUnit'
+ZoomUnit_NoAmount = 0
+ZoomUnit_LargeDecrement = 1
+ZoomUnit_SmallDecrement = 2
+ZoomUnit_LargeIncrement = 3
+ZoomUnit_SmallIncrement = 4
+ZoomUnit = c_int # enum
+IUIAutomationTransformPattern2._methods_ = [
+ COMMETHOD([], HRESULT, 'Zoom',
+ ( ['in'], c_double, 'zoomValue' )),
+ COMMETHOD([], HRESULT, 'ZoomByUnit',
+ ( ['in'], ZoomUnit, 'ZoomUnit' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentCanZoom',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedCanZoom',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentZoomLevel',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedZoomLevel',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentZoomMinimum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedZoomMinimum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentZoomMaximum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedZoomMaximum',
+ ( ['out', 'retval'], POINTER(c_double), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationTransformPattern2 implementation
+##class IUIAutomationTransformPattern2_Impl(object):
+## def Zoom(self, zoomValue):
+## '-no docstring-'
+## #return
+##
+## def ZoomByUnit(self, ZoomUnit):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentCanZoom(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedCanZoom(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentZoomLevel(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedZoomLevel(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentZoomMinimum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedZoomMinimum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentZoomMaximum(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedZoomMaximum(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class Library(object):
+ name = 'UIAutomationClient'
+ _reg_typelib_ = ('{944DE083-8FB8-45CF-BCB7-C477ACB2F897}', 1, 0)
+
+IUIAutomationProxyFactoryEntry._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'ProxyFactory',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationProxyFactory)), 'factory' )),
+ COMMETHOD(['propget'], HRESULT, 'ClassName',
+ ( ['out', 'retval'], POINTER(BSTR), 'ClassName' )),
+ COMMETHOD(['propget'], HRESULT, 'ImageName',
+ ( ['out', 'retval'], POINTER(BSTR), 'ImageName' )),
+ COMMETHOD(['propget'], HRESULT, 'AllowSubstringMatch',
+ ( ['out', 'retval'], POINTER(c_int), 'AllowSubstringMatch' )),
+ COMMETHOD(['propget'], HRESULT, 'CanCheckBaseClass',
+ ( ['out', 'retval'], POINTER(c_int), 'CanCheckBaseClass' )),
+ COMMETHOD(['propget'], HRESULT, 'NeedsAdviseEvents',
+ ( ['out', 'retval'], POINTER(c_int), 'adviseEvents' )),
+ COMMETHOD(['propput'], HRESULT, 'ClassName',
+ ( ['in'], WSTRING, 'ClassName' )),
+ COMMETHOD(['propput'], HRESULT, 'ImageName',
+ ( ['in'], WSTRING, 'ImageName' )),
+ COMMETHOD(['propput'], HRESULT, 'AllowSubstringMatch',
+ ( ['in'], c_int, 'AllowSubstringMatch' )),
+ COMMETHOD(['propput'], HRESULT, 'CanCheckBaseClass',
+ ( ['in'], c_int, 'CanCheckBaseClass' )),
+ COMMETHOD(['propput'], HRESULT, 'NeedsAdviseEvents',
+ ( ['in'], c_int, 'adviseEvents' )),
+ COMMETHOD([], HRESULT, 'SetWinEventsForAutomationEvent',
+ ( ['in'], c_int, 'eventId' ),
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], _midlSAFEARRAY(c_uint), 'winEvents' )),
+ COMMETHOD([], HRESULT, 'GetWinEventsForAutomationEvent',
+ ( ['in'], c_int, 'eventId' ),
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(c_uint)), 'winEvents' )),
+]
+################################################################
+## code template for IUIAutomationProxyFactoryEntry implementation
+##class IUIAutomationProxyFactoryEntry_Impl(object):
+## @property
+## def ProxyFactory(self):
+## '-no docstring-'
+## #return factory
+##
+## def _get(self):
+## '-no docstring-'
+## #return ClassName
+## def _set(self, ClassName):
+## '-no docstring-'
+## ClassName = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return ImageName
+## def _set(self, ImageName):
+## '-no docstring-'
+## ImageName = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return AllowSubstringMatch
+## def _set(self, AllowSubstringMatch):
+## '-no docstring-'
+## AllowSubstringMatch = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return CanCheckBaseClass
+## def _set(self, CanCheckBaseClass):
+## '-no docstring-'
+## CanCheckBaseClass = property(_get, _set, doc = _set.__doc__)
+##
+## def _get(self):
+## '-no docstring-'
+## #return adviseEvents
+## def _set(self, adviseEvents):
+## '-no docstring-'
+## NeedsAdviseEvents = property(_get, _set, doc = _set.__doc__)
+##
+## def SetWinEventsForAutomationEvent(self, eventId, propertyId, winEvents):
+## '-no docstring-'
+## #return
+##
+## def GetWinEventsForAutomationEvent(self, eventId, propertyId):
+## '-no docstring-'
+## #return winEvents
+##
+
+class IUIAutomationTextChildPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{6552B038-AE05-40C8-ABFD-AA08352AAB86}')
+ _idlflags_ = []
+IUIAutomationTextChildPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'TextContainer',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'container' )),
+ COMMETHOD(['propget'], HRESULT, 'TextRange',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationTextRange)), 'range' )),
+]
+################################################################
+## code template for IUIAutomationTextChildPattern implementation
+##class IUIAutomationTextChildPattern_Impl(object):
+## @property
+## def TextContainer(self):
+## '-no docstring-'
+## #return container
+##
+## @property
+## def TextRange(self):
+## '-no docstring-'
+## #return range
+##
+
+class IUIAutomationDragPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{1DC7B570-1F54-4BAD-BCDA-D36A722FB7BD}')
+ _idlflags_ = []
+IUIAutomationDragPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentIsGrabbed',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedIsGrabbed',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDropEffect',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDropEffect',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDropEffects',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(BSTR)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDropEffects',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(BSTR)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentGrabbedItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedGrabbedItems',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationDragPattern implementation
+##class IUIAutomationDragPattern_Impl(object):
+## @property
+## def CurrentIsGrabbed(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedIsGrabbed(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentDropEffect(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDropEffect(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentDropEffects(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDropEffects(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentGrabbedItems(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedGrabbedItems(self):
+## '-no docstring-'
+## #return retVal
+##
+
+class IUIAutomationItemContainerPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{C690FDB2-27A8-423C-812D-429773C9084E}')
+ _idlflags_ = []
+IUIAutomationItemContainerPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'FindItemByProperty',
+ ( ['in'], POINTER(IUIAutomationElement), 'pStartAfter' ),
+ ( ['in'], c_int, 'propertyId' ),
+ ( ['in'], VARIANT, 'value' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'pFound' )),
+]
+################################################################
+## code template for IUIAutomationItemContainerPattern implementation
+##class IUIAutomationItemContainerPattern_Impl(object):
+## def FindItemByProperty(self, pStartAfter, propertyId, value):
+## '-no docstring-'
+## #return pFound
+##
+
+UIA_RuntimeIdPropertyId = 30000 # Constant c_int
+class IUIAutomationBoolCondition(IUIAutomationCondition):
+ _case_insensitive_ = True
+ _iid_ = GUID('{1B4E1F2E-75EB-4D0B-8952-5A69988E2307}')
+ _idlflags_ = []
+IUIAutomationBoolCondition._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'BooleanValue',
+ ( ['out', 'retval'], POINTER(c_int), 'boolVal' )),
+]
+################################################################
+## code template for IUIAutomationBoolCondition implementation
+##class IUIAutomationBoolCondition_Impl(object):
+## @property
+## def BooleanValue(self):
+## '-no docstring-'
+## #return boolVal
+##
+
+class IUIAutomationCustomNavigationPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{01EA217A-1766-47ED-A6CC-ACF492854B1F}')
+ _idlflags_ = []
+
+# values for enumeration 'NavigateDirection'
+NavigateDirection_Parent = 0
+NavigateDirection_NextSibling = 1
+NavigateDirection_PreviousSibling = 2
+NavigateDirection_FirstChild = 3
+NavigateDirection_LastChild = 4
+NavigateDirection = c_int # enum
+IUIAutomationCustomNavigationPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Navigate',
+ ( ['in'], NavigateDirection, 'direction' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'pRetVal' )),
+]
+################################################################
+## code template for IUIAutomationCustomNavigationPattern implementation
+##class IUIAutomationCustomNavigationPattern_Impl(object):
+## def Navigate(self, direction):
+## '-no docstring-'
+## #return pRetVal
+##
+
+UIA_ProcessIdPropertyId = 30002 # Constant c_int
+UIA_ControlTypePropertyId = 30003 # Constant c_int
+UIA_LocalizedControlTypePropertyId = 30004 # Constant c_int
+UIA_RangeValuePatternId = 10003 # Constant c_int
+UIA_ScrollPatternId = 10004 # Constant c_int
+UIA_ExpandCollapsePatternId = 10005 # Constant c_int
+UIA_GridPatternId = 10006 # Constant c_int
+UIA_GridItemPatternId = 10007 # Constant c_int
+UIA_MultipleViewPatternId = 10008 # Constant c_int
+class IUIAutomationPropertyCondition(IUIAutomationCondition):
+ _case_insensitive_ = True
+ _iid_ = GUID('{99EBF2CB-5578-4267-9AD4-AFD6EA77E94B}')
+ _idlflags_ = []
+IUIAutomationPropertyCondition._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'propertyId',
+ ( ['out', 'retval'], POINTER(c_int), 'propertyId' )),
+ COMMETHOD(['propget'], HRESULT, 'PropertyValue',
+ ( ['out', 'retval'], POINTER(VARIANT), 'PropertyValue' )),
+ COMMETHOD(['propget'], HRESULT, 'PropertyConditionFlags',
+ ( ['out', 'retval'], POINTER(PropertyConditionFlags), 'flags' )),
+]
+################################################################
+## code template for IUIAutomationPropertyCondition implementation
+##class IUIAutomationPropertyCondition_Impl(object):
+## @property
+## def propertyId(self):
+## '-no docstring-'
+## #return propertyId
+##
+## @property
+## def PropertyValue(self):
+## '-no docstring-'
+## #return PropertyValue
+##
+## @property
+## def PropertyConditionFlags(self):
+## '-no docstring-'
+## #return flags
+##
+
+UIA_WindowPatternId = 10009 # Constant c_int
+class IUIAutomationVirtualizedItemPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{6BA3D7A6-04CF-4F11-8793-A8D1CDE9969F}')
+ _idlflags_ = []
+IUIAutomationVirtualizedItemPattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Realize'),
+]
+################################################################
+## code template for IUIAutomationVirtualizedItemPattern implementation
+##class IUIAutomationVirtualizedItemPattern_Impl(object):
+## def Realize(self):
+## '-no docstring-'
+## #return
+##
+
+UIA_SelectionItemPatternId = 10010 # Constant c_int
+UIA_DockPatternId = 10011 # Constant c_int
+UIA_TablePatternId = 10012 # Constant c_int
+UIA_TableItemPatternId = 10013 # Constant c_int
+UIA_TextPatternId = 10014 # Constant c_int
+UIA_TogglePatternId = 10015 # Constant c_int
+UIA_TransformPatternId = 10016 # Constant c_int
+UIA_ScrollItemPatternId = 10017 # Constant c_int
+UIA_LegacyIAccessiblePatternId = 10018 # Constant c_int
+class IUIAutomationLegacyIAccessiblePattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{828055AD-355B-4435-86D5-3B51C14A9B1B}')
+ _idlflags_ = []
+IUIAutomationLegacyIAccessiblePattern._methods_ = [
+ COMMETHOD([], HRESULT, 'Select',
+ ( [], c_int, 'flagsSelect' )),
+ COMMETHOD([], HRESULT, 'DoDefaultAction'),
+ COMMETHOD([], HRESULT, 'SetValue',
+ ( [], WSTRING, 'szValue' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentChildId',
+ ( ['out', 'retval'], POINTER(c_int), 'pRetVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentName',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszName' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentValue',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszValue' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDescription' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentRole',
+ ( ['out', 'retval'], POINTER(c_ulong), 'pdwRole' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentState',
+ ( ['out', 'retval'], POINTER(c_ulong), 'pdwState' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentHelp',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszHelp' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentKeyboardShortcut',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszKeyboardShortcut' )),
+ COMMETHOD([], HRESULT, 'GetCurrentSelection',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'pvarSelectedChildren' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDefaultAction',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDefaultAction' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedChildId',
+ ( ['out', 'retval'], POINTER(c_int), 'pRetVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedName',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszName' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedValue',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszValue' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDescription',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDescription' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedRole',
+ ( ['out', 'retval'], POINTER(c_ulong), 'pdwRole' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedState',
+ ( ['out', 'retval'], POINTER(c_ulong), 'pdwState' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedHelp',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszHelp' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedKeyboardShortcut',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszKeyboardShortcut' )),
+ COMMETHOD([], HRESULT, 'GetCachedSelection',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElementArray)), 'pvarSelectedChildren' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDefaultAction',
+ ( ['out', 'retval'], POINTER(BSTR), 'pszDefaultAction' )),
+ COMMETHOD([], HRESULT, 'GetIAccessible',
+ ( ['out', 'retval'], POINTER(POINTER(IAccessible)), 'ppAccessible' )),
+]
+################################################################
+## code template for IUIAutomationLegacyIAccessiblePattern implementation
+##class IUIAutomationLegacyIAccessiblePattern_Impl(object):
+## def Select(self, flagsSelect):
+## '-no docstring-'
+## #return
+##
+## def DoDefaultAction(self):
+## '-no docstring-'
+## #return
+##
+## def SetValue(self, szValue):
+## '-no docstring-'
+## #return
+##
+## @property
+## def CurrentChildId(self):
+## '-no docstring-'
+## #return pRetVal
+##
+## @property
+## def CurrentName(self):
+## '-no docstring-'
+## #return pszName
+##
+## @property
+## def CurrentValue(self):
+## '-no docstring-'
+## #return pszValue
+##
+## @property
+## def CurrentDescription(self):
+## '-no docstring-'
+## #return pszDescription
+##
+## @property
+## def CurrentRole(self):
+## '-no docstring-'
+## #return pdwRole
+##
+## @property
+## def CurrentState(self):
+## '-no docstring-'
+## #return pdwState
+##
+## @property
+## def CurrentHelp(self):
+## '-no docstring-'
+## #return pszHelp
+##
+## @property
+## def CurrentKeyboardShortcut(self):
+## '-no docstring-'
+## #return pszKeyboardShortcut
+##
+## def GetCurrentSelection(self):
+## '-no docstring-'
+## #return pvarSelectedChildren
+##
+## @property
+## def CurrentDefaultAction(self):
+## '-no docstring-'
+## #return pszDefaultAction
+##
+## @property
+## def CachedChildId(self):
+## '-no docstring-'
+## #return pRetVal
+##
+## @property
+## def CachedName(self):
+## '-no docstring-'
+## #return pszName
+##
+## @property
+## def CachedValue(self):
+## '-no docstring-'
+## #return pszValue
+##
+## @property
+## def CachedDescription(self):
+## '-no docstring-'
+## #return pszDescription
+##
+## @property
+## def CachedRole(self):
+## '-no docstring-'
+## #return pdwRole
+##
+## @property
+## def CachedState(self):
+## '-no docstring-'
+## #return pdwState
+##
+## @property
+## def CachedHelp(self):
+## '-no docstring-'
+## #return pszHelp
+##
+## @property
+## def CachedKeyboardShortcut(self):
+## '-no docstring-'
+## #return pszKeyboardShortcut
+##
+## def GetCachedSelection(self):
+## '-no docstring-'
+## #return pvarSelectedChildren
+##
+## @property
+## def CachedDefaultAction(self):
+## '-no docstring-'
+## #return pszDefaultAction
+##
+## def GetIAccessible(self):
+## '-no docstring-'
+## #return ppAccessible
+##
+
+UIA_ItemContainerPatternId = 10019 # Constant c_int
+UIA_VirtualizedItemPatternId = 10020 # Constant c_int
+UIA_SynchronizedInputPatternId = 10021 # Constant c_int
+UIA_ObjectModelPatternId = 10022 # Constant c_int
+class IUIAutomationAnnotationPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{9A175B21-339E-41B1-8E8B-623F6B681098}')
+ _idlflags_ = []
+IUIAutomationAnnotationPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentAnnotationTypeId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAnnotationTypeName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentAuthor',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentDateTime',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentTarget',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAnnotationTypeId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAnnotationTypeName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedAuthor',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedDateTime',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedTarget',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'retVal' )),
+]
+################################################################
+## code template for IUIAutomationAnnotationPattern implementation
+##class IUIAutomationAnnotationPattern_Impl(object):
+## @property
+## def CurrentAnnotationTypeId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAnnotationTypeName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentAuthor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentDateTime(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentTarget(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAnnotationTypeId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAnnotationTypeName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedAuthor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedDateTime(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedTarget(self):
+## '-no docstring-'
+## #return retVal
+##
+
+UIA_AnnotationPatternId = 10023 # Constant c_int
+UIA_TextPattern2Id = 10024 # Constant c_int
+class IUIAutomationAndCondition(IUIAutomationCondition):
+ _case_insensitive_ = True
+ _iid_ = GUID('{A7D0AF36-B912-45FE-9855-091DDC174AEC}')
+ _idlflags_ = []
+IUIAutomationAndCondition._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'ChildCount',
+ ( ['out', 'retval'], POINTER(c_int), 'ChildCount' )),
+ COMMETHOD([], HRESULT, 'GetChildrenAsNativeArray',
+ ( ['out'], POINTER(POINTER(POINTER(IUIAutomationCondition))), 'childArray' ),
+ ( ['out'], POINTER(c_int), 'childArrayCount' )),
+ COMMETHOD([], HRESULT, 'GetChildren',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(POINTER(IUIAutomationCondition))), 'childArray' )),
+]
+################################################################
+## code template for IUIAutomationAndCondition implementation
+##class IUIAutomationAndCondition_Impl(object):
+## @property
+## def ChildCount(self):
+## '-no docstring-'
+## #return ChildCount
+##
+## def GetChildrenAsNativeArray(self):
+## '-no docstring-'
+## #return childArray, childArrayCount
+##
+## def GetChildren(self):
+## '-no docstring-'
+## #return childArray
+##
+
+UIA_StylesPatternId = 10025 # Constant c_int
+UIA_SpreadsheetPatternId = 10026 # Constant c_int
+UIA_SpreadsheetItemPatternId = 10027 # Constant c_int
+UIA_TransformPattern2Id = 10028 # Constant c_int
+UIA_TextChildPatternId = 10029 # Constant c_int
+UIA_DragPatternId = 10030 # Constant c_int
+UIA_DropTargetPatternId = 10031 # Constant c_int
+UIA_TextEditPatternId = 10032 # Constant c_int
+UIA_CustomNavigationPatternId = 10033 # Constant c_int
+class IUIAutomationOrCondition(IUIAutomationCondition):
+ _case_insensitive_ = True
+ _iid_ = GUID('{8753F032-3DB1-47B5-A1FC-6E34A266C712}')
+ _idlflags_ = []
+IUIAutomationOrCondition._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'ChildCount',
+ ( ['out', 'retval'], POINTER(c_int), 'ChildCount' )),
+ COMMETHOD([], HRESULT, 'GetChildrenAsNativeArray',
+ ( ['out'], POINTER(POINTER(POINTER(IUIAutomationCondition))), 'childArray' ),
+ ( ['out'], POINTER(c_int), 'childArrayCount' )),
+ COMMETHOD([], HRESULT, 'GetChildren',
+ ( ['out', 'retval'], POINTER(_midlSAFEARRAY(POINTER(IUIAutomationCondition))), 'childArray' )),
+]
+################################################################
+## code template for IUIAutomationOrCondition implementation
+##class IUIAutomationOrCondition_Impl(object):
+## @property
+## def ChildCount(self):
+## '-no docstring-'
+## #return ChildCount
+##
+## def GetChildrenAsNativeArray(self):
+## '-no docstring-'
+## #return childArray, childArrayCount
+##
+## def GetChildren(self):
+## '-no docstring-'
+## #return childArray
+##
+
+UIA_ToolTipClosedEventId = 20001 # Constant c_int
+UIA_StructureChangedEventId = 20002 # Constant c_int
+UIA_MenuOpenedEventId = 20003 # Constant c_int
+UIA_AutomationPropertyChangedEventId = 20004 # Constant c_int
+UIA_AutomationFocusChangedEventId = 20005 # Constant c_int
+UIA_AsyncContentLoadedEventId = 20006 # Constant c_int
+UIA_MenuClosedEventId = 20007 # Constant c_int
+UIA_LayoutInvalidatedEventId = 20008 # Constant c_int
+UIA_Invoke_InvokedEventId = 20009 # Constant c_int
+UIA_SelectionItem_ElementAddedToSelectionEventId = 20010 # Constant c_int
+UIA_SelectionItem_ElementRemovedFromSelectionEventId = 20011 # Constant c_int
+UIA_SelectionItem_ElementSelectedEventId = 20012 # Constant c_int
+UIA_Selection_InvalidatedEventId = 20013 # Constant c_int
+UIA_Text_TextSelectionChangedEventId = 20014 # Constant c_int
+class IUIAutomationNotCondition(IUIAutomationCondition):
+ _case_insensitive_ = True
+ _iid_ = GUID('{F528B657-847B-498C-8896-D52B565407A1}')
+ _idlflags_ = []
+IUIAutomationNotCondition._methods_ = [
+ COMMETHOD([], HRESULT, 'GetChild',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'condition' )),
+]
+################################################################
+## code template for IUIAutomationNotCondition implementation
+##class IUIAutomationNotCondition_Impl(object):
+## def GetChild(self):
+## '-no docstring-'
+## #return condition
+##
+
+UIA_Text_TextChangedEventId = 20015 # Constant c_int
+UIA_Window_WindowOpenedEventId = 20016 # Constant c_int
+UIA_Window_WindowClosedEventId = 20017 # Constant c_int
+UIA_MenuModeStartEventId = 20018 # Constant c_int
+UIA_MenuModeEndEventId = 20019 # Constant c_int
+UIA_InputReachedTargetEventId = 20020 # Constant c_int
+class IUIAutomationStylesPattern(comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.IUnknown):
+ _case_insensitive_ = True
+ _iid_ = GUID('{85B5F0A2-BD79-484A-AD2B-388C9838D5FB}')
+ _idlflags_ = []
+IUIAutomationStylesPattern._methods_ = [
+ COMMETHOD(['propget'], HRESULT, 'CurrentStyleId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentStyleName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFillColor',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFillPatternStyle',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentShape',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentFillPatternColor',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CurrentExtendedProperties',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCurrentExtendedPropertiesAsArray',
+ ( ['out'], POINTER(POINTER(ExtendedProperty)), 'propertyArray' ),
+ ( ['out'], POINTER(c_int), 'propertyCount' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedStyleId',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedStyleName',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFillColor',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFillPatternStyle',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedShape',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedFillPatternColor',
+ ( ['out', 'retval'], POINTER(c_int), 'retVal' )),
+ COMMETHOD(['propget'], HRESULT, 'CachedExtendedProperties',
+ ( ['out', 'retval'], POINTER(BSTR), 'retVal' )),
+ COMMETHOD([], HRESULT, 'GetCachedExtendedPropertiesAsArray',
+ ( ['out'], POINTER(POINTER(ExtendedProperty)), 'propertyArray' ),
+ ( ['out'], POINTER(c_int), 'propertyCount' )),
+]
+################################################################
+## code template for IUIAutomationStylesPattern implementation
+##class IUIAutomationStylesPattern_Impl(object):
+## @property
+## def CurrentStyleId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentStyleName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFillColor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFillPatternStyle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentShape(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentFillPatternColor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CurrentExtendedProperties(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCurrentExtendedPropertiesAsArray(self):
+## '-no docstring-'
+## #return propertyArray, propertyCount
+##
+## @property
+## def CachedStyleId(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedStyleName(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFillColor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFillPatternStyle(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedShape(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedFillPatternColor(self):
+## '-no docstring-'
+## #return retVal
+##
+## @property
+## def CachedExtendedProperties(self):
+## '-no docstring-'
+## #return retVal
+##
+## def GetCachedExtendedPropertiesAsArray(self):
+## '-no docstring-'
+## #return propertyArray, propertyCount
+##
+
+UIA_InputReachedOtherElementEventId = 20021 # Constant c_int
+UIA_InputDiscardedEventId = 20022 # Constant c_int
+UIA_SystemAlertEventId = 20023 # Constant c_int
+IUIAutomationTreeWalker._methods_ = [
+ COMMETHOD([], HRESULT, 'GetParentElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'parent' )),
+ COMMETHOD([], HRESULT, 'GetFirstChildElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'first' )),
+ COMMETHOD([], HRESULT, 'GetLastChildElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'last' )),
+ COMMETHOD([], HRESULT, 'GetNextSiblingElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'next' )),
+ COMMETHOD([], HRESULT, 'GetPreviousSiblingElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'previous' )),
+ COMMETHOD([], HRESULT, 'NormalizeElement',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'normalized' )),
+ COMMETHOD([], HRESULT, 'GetParentElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'parent' )),
+ COMMETHOD([], HRESULT, 'GetFirstChildElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'first' )),
+ COMMETHOD([], HRESULT, 'GetLastChildElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'last' )),
+ COMMETHOD([], HRESULT, 'GetNextSiblingElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'next' )),
+ COMMETHOD([], HRESULT, 'GetPreviousSiblingElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'previous' )),
+ COMMETHOD([], HRESULT, 'NormalizeElementBuildCache',
+ ( ['in'], POINTER(IUIAutomationElement), 'element' ),
+ ( ['in'], POINTER(IUIAutomationCacheRequest), 'cacheRequest' ),
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'normalized' )),
+ COMMETHOD(['propget'], HRESULT, 'condition',
+ ( ['out', 'retval'], POINTER(POINTER(IUIAutomationCondition)), 'condition' )),
+]
+################################################################
+## code template for IUIAutomationTreeWalker implementation
+##class IUIAutomationTreeWalker_Impl(object):
+## def GetParentElement(self, element):
+## '-no docstring-'
+## #return parent
+##
+## def GetFirstChildElement(self, element):
+## '-no docstring-'
+## #return first
+##
+## def GetLastChildElement(self, element):
+## '-no docstring-'
+## #return last
+##
+## def GetNextSiblingElement(self, element):
+## '-no docstring-'
+## #return next
+##
+## def GetPreviousSiblingElement(self, element):
+## '-no docstring-'
+## #return previous
+##
+## def NormalizeElement(self, element):
+## '-no docstring-'
+## #return normalized
+##
+## def GetParentElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return parent
+##
+## def GetFirstChildElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return first
+##
+## def GetLastChildElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return last
+##
+## def GetNextSiblingElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return next
+##
+## def GetPreviousSiblingElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return previous
+##
+## def NormalizeElementBuildCache(self, element, cacheRequest):
+## '-no docstring-'
+## #return normalized
+##
+## @property
+## def condition(self):
+## '-no docstring-'
+## #return condition
+##
+
+UIA_LiveRegionChangedEventId = 20024 # Constant c_int
+UIA_HostedFragmentRootsInvalidatedEventId = 20025 # Constant c_int
+UIA_Drag_DragStartEventId = 20026 # Constant c_int
+UIA_Drag_DragCancelEventId = 20027 # Constant c_int
+UIA_Drag_DragCompleteEventId = 20028 # Constant c_int
+UIA_DropTarget_DragEnterEventId = 20029 # Constant c_int
+UIA_DropTarget_DragLeaveEventId = 20030 # Constant c_int
+UIA_DropTarget_DroppedEventId = 20031 # Constant c_int
+UIA_TextEdit_TextChangedEventId = 20032 # Constant c_int
+UIA_TextEdit_ConversionTargetChangedEventId = 20033 # Constant c_int
+UIA_NamePropertyId = 30005 # Constant c_int
+UIA_BoundingRectanglePropertyId = 30001 # Constant c_int
+__all__ = [ 'StyleId_Heading8',
+ 'UIA_IsRangeValuePatternAvailablePropertyId',
+ 'IUIAutomationGridPattern',
+ 'UIA_IsItemContainerPatternAvailablePropertyId',
+ 'UIA_GridPatternId', 'UIA_ItemContainerPatternId',
+ 'IUIAutomationTogglePattern',
+ 'UIA_IsSelectionPatternAvailablePropertyId',
+ 'IUIAutomationStylesPattern',
+ 'UIA_IsRequiredForFormPropertyId', 'IUIAutomationElement4',
+ 'UIA_IsSelectionItemPatternAvailablePropertyId',
+ 'UIA_IsPeripheralPropertyId',
+ 'StructureChangeType_ChildrenInvalidated',
+ 'IUIAutomationCustomNavigationPattern',
+ 'ProviderOptions_HasNativeIAccessible', 'StyleId_Normal',
+ 'AutomationElementMode', 'UIA_SliderControlTypeId',
+ 'UIA_CustomControlTypeId',
+ 'UIA_ScrollHorizontalViewSizePropertyId',
+ 'ZoomUnit_LargeIncrement', 'UIA_NavigationLandmarkTypeId',
+ 'IUIAutomationElement6',
+ 'SynchronizedInputType_RightMouseUp',
+ 'OrientationType_Horizontal',
+ 'UIA_DropTarget_DroppedEventId',
+ 'WindowInteractionState_Running', 'TextUnit_Document',
+ 'UIA_DropTarget_DragLeaveEventId', 'StyleId_Heading7',
+ 'UIA_ToolTipControlTypeId', 'IUIAutomationValuePattern',
+ 'UIA_TabsAttributeId', 'UIA_GridItemColumnSpanPropertyId',
+ 'AutomationElementMode_Full',
+ 'AnnotationType_DataValidationError', 'ZoomUnit',
+ 'TextUnit_Format', 'UIA_LayoutInvalidatedEventId',
+ 'IUIAutomationSpreadsheetItemPattern',
+ 'UIA_FontSizeAttributeId',
+ 'SynchronizedInputType_LeftMouseDown',
+ 'ZoomUnit_SmallDecrement',
+ 'WindowInteractionState_ReadyForUserInteraction',
+ 'UIA_ObjectModelPatternId', 'DockPosition',
+ 'DockPosition_Top',
+ 'UIA_AnnotationAnnotationTypeNamePropertyId',
+ 'UIA_BoundingRectanglePropertyId', 'UIA_TextControlTypeId',
+ 'UIA_IsValuePatternAvailablePropertyId',
+ 'UIA_AnnotationDateTimePropertyId',
+ 'UIA_StylesFillPatternStylePropertyId',
+ 'UIA_ToolTipClosedEventId', 'UIA_SearchLandmarkTypeId',
+ 'StructureChangeType_ChildAdded',
+ 'WindowVisualState_Normal',
+ 'NavigateDirection_PreviousSibling',
+ 'UIA_AutomationPropertyChangedEventId',
+ 'UIA_SpreadsheetPatternId', 'UIA_IsReadOnlyAttributeId',
+ 'UIA_AcceleratorKeyPropertyId',
+ 'UIA_ProgressBarControlTypeId', 'StyleId_Emphasis',
+ 'UIA_IsStylesPatternAvailablePropertyId',
+ 'UIA_MarginLeadingAttributeId',
+ 'UIA_StrikethroughColorAttributeId',
+ 'UIA_InputReachedOtherElementEventId',
+ 'TextPatternRangeEndpoint', 'StyleId_Heading5',
+ 'AnnotationType_InsertionChange',
+ 'UIA_DropTargetPatternId',
+ 'UIA_AnnotationObjectsPropertyId',
+ 'IUIAutomationRangeValuePattern',
+ 'UIA_ValueIsReadOnlyPropertyId', 'TextUnit_Page',
+ 'UIA_BulletStyleAttributeId',
+ 'UIA_IsMultipleViewPatternAvailablePropertyId',
+ 'UIA_GridItemContainingGridPropertyId',
+ 'WindowInteractionState_BlockedByModalWindow',
+ 'UIA_LevelPropertyId', 'UIA_FontNameAttributeId',
+ 'IUIAutomationCacheRequest', 'ZoomUnit_NoAmount',
+ 'UIA_InvokePatternId', 'UIA_DragGrabbedItemsPropertyId',
+ 'IUIAutomationTableItemPattern', 'UIA_SummaryChangeId',
+ 'ZoomUnit_SmallIncrement', 'ExpandCollapseState',
+ 'UIA_AnnotationPatternId',
+ 'UIA_IsCustomNavigationPatternAvailablePropertyId',
+ 'UIA_SelectionItem_ElementAddedToSelectionEventId',
+ 'UIA_LabeledByPropertyId', 'UIA_AutomationIdPropertyId',
+ 'UIA_Transform2CanZoomPropertyId',
+ 'UIA_Transform2ZoomLevelPropertyId',
+ 'UIA_SeparatorControlTypeId',
+ 'UIA_LocalizedLandmarkTypePropertyId',
+ 'UIA_TableItemRowHeaderItemsPropertyId',
+ 'UIA_DocumentControlTypeId',
+ 'UIA_Drag_DragCompleteEventId',
+ 'UIA_WindowWindowVisualStatePropertyId',
+ 'UIA_RuntimeIdPropertyId', 'UIA_LiveSettingPropertyId',
+ 'UIA_IsTextEditPatternAvailablePropertyId',
+ 'UIA_WindowControlTypeId', 'UIA_CultureAttributeId',
+ 'UIA_IsSubscriptAttributeId',
+ 'IUIAutomationObjectModelPattern', 'IUIAutomation3',
+ 'UIA_TreeItemControlTypeId', 'UIA_StylesStyleIdPropertyId',
+ 'UIA_ListControlTypeId', 'AnnotationType_FormulaError',
+ 'IUIAutomationElement3', 'IUIAutomationTextRange',
+ 'IUIAutomationTransformPattern2', 'UIA_FormLandmarkTypeId',
+ 'UIA_TreeControlTypeId',
+ 'UIA_IsTableItemPatternAvailablePropertyId',
+ 'StructureChangeType_ChildrenBulkRemoved',
+ 'WindowVisualState_Maximized',
+ 'UIA_IsTextChildPatternAvailablePropertyId',
+ 'UIA_ToggleToggleStatePropertyId',
+ 'TextEditChangeType_CompositionFinalized',
+ 'UIA_LocalizedControlTypePropertyId',
+ 'AnnotationType_GrammarError',
+ 'UIA_TextFlowDirectionsAttributeId',
+ 'UIA_HyperlinkControlTypeId', 'IUIAutomationDragPattern',
+ 'UIA_OptimizeForVisualContentPropertyId',
+ 'UIA_Window_WindowClosedEventId',
+ 'UIA_ItemStatusPropertyId',
+ 'IUIAutomationChangesEventHandler',
+ 'RowOrColumnMajor_Indeterminate',
+ 'TextEditChangeType_None',
+ 'UIA_WindowCanMinimizePropertyId',
+ 'UIA_TableRowHeadersPropertyId',
+ 'UIA_IsOffscreenPropertyId', 'TreeScope_Ancestors',
+ 'UIA_IsDropTargetPatternAvailablePropertyId',
+ 'UIA_RangeValuePatternId', 'IUIAutomationTreeWalker',
+ 'DockPosition_None', 'UIA_TransformCanMovePropertyId',
+ 'UIA_TabItemControlTypeId', 'PropertyConditionFlags_None',
+ 'UIA_SelectionItemPatternId', 'UIA_MenuBarControlTypeId',
+ 'UIA_IsSpreadsheetItemPatternAvailablePropertyId',
+ 'UIA_Transform2ZoomMaximumPropertyId',
+ 'UIA_DataGridControlTypeId',
+ 'AnnotationType_EditingLockedChange',
+ 'UIA_OutlineStylesAttributeId',
+ 'UIA_MarginBottomAttributeId', 'IUIAutomation',
+ 'UIA_LegacyIAccessibleDescriptionPropertyId',
+ 'UIA_GridItemRowPropertyId',
+ 'UIA_MultipleViewSupportedViewsPropertyId',
+ 'UIA_CalendarControlTypeId', 'WindowVisualState',
+ 'UIA_LegacyIAccessiblePatternId',
+ 'WindowInteractionState_NotResponding',
+ 'IUIAutomationElement5',
+ 'UIA_LegacyIAccessibleRolePropertyId',
+ 'UIA_IsVirtualizedItemPatternAvailablePropertyId',
+ 'TextEditChangeType_AutoComplete', 'AnnotationType_Footer',
+ 'UIA_CulturePropertyId',
+ 'UIA_LegacyIAccessibleStatePropertyId', 'StyleId_Heading4',
+ 'UIA_TableItemColumnHeaderItemsPropertyId',
+ 'StyleId_Heading9', 'UIA_CapStyleAttributeId',
+ 'SupportedTextSelection_Multiple',
+ 'ProviderOptions_ProviderOwnsSetFocus',
+ 'UIA_TransformCanResizePropertyId',
+ 'UIA_ButtonControlTypeId', 'IUIAutomationBoolCondition',
+ 'OrientationType_None',
+ 'UIA_LegacyIAccessibleDefaultActionPropertyId',
+ 'ExtendedProperty', 'IUIAutomationAnnotationPattern',
+ 'UIA_ProcessIdPropertyId',
+ 'UIA_LegacyIAccessibleValuePropertyId',
+ 'IUIAutomationFocusChangedEventHandler',
+ 'UIA_CustomLandmarkTypeId', 'UIA_ValuePatternId',
+ 'ProviderOptions_ClientSideProvider',
+ 'AnnotationType_Unknown', 'UIA_OrientationPropertyId',
+ 'UIA_SpreadsheetItemAnnotationTypesPropertyId',
+ 'UIA_MenuModeStartEventId', 'UIA_MainLandmarkTypeId',
+ 'UIA_GridItemPatternId', 'UIA_RangeValueValuePropertyId',
+ 'SupportedTextSelection', 'UIA_Window_WindowOpenedEventId',
+ 'UIA_DropTargetDropTargetEffectsPropertyId',
+ 'UIA_MenuModeEndEventId', 'IUIAutomationTextPattern2',
+ 'UIA_IsKeyboardFocusablePropertyId',
+ 'UIA_IsContentElementPropertyId',
+ 'UIA_ToolBarControlTypeId',
+ 'UIA_StylesFillColorPropertyId', 'IUIAutomationCondition',
+ 'UIA_IsItalicAttributeId', 'UIA_NamePropertyId',
+ 'UIA_IsHiddenAttributeId', 'IAccessible',
+ 'UIA_TableItemPatternId', 'TreeScope_Element',
+ 'IUIAutomationSelectionItemPattern',
+ 'UIA_ClassNamePropertyId', 'SynchronizedInputType',
+ 'UIA_SelectionSelectionPropertyId',
+ 'UIA_Text_TextSelectionChangedEventId',
+ 'NavigateDirection_LastChild',
+ 'UIA_UnderlineColorAttributeId', 'TextUnit_Paragraph',
+ 'TextEditChangeType_Composition',
+ 'UIA_VirtualizedItemPatternId',
+ 'SupportedTextSelection_None', 'UIA_ToolTipOpenedEventId',
+ 'TreeScope', 'UIA_WindowIsModalPropertyId',
+ 'TextEditChangeType',
+ 'UIA_IsGridItemPatternAvailablePropertyId',
+ 'RowOrColumnMajor_ColumnMajor',
+ 'UIA_WindowCanMaximizePropertyId', 'LiveSetting',
+ 'SynchronizedInputType_KeyDown',
+ 'AutomationElementMode_None', 'TextUnit_Character',
+ 'UIA_PaneControlTypeId', 'UIA_SizeOfSetPropertyId',
+ 'ScrollAmount_LargeDecrement',
+ 'UIA_IsSynchronizedInputPatternAvailablePropertyId',
+ 'UIA_RangeValueMaximumPropertyId', 'Assertive',
+ 'UIA_SelectionPatternId',
+ 'UIA_IsWindowPatternAvailablePropertyId',
+ 'UIA_DockPatternId', 'IUIAutomationTextEditPattern',
+ 'UIA_IsObjectModelPatternAvailablePropertyId',
+ 'UIA_LinkAttributeId', 'UIA_ValueValuePropertyId',
+ 'UIA_EditControlTypeId',
+ 'UIA_LegacyIAccessibleHelpPropertyId',
+ 'UIA_TransformPatternId', 'UIA_ClickablePointPropertyId',
+ 'UIA_AnnotationAuthorPropertyId',
+ 'ProviderOptions_RefuseNonClientSupport',
+ 'UIA_AsyncContentLoadedEventId',
+ 'UIA_OverlineStyleAttributeId',
+ 'UIA_SelectionItemIsSelectedPropertyId',
+ 'AnnotationType_Author',
+ 'UIA_IsTextPatternAvailablePropertyId',
+ 'PropertyConditionFlags_IgnoreCase',
+ 'WindowVisualState_Minimized',
+ 'ProviderOptions_OverrideProvider',
+ 'UIA_SelectionItemSelectionContainerPropertyId',
+ 'UIA_WindowIsTopmostPropertyId',
+ 'UIA_MultipleViewPatternId',
+ 'UIA_ExpandCollapseExpandCollapseStatePropertyId',
+ 'UIA_IndentationFirstLineAttributeId', 'IUIAutomation2',
+ 'IUIAutomationDropTargetPattern',
+ 'UIA_SplitButtonControlTypeId', 'UIA_HeaderControlTypeId',
+ 'UIA_IsTransformPattern2AvailablePropertyId',
+ 'UIA_NativeWindowHandlePropertyId',
+ 'UIA_SemanticZoomControlTypeId',
+ 'UIA_StylesExtendedPropertiesPropertyId',
+ 'UIA_GridRowCountPropertyId', 'UIA_ScrollPatternId',
+ 'UIA_SpinnerControlTypeId', 'IUIAutomationElementArray',
+ 'UIA_LandmarkTypePropertyId',
+ 'UIA_IsSuperscriptAttributeId',
+ 'UIA_Text_TextChangedEventId', 'IUIAutomationOrCondition',
+ 'UIA_IsControlElementPropertyId',
+ 'IUIAutomationEventHandler', 'UIA_ImageControlTypeId',
+ 'UIA_TogglePatternId', 'DockPosition_Right',
+ 'IUIAutomationInvokePattern',
+ 'NavigateDirection_NextSibling', 'AnnotationType_Endnote',
+ 'UIA_MarginTrailingAttributeId',
+ 'IUIAutomationTextChildPattern',
+ 'UIA_IsScrollItemPatternAvailablePropertyId',
+ 'UIA_StylesPatternId',
+ 'UIA_IsDockPatternAvailablePropertyId',
+ 'UIA_ListItemControlTypeId', 'IUIAutomationTextRange2',
+ 'IUIAutomationGridItemPattern', 'ScrollAmount',
+ 'UIA_GroupControlTypeId', 'StyleId_Heading2',
+ 'UIA_ScrollHorizontalScrollPercentPropertyId',
+ 'UIA_IsGridPatternAvailablePropertyId',
+ 'UIA_TextPatternId',
+ 'StructureChangeType_ChildrenBulkAdded',
+ 'IUIAutomationAndCondition',
+ 'UIA_AnnotationTargetPropertyId',
+ 'UIA_StylesFillPatternColorPropertyId',
+ 'AnnotationType_ConflictingChange',
+ 'UIA_RangeValueSmallChangePropertyId',
+ 'IUIAutomationScrollItemPattern',
+ 'UIA_TransformCanRotatePropertyId',
+ 'UIA_SpreadsheetItemFormulaPropertyId',
+ 'IUIAutomationLegacyIAccessiblePattern',
+ 'StructureChangeType', 'IUIAutomationProxyFactory',
+ 'UIA_DropTarget_DragEnterEventId',
+ 'AnnotationType_ExternalChange',
+ 'UIA_IsInvokePatternAvailablePropertyId',
+ 'UIA_IsLegacyIAccessiblePatternAvailablePropertyId',
+ 'UIA_WindowPatternId', 'UIA_AppBarControlTypeId',
+ 'UIA_HasKeyboardFocusPropertyId', 'IUIAutomationElement2',
+ 'UIA_MarginTopAttributeId', 'RowOrColumnMajor_RowMajor',
+ 'UIA_ScrollItemPatternId',
+ 'UIA_IsScrollPatternAvailablePropertyId',
+ 'AnnotationType_CircularReferenceError',
+ 'StyleId_BulletedList',
+ 'UIA_SpreadsheetItemAnnotationObjectsPropertyId',
+ 'ScrollAmount_NoAmount', 'UIA_TransformPattern2Id',
+ 'NavigateDirection', 'UiaChangeInfo',
+ 'IUIAutomationSpreadsheetPattern',
+ 'UIA_AriaRolePropertyId', 'TextEditChangeType_AutoCorrect',
+ 'IUIAutomationScrollPattern',
+ 'UIA_TextEdit_TextChangedEventId',
+ 'UIA_SelectionCanSelectMultiplePropertyId',
+ 'UIA_SpreadsheetItemPatternId',
+ 'UIA_StructureChangedEventId',
+ 'UIA_SelectionItem_ElementRemovedFromSelectionEventId',
+ 'UIA_DataItemControlTypeId',
+ 'UIA_AnnotationTypesAttributeId', 'RowOrColumnMajor',
+ 'UIA_ProviderDescriptionPropertyId',
+ 'TextPatternRangeEndpoint_End',
+ 'IUIAutomationExpandCollapsePattern',
+ 'UIA_FlowsFromPropertyId', 'SupportedTextSelection_Single',
+ 'ProviderOptions_NonClientAreaProvider',
+ 'StyleId_Heading3', 'UIA_StyleIdAttributeId',
+ 'UIA_StylesShapePropertyId', 'TreeScope_Parent',
+ 'UIA_TextChildPatternId',
+ 'IUIAutomationStructureChangedEventHandler',
+ 'UIA_IsEnabledPropertyId',
+ 'UIA_IsTextPattern2AvailablePropertyId',
+ 'WindowInteractionState', 'UIA_ItemTypePropertyId',
+ 'UIA_AnnotationTypesPropertyId',
+ 'ScrollAmount_LargeIncrement',
+ 'UIA_BackgroundColorAttributeId',
+ 'UIA_MultipleViewCurrentViewPropertyId',
+ 'IUIAutomationTablePattern',
+ 'UIA_AnimationStyleAttributeId',
+ 'UIA_FontWeightAttributeId', 'UIA_ControlTypePropertyId',
+ 'UIA_IsDataValidForFormPropertyId',
+ 'IRawElementProviderSimple',
+ 'UIA_IsSpreadsheetPatternAvailablePropertyId',
+ 'IUIAutomationPropertyChangedEventHandler',
+ 'UIA_SystemAlertEventId', 'UIA_TextEditPatternId',
+ 'AnnotationType_AdvancedProofingIssue',
+ 'UIA_WindowWindowInteractionStatePropertyId',
+ 'UIA_DockDockPositionPropertyId', 'TreeScope_Children',
+ 'UIA_RadioButtonControlTypeId',
+ 'UIA_IsDragPatternAvailablePropertyId',
+ 'UIA_CheckBoxControlTypeId', 'ToggleState',
+ 'DockPosition_Bottom', 'UIA_AutomationFocusChangedEventId',
+ 'IUIAutomationTextRangeArray', 'UIA_TablePatternId',
+ 'UIA_Selection_InvalidatedEventId',
+ 'UIA_DropTargetDropTargetEffectPropertyId',
+ 'StructureChangeType_ChildrenReordered',
+ 'ProviderOptions_UseComThreading',
+ 'UIA_TextEdit_ConversionTargetChangedEventId',
+ 'UIA_IsAnnotationPatternAvailablePropertyId',
+ 'PropertyConditionFlags',
+ 'UIA_AnnotationAnnotationTypeIdPropertyId',
+ 'IUIAutomationNotCondition', 'UIA_InputDiscardedEventId',
+ 'UIA_Transform2ZoomMinimumPropertyId',
+ 'AnnotationType_DeletionChange',
+ 'UIA_AriaPropertiesPropertyId',
+ 'IUIAutomationProxyFactoryEntry',
+ 'UIA_Drag_DragCancelEventId',
+ 'AnnotationType_UnsyncedChange',
+ 'IUIAutomationWindowPattern',
+ 'UIA_LegacyIAccessibleKeyboardShortcutPropertyId',
+ 'UIA_IsTablePatternAvailablePropertyId',
+ 'UIA_HeaderItemControlTypeId', 'UIA_Invoke_InvokedEventId',
+ 'StyleId_Quote',
+ 'UIA_SelectionIsSelectionRequiredPropertyId',
+ 'UIA_InputReachedTargetEventId',
+ 'IUIAutomationProxyFactoryMapping', 'Polite',
+ 'UIA_GridColumnCountPropertyId',
+ 'SynchronizedInputType_KeyUp', 'UIA_HelpTextPropertyId',
+ 'ExpandCollapseState_PartiallyExpanded',
+ 'UIA_ExpandCollapsePatternId',
+ 'UIA_ForegroundColorAttributeId', 'UIA_TextPattern2Id',
+ 'UIA_ScrollHorizontallyScrollablePropertyId',
+ 'ProviderOptions_UseClientCoordinates',
+ 'UIA_SynchronizedInputPatternId',
+ 'UIA_ScrollBarControlTypeId',
+ 'UIA_CustomNavigationPatternId', 'UIA_MenuControlTypeId',
+ 'IUIAutomationVirtualizedItemPattern',
+ 'UIA_RangeValueMinimumPropertyId',
+ 'OrientationType_Vertical',
+ 'UIA_GridItemRowSpanPropertyId',
+ 'UIA_HorizontalTextAlignmentAttributeId', 'ToggleState_On',
+ 'UIA_RangeValueLargeChangePropertyId', 'IUIAutomation4',
+ 'UIA_ScrollVerticallyScrollablePropertyId',
+ 'ToggleState_Indeterminate',
+ 'StructureChangeType_ChildRemoved',
+ 'UIA_StatusBarControlTypeId',
+ 'UIA_FullDescriptionPropertyId',
+ 'ExpandCollapseState_Expanded',
+ 'IUIAutomationTextEditTextChangedEventHandler',
+ 'UIA_MenuOpenedEventId', 'UIA_ControllerForPropertyId',
+ 'UIA_StylesStyleNamePropertyId',
+ 'IUIAutomationItemContainerPattern',
+ 'AnnotationType_Footnote',
+ 'IUIAutomationMultipleViewPattern',
+ 'UIA_ScrollVerticalScrollPercentPropertyId',
+ 'UIA_IndentationLeadingAttributeId',
+ 'UIA_LiveRegionChangedEventId',
+ 'UIA_FrameworkIdPropertyId', 'UIA_Drag_DragStartEventId',
+ 'StyleId_NumberedList', 'UIA_AnnotationObjectsAttributeId',
+ 'TreeScope_Descendants', 'UIA_TabControlTypeId',
+ 'UIA_IsTogglePatternAvailablePropertyId',
+ 'ZoomUnit_LargeDecrement', 'UIA_OverlineColorAttributeId',
+ 'UIA_GridItemColumnPropertyId',
+ 'UIA_IndentationTrailingAttributeId',
+ 'UIA_LegacyIAccessibleSelectionPropertyId',
+ 'UIA_IsPasswordPropertyId',
+ 'UIA_DragDropEffectsPropertyId', 'UIA_DragPatternId',
+ 'IUIAutomationPropertyCondition',
+ 'UIA_LegacyIAccessibleChildIdPropertyId',
+ 'UIA_UnderlineStyleAttributeId', 'StyleId_Custom',
+ 'DockPosition_Left', 'UIA_MenuItemControlTypeId',
+ 'UIA_FlowsToPropertyId',
+ 'IUIAutomationSynchronizedInputPattern', 'ProviderOptions',
+ 'AnnotationType_Header',
+ 'SynchronizedInputType_RightMouseDown',
+ 'UIA_DragIsGrabbedPropertyId',
+ 'ExpandCollapseState_Collapsed',
+ 'ProviderOptions_ServerSideProvider',
+ 'SynchronizedInputType_LeftMouseUp',
+ 'IUIAutomationTextPattern', 'UIA_DragDropEffectPropertyId',
+ 'UIA_TitleBarControlTypeId', 'CUIAutomation8',
+ 'UIA_IsActiveAttributeId', 'UIA_CaretPositionAttributeId',
+ 'IUIAutomationTransformPattern',
+ 'UIA_IsExpandCollapsePatternAvailablePropertyId',
+ 'CUIAutomation', 'IUIAutomationDockPattern',
+ 'AnnotationType_MoveChange', 'AnnotationType_Highlighted',
+ 'WindowInteractionState_Closing',
+ 'IUIAutomationSelectionPattern',
+ 'ExpandCollapseState_LeafNode', 'StyleId_Title',
+ 'DockPosition_Fill', 'UIA_DescribedByPropertyId',
+ 'AnnotationType_TrackChanges', 'TreeScope_Subtree',
+ 'UIA_TableRowOrColumnMajorPropertyId',
+ 'UIA_LegacyIAccessibleNamePropertyId',
+ 'UIA_TableColumnHeadersPropertyId',
+ 'UIA_MenuClosedEventId', 'StyleId_Heading1',
+ 'ScrollAmount_SmallDecrement', 'ToggleState_Off',
+ 'NavigateDirection_FirstChild',
+ 'UIA_ScrollVerticalViewSizePropertyId',
+ 'UIA_ThumbControlTypeId', 'TextPatternRangeEndpoint_Start',
+ 'UIA_PositionInSetPropertyId',
+ 'AnnotationType_FormatChange',
+ 'UIA_StrikethroughStyleAttributeId',
+ 'UIA_SelectionItem_ElementSelectedEventId', 'Off',
+ 'UIA_StyleNameAttributeId', 'UIA_CaretBidiModeAttributeId',
+ 'UIA_HostedFragmentRootsInvalidatedEventId',
+ 'UIA_IsTransformPatternAvailablePropertyId',
+ 'UIA_RangeValueIsReadOnlyPropertyId', 'TextUnit_Word',
+ 'AnnotationType_SpellingError',
+ 'UIA_SelectionActiveEndAttributeId',
+ 'IUIAutomationElement', 'TextUnit',
+ 'NavigateDirection_Parent', 'ScrollAmount_SmallIncrement',
+ 'AnnotationType_Comment', 'UIA_AccessKeyPropertyId',
+ 'OrientationType', 'UIA_TableControlTypeId',
+ 'StyleId_Heading6', 'TextUnit_Line', 'StyleId_Subtitle',
+ 'UIA_ComboBoxControlTypeId']
+from comtypes import _check_version; _check_version('')
diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/__init__.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/__init__.py
new file mode 100644
index 00000000..40bf6c8d
--- /dev/null
+++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/__init__.py
@@ -0,0 +1 @@
+# comtypes.gen package, directory for generated files.
diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/stdole.py b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/stdole.py
new file mode 100644
index 00000000..09d50d33
--- /dev/null
+++ b/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/comtypes/gen/stdole.py
@@ -0,0 +1,3 @@
+from comtypes.gen import _00020430_0000_0000_C000_000000000046_0_2_0
+globals().update(_00020430_0000_0000_C000_000000000046_0_2_0.__dict__)
+__name__ = 'comtypes.gen.stdole'
\ No newline at end of file