# GUI Application automation and testing library # Copyright (C) 2006-2018 Mark Mc Mahon and Contributors # https://github.com/pywinauto/pywinauto/graphs/contributors # http://pywinauto.readthedocs.io/en/latest/credits.html # 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 pywinauto 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. """Defines Windows(tm) functions""" from ctypes import LibraryLoader from ctypes import WinDLL from ctypes import wintypes from . import win32defines, win32structures from .actionlogger import ActionLogger from ctypes import c_short from ctypes import WINFUNCTYPE from ctypes import c_void_p from ctypes import c_int from ctypes import byref from ctypes import POINTER from ctypes import c_ubyte from ctypes import c_size_t # Quote: "If you want cached libs without polluting ctypes.cdll or # ctypes.windll, just create your own instance such as # windll = ctypes.LibraryLoader(ctypes.WinDLL)." # see https://bugs.python.org/issue22552 windll = LibraryLoader(WinDLL) SHORT = c_short CreateBrushIndirect = windll.gdi32.CreateBrushIndirect CreateBrushIndirect.restype = wintypes.HBRUSH CreateBrushIndirect.argtypes = [ c_void_p, ] CreateDC = windll.gdi32.CreateDCW CreateDC.restype = wintypes.HDC CreateDC.argtypes = [ wintypes.LPCWSTR, wintypes.LPCWSTR, wintypes.LPCWSTR, c_void_p, ] CreateFontIndirect = windll.gdi32.CreateFontIndirectW CreateFontIndirect.restype = wintypes.HFONT CreateFontIndirect.argtypes = [ POINTER(win32structures.LOGFONTW), ] CreatePen = windll.gdi32.CreatePen CreatePen.restype = wintypes.HPEN CreatePen.argtypes = [ c_int, c_int, wintypes.COLORREF, ] DeleteDC = windll.gdi32.DeleteDC DeleteDC.restype = wintypes.BOOL DeleteDC.argtypes = [ wintypes.HDC, ] GetObject = windll.gdi32.GetObjectW GetObject.restype = c_int GetObject.argtypes = [ wintypes.HANDLE, c_int, wintypes.LPVOID, ] DeleteObject = windll.gdi32.DeleteObject DeleteObject.restype = wintypes.BOOL DeleteObject.argtypes = [ wintypes.HGDIOBJ, ] DrawText = windll.user32.DrawTextW DrawText.restype = c_int DrawText.argtypes = [ wintypes.HDC, wintypes.LPCWSTR, c_int, POINTER(wintypes.RECT), wintypes.UINT, ] TextOut = windll.gdi32.TextOutW TextOut.restype = wintypes.BOOL TextOut.argtypes = [ wintypes.HDC, c_int, c_int, wintypes.LPCWSTR, c_int, ] Rectangle = windll.gdi32.Rectangle Rectangle.restype = wintypes.BOOL Rectangle.argtypes = [ wintypes.HDC, c_int, c_int, c_int, c_int, ] SelectObject = windll.gdi32.SelectObject SelectObject.restype = wintypes.HGDIOBJ SelectObject.argtypes = [ wintypes.HDC, wintypes.HGDIOBJ, ] GetStockObject = windll.gdi32.GetStockObject GetStockObject.restype = wintypes.HGDIOBJ GetStockObject.argtypes = [ c_int, ] GetSystemMetrics = windll.user32.GetSystemMetrics GetSystemMetrics.restype = c_int GetSystemMetrics.argtypes = [ c_int, ] GetTextMetrics = windll.gdi32.GetTextMetricsW GetTextMetrics.restype = wintypes.BOOL GetTextMetrics.argtypes = [ wintypes.HDC, POINTER(win32structures.TEXTMETRICW), ] EnumChildWindows = windll.user32.EnumChildWindows EnumChildWindows.restype = wintypes.BOOL EnumChildWindows.argtypes = [ wintypes.HWND, WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM), wintypes.LPARAM, ] EnumDesktopWindows = windll.user32.EnumDesktopWindows EnumDesktopWindows.restype = wintypes.BOOL EnumDesktopWindows.argtypes = [ wintypes.LPVOID, WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM), wintypes.LPARAM, ] EnumWindows = windll.user32.EnumWindows EnumWindows.restype = wintypes.BOOL EnumWindows.argtypes = [ WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM), wintypes.LPARAM, ] GetDC = windll.user32.GetDC GetDC.restype = wintypes.LPVOID GetDC.argtypes = [ wintypes.HWND, ] GetDesktopWindow = windll.user32.GetDesktopWindow GetDesktopWindow.restype = wintypes.HWND GetDesktopWindow.argtypes = [ ] SendInput = windll.user32.SendInput SendInput.restype = wintypes.UINT SendInput.argtypes = [ wintypes.UINT, c_void_p, # using POINTER(win32structures.INPUT) needs rework in keyboard.py c_int, ] SetCursorPos = windll.user32.SetCursorPos SetCursorPos.restype = wintypes.BOOL SetCursorPos.argtypes = [ c_int, c_int, ] GetCursorPos = windll.user32.GetCursorPos GetCursorPos.restype = wintypes.BOOL GetCursorPos.argtypes = [ POINTER(wintypes.POINT), ] GetCaretPos = windll.user32.GetCaretPos GetCaretPos.restype = wintypes.BOOL GetCaretPos.argtypes = [ POINTER(wintypes.POINT), ] GetKeyboardState = windll.user32.GetKeyboardState GetKeyboardState.restype = wintypes.BOOL GetKeyboardState.argtypes = [ POINTER(c_ubyte), ] SetKeyboardState = windll.user32.SetKeyboardState SetKeyboardState.restype = wintypes.BOOL SetKeyboardState.argtypes = [ POINTER(c_ubyte), ] GetKeyboardLayout = windll.user32.GetKeyboardLayout GetKeyboardLayout.restype = wintypes.HKL GetKeyboardLayout.argtypes = [ wintypes.DWORD, ] VkKeyScanW = windll.user32.VkKeyScanW VkKeyScanW.restype = SHORT VkKeyScanW.argtypes = [ wintypes.WCHAR, ] VkKeyScanExW = windll.user32.VkKeyScanExW VkKeyScanExW.restype = SHORT VkKeyScanExW.argtypes = [ wintypes.WCHAR, wintypes.HKL, ] GetMessageExtraInfo = windll.user32.GetMessageExtraInfo MapVirtualKeyW = windll.user32.MapVirtualKeyW # menu functions DrawMenuBar = windll.user32.DrawMenuBar DrawMenuBar.restype = wintypes.BOOL DrawMenuBar.argstype = [ wintypes.HWND, ] GetMenu = windll.user32.GetMenu GetMenu.restype = wintypes.HMENU GetMenu.argtypes = [ wintypes.HWND, ] GetMenuBarInfo = windll.user32.GetMenuBarInfo GetMenuBarInfo.restype = wintypes.BOOL GetMenuBarInfo.argtypes = [ wintypes.HWND, wintypes.LONG, wintypes.LONG, POINTER(win32structures.MENUBARINFO), ] GetMenuInfo = windll.user32.GetMenuInfo GetMenuInfo.restype = wintypes.BOOL GetMenuInfo.argtypes = [ wintypes.HWND, POINTER(win32structures.MENUINFO), ] GetMenuItemCount = windll.user32.GetMenuItemCount GetMenuItemCount.restype = c_int GetMenuItemCount.argtypes = [ wintypes.HMENU, ] GetMenuItemInfo = windll.user32.GetMenuItemInfoW GetMenuItemInfo.restype = wintypes.BOOL GetMenuItemInfo.argtypes = [ wintypes.HMENU, wintypes.UINT, wintypes.BOOL, POINTER(win32structures.MENUITEMINFOW), ] SetMenuItemInfo = windll.user32.SetMenuItemInfoW SetMenuItemInfo.restype = wintypes.BOOL SetMenuItemInfo.argtypes = [ wintypes.HMENU, wintypes.UINT, wintypes.BOOL, POINTER(win32structures.MENUITEMINFOW), ] GetMenuItemRect = windll.user32.GetMenuItemRect GetMenuItemRect.restype = wintypes.BOOL GetMenuItemRect.argtypes = [ wintypes.HWND, wintypes.HMENU, wintypes.UINT, POINTER(wintypes.RECT), ] CheckMenuItem = windll.user32.CheckMenuItem CheckMenuItem.restype = wintypes.DWORD CheckMenuItem.argtypes = [ wintypes.HMENU, wintypes.UINT, wintypes.UINT, ] GetMenuState = windll.user32.GetMenuState GetMenuState.restype = wintypes.UINT GetMenuState.argtypes = [ wintypes.HMENU, wintypes.UINT, wintypes.UINT, ] GetSubMenu = windll.user32.GetSubMenu GetSubMenu.restype = wintypes.HMENU GetSubMenu.argtypes = [ wintypes.HMENU, c_int, ] GetSystemMenu = windll.user32.GetSystemMenu GetSystemMenu.restype = wintypes.HMENU GetSystemMenu.argtypes = [ wintypes.HWND, wintypes.BOOL, ] HiliteMenuItem = windll.user32.HiliteMenuItem HiliteMenuItem.restype = wintypes.BOOL HiliteMenuItem.argtypes = [ wintypes.HWND, wintypes.HMENU, wintypes.UINT, wintypes.UINT, ] IsMenu = windll.user32.IsMenu IsMenu.restype = wintypes.BOOL IsMenu.argtypes = [ wintypes.HMENU, ] MenuItemFromPoint = windll.user32.MenuItemFromPoint MenuItemFromPoint.restype = c_int MenuItemFromPoint.argtypes = [ wintypes.HWND, wintypes.HMENU, POINTER(wintypes.POINT), ] BringWindowToTop = windll.user32.BringWindowToTop BringWindowToTop.restype = wintypes.BOOL BringWindowToTop.argtypes = [ wintypes.HWND, ] GetParent = windll.user32.GetParent GetParent.restype = wintypes.HWND GetParent.argtypes = [ wintypes.HWND, ] GetWindow = windll.user32.GetWindow GetWindow.restype = wintypes.HWND GetWindow.argtypes = [ wintypes.HWND, wintypes.UINT, ] ShowWindow = windll.user32.ShowWindow ShowWindow.restype = wintypes.BOOL ShowWindow.argtypes = [ wintypes.HWND, c_int, ] GetWindowContextHelpId = windll.user32.GetWindowContextHelpId GetWindowContextHelpId.restype = wintypes.DWORD GetWindowContextHelpId.argtypes = [ wintypes.HWND, ] GetWindowLong = windll.user32.GetWindowLongW GetWindowLong.restype = wintypes.LONG GetWindowLong.argtypes = [ wintypes.HWND, c_int, ] GetWindowPlacement = windll.user32.GetWindowPlacement GetWindowPlacement.restype = wintypes.BOOL GetWindowPlacement.argtypes = [ wintypes.HWND, POINTER(win32structures.WINDOWPLACEMENT), ] GetWindowRect = windll.user32.GetWindowRect GetWindowRect.restype = wintypes.BOOL GetWindowRect.argtypes = [ wintypes.HWND, POINTER(wintypes.RECT), ] GetWindowText = windll.user32.GetWindowTextW GetWindowText.restype = c_int GetWindowText.argtypes = [ wintypes.HWND, wintypes.LPWSTR, c_int, ] GetWindowTextLength = windll.user32.GetWindowTextLengthW GetWindowTextLength.restype = c_int GetWindowTextLength.argtypes = [ wintypes.HWND, ] GetClassName = windll.user32.GetClassNameW GetClassName.restype = c_int GetClassName.argtypes = [ wintypes.HWND, wintypes.LPWSTR, c_int, ] GetClientRect = windll.user32.GetClientRect GetClientRect.restype = wintypes.BOOL GetClientRect.argtypes = [ wintypes.HWND, POINTER(wintypes.RECT), ] IsChild = windll.user32.IsChild IsChild.restype = wintypes.BOOL IsChild.argtypes = [ wintypes.HWND, wintypes.HWND, ] IsWindow = windll.user32.IsWindow IsWindow.restype = wintypes.BOOL IsWindow.argtypes = [ wintypes.HWND, ] IsWindowUnicode = windll.user32.IsWindowUnicode IsWindowUnicode.restype = wintypes.BOOL IsWindowUnicode.argtypes = [ wintypes.HWND, ] IsWindowVisible = windll.user32.IsWindowVisible IsWindowVisible.restype = wintypes.BOOL IsWindowVisible.argtypes = [ wintypes.HWND, ] IsWindowEnabled = windll.user32.IsWindowEnabled IsWindowEnabled.restype = wintypes.BOOL IsWindowEnabled.argtypes = [ wintypes.HWND, ] ClientToScreen = windll.user32.ClientToScreen ClientToScreen.restype = wintypes.BOOL ClientToScreen.argtypes = [ wintypes.HWND, POINTER(wintypes.POINT), ] ScreenToClient = windll.user32.ScreenToClient ScreenToClient.restype = wintypes.BOOL ScreenToClient.argtypes = [ wintypes.HWND, POINTER(wintypes.POINT), ] GetCurrentThreadId = windll.kernel32.GetCurrentThreadId GetCurrentThreadId.restype = wintypes.DWORD GetCurrentThreadId.argtypes = [ ] GetWindowThreadProcessId = windll.user32.GetWindowThreadProcessId GetWindowThreadProcessId.restype = wintypes.DWORD GetWindowThreadProcessId.argtypes = [ wintypes.HWND, POINTER(wintypes.DWORD), ] GetGUIThreadInfo = windll.user32.GetGUIThreadInfo GetGUIThreadInfo.restype = wintypes.BOOL GetGUIThreadInfo.argtypes = [ wintypes.DWORD, POINTER(win32structures.GUITHREADINFO), ] AttachThreadInput = windll.user32.AttachThreadInput AttachThreadInput.restype = wintypes.BOOL AttachThreadInput.argtypes = [ wintypes.DWORD, wintypes.DWORD, wintypes.BOOL ] OpenProcess = windll.kernel32.OpenProcess OpenProcess.restype = wintypes.HANDLE OpenProcess.argtypes = [ wintypes.DWORD, wintypes.BOOL, wintypes.DWORD, ] CloseHandle = windll.kernel32.CloseHandle CloseHandle.restype = wintypes.BOOL CloseHandle.argtypes = [ wintypes.HANDLE, ] CreateProcess = windll.kernel32.CreateProcessW CreateProcess.restype = wintypes.BOOL CreateProcess.argtypes = [ wintypes.LPCWSTR, wintypes.LPWSTR, POINTER(win32structures.SECURITY_ATTRIBUTES), POINTER(win32structures.SECURITY_ATTRIBUTES), wintypes.BOOL, wintypes.DWORD, wintypes.LPVOID, wintypes.LPCWSTR, POINTER(win32structures.STARTUPINFOW), POINTER(win32structures.PROCESS_INFORMATION), ] TerminateProcess = windll.kernel32.TerminateProcess TerminateProcess.restype = wintypes.BOOL TerminateProcess.argtypes = [ wintypes.HANDLE, wintypes.UINT, ] ExitProcess = windll.kernel32.ExitProcess ExitProcess.restype = None ExitProcess.argtypes = [ wintypes.UINT, ] ReadProcessMemory = windll.kernel32.ReadProcessMemory ReadProcessMemory.restype = wintypes.BOOL ReadProcessMemory.argtypes = [ wintypes.HANDLE, wintypes.LPVOID, wintypes.LPVOID, c_size_t, POINTER(c_size_t), ] GlobalAlloc = windll.kernel32.GlobalAlloc GlobalLock = windll.kernel32.GlobalLock GlobalUnlock = windll.kernel32.GlobalUnlock SendMessage = windll.user32.SendMessageW SendMessage.restype = wintypes.LPARAM SendMessage.argtypes = [ wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPVOID, ] SendMessageTimeout = windll.user32.SendMessageTimeoutW SendMessageTimeout.restype = wintypes.LPARAM SendMessageTimeout.argtypes = [ wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM, wintypes.UINT, wintypes.UINT, win32structures.PDWORD_PTR, ] PostMessage = windll.user32.PostMessageW PostMessage.restype = wintypes.BOOL PostMessage.argtypes = [ wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM, ] GetMessage = windll.user32.GetMessageW GetMessage.restype = wintypes.BOOL GetMessage.argtypes = [ POINTER(wintypes.MSG), wintypes.HWND, wintypes.UINT, wintypes.UINT, ] RegisterWindowMessage = windll.user32.RegisterWindowMessageW RegisterWindowMessage.restype = wintypes.UINT RegisterWindowMessage.argtypes = [ wintypes.LPCWSTR, ] MoveWindow = windll.user32.MoveWindow MoveWindow.restype = wintypes.BOOL MoveWindow.argtypes = [ wintypes.HWND, c_int, c_int, c_int, c_int, wintypes.BOOL, ] EnableWindow = windll.user32.EnableWindow EnableWindow.restype = wintypes.BOOL EnableWindow.argtypes = [ wintypes.HWND, wintypes.BOOL, ] SetFocus = windll.user32.SetFocus SetFocus.restype = wintypes.HWND SetFocus.argtypes = [ wintypes.HWND, ] SetWindowLong = windll.user32.SetWindowLongW SetWindowLong.restype = wintypes.LONG SetWindowLong.argtypes = [ wintypes.HWND, c_int, wintypes.LONG, ] try: SetWindowLongPtr = windll.user32.SetWindowLongPtrW SetWindowLongPtr.argtypes = [wintypes.HWND, c_int, wintypes.LONG_PTR] SetWindowLongPtr.restype = wintypes.LONG_PTR except AttributeError: SetWindowLongPtr = SetWindowLong SystemParametersInfo = windll.user32.SystemParametersInfoW SystemParametersInfo.restype = wintypes.UINT SystemParametersInfo.argtypes = [ wintypes.UINT, wintypes.UINT, wintypes.LPVOID, # should map well to PVOID wintypes.UINT, ] VirtualAllocEx = windll.kernel32.VirtualAllocEx VirtualAllocEx.restype = wintypes.LPVOID VirtualAllocEx.argtypes = [ wintypes.HANDLE, wintypes.LPVOID, c_size_t, wintypes.DWORD, wintypes.DWORD, ] VirtualFreeEx = windll.kernel32.VirtualFreeEx VirtualFreeEx.restype = wintypes.BOOL VirtualFreeEx.argtypes = [ wintypes.HANDLE, wintypes.LPVOID, c_size_t, wintypes.DWORD, ] VirtualAlloc = windll.kernel32.VirtualAlloc VirtualAlloc.restype = wintypes.LPVOID VirtualAlloc.argtypes = [ wintypes.LPVOID, c_size_t, wintypes.DWORD, wintypes.DWORD, ] VirtualFree = windll.kernel32.VirtualFree VirtualFree.retype = wintypes.BOOL VirtualFree.argtypes = [ wintypes.LPVOID, c_size_t, wintypes.DWORD, ] WriteProcessMemory = windll.kernel32.WriteProcessMemory WriteProcessMemory.restype = wintypes.BOOL WriteProcessMemory.argtypes = [ wintypes.HANDLE, wintypes.LPVOID, wintypes.LPVOID, c_size_t, POINTER(c_size_t), ] ReleaseCapture = windll.user32.ReleaseCapture ReleaseCapture.restype = wintypes.BOOL ReleaseCapture.argtypes = [ ] WindowFromPoint = windll.user32.WindowFromPoint WindowFromPoint.restype = wintypes.HWND WindowFromPoint.argtypes = [ wintypes.POINT, ] WaitForSingleObject = windll.kernel32.WaitForSingleObject WaitForSingleObject.restype = wintypes.DWORD WaitForSingleObject.argtypes = [ wintypes.HANDLE, wintypes.DWORD, ] WaitForInputIdle = windll.user32.WaitForInputIdle WaitForInputIdle.restype = wintypes.DWORD WaitForInputIdle.argtypes = [ wintypes.HANDLE, wintypes.DWORD, ] IsHungAppWindow = windll.user32.IsHungAppWindow IsHungAppWindow.restype = wintypes.BOOL IsHungAppWindow.argtypes = [ wintypes.HWND, ] GetModuleFileNameEx = windll.psapi.GetModuleFileNameExW GetModuleFileNameEx.restype = wintypes.DWORD GetModuleFileNameEx.argtypes = [ wintypes.HANDLE, wintypes.HMODULE, wintypes.LPWSTR, wintypes.DWORD, ] GetClipboardData = windll.user32.GetClipboardData GetClipboardData.restype = wintypes.HANDLE GetClipboardData.argtypes = [ wintypes.UINT, ] OpenClipboard = windll.user32.OpenClipboard OpenClipboard.restype = wintypes.BOOL OpenClipboard.argtypes = [ wintypes.HWND, ] EmptyClipboard = windll.user32.EmptyClipboard EmptyClipboard.restype = wintypes.BOOL EmptyClipboard.argtypes = [ ] CloseClipboard = windll.user32.CloseClipboard CloseClipboard.restype = wintypes.BOOL CloseClipboard.argtypes = [ ] CountClipboardFormats = windll.user32.CountClipboardFormats CountClipboardFormats.restype = c_int CountClipboardFormats.argtypes = [ ] EnumClipboardFormats = windll.user32.EnumClipboardFormats EnumClipboardFormats.restype = wintypes.UINT EnumClipboardFormats.argtypes = [ wintypes.UINT, ] GetClipboardFormatName = windll.user32.GetClipboardFormatNameW GetClipboardFormatName.restype = c_int GetClipboardFormatName.argtypes = [ wintypes.UINT, wintypes.LPWSTR, c_int, ] # DPIAware API funcs are not available on WinXP try: IsProcessDPIAware = windll.user32.IsProcessDPIAware SetProcessDPIAware = windll.user32.SetProcessDPIAware except AttributeError: IsProcessDPIAware = None SetProcessDPIAware = None # DpiAwareness API funcs are available only from win 8.1 and greater # Supported types of DPI awareness described here: # https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx # typedef enum _Process_DPI_Awareness { # Process_DPI_Unaware = 0, # Process_System_DPI_Aware = 1, # Process_Per_Monitor_DPI_Aware = 2 # } Process_DPI_Awareness; try: shcore = windll.LoadLibrary("Shcore.dll") SetProcessDpiAwareness = shcore.SetProcessDpiAwareness GetProcessDpiAwareness = shcore.GetProcessDpiAwareness Process_DPI_Awareness = { "Process_DPI_Unaware" : 0, "Process_System_DPI_Aware" : 1, "Process_Per_Monitor_DPI_Aware" : 2 } except (OSError, AttributeError): SetProcessDpiAwareness = None GetProcessDpiAwareness = None Process_DPI_Awareness = None # Setup DPI awareness for the python process if any is supported if SetProcessDpiAwareness: ActionLogger().log("Call SetProcessDpiAwareness") SetProcessDpiAwareness( Process_DPI_Awareness["Process_Per_Monitor_DPI_Aware"]) elif SetProcessDPIAware: ActionLogger().log("Call SetProcessDPIAware") SetProcessDPIAware() GetQueueStatus = windll.user32.GetQueueStatus LoadString = windll.user32.LoadStringW #def MapVirtualKeyExW(p1, p2, p3): # # C:/PROGRA~1/MICROS~4/VC98/Include/winuser.h 4376 # return MapVirtualKeyExW._api_(p1, p2, p3) #MapVirtualKeyEx = stdcall( # UINT, 'user32', [c_uint, c_uint, c_long]) (MapVirtualKeyExW) # #==================================================================== def MakeLong(high, low): """Pack high into the high word of a long and low into the low word""" # we need to AND each value with 0xFFFF to account for numbers # greater then normal WORD (short) size return ((high & 0xFFFF) << 16) | (low & 0xFFFF) #==================================================================== def HiWord(value): """Return the high word from a long""" #return (value & (~ 0xFFFF)) / 0xFFFF return (value >> 16) & 0xffff #==================================================================== def LoWord(value): """Return the low word from a long""" return value & 0xFFFF #==================================================================== def WaitGuiThreadIdle(handle): """Wait until the thread of the specified handle is ready""" process_id = wintypes.DWORD(0) GetWindowThreadProcessId(handle, byref(process_id)) # ask the control if it has finished processing the message hprocess = OpenProcess( win32defines.PROCESS_QUERY_INFORMATION, 0, process_id.value) # WaitForInputIdle call is removed because it's useful only # while an app is starting (should be called only once) if IsHungAppWindow(handle) == win32defines.TRUE: raise RuntimeError('Window (hwnd={0}) is not responding!'.format(handle)) CloseHandle(hprocess) #==================================================================== def GetDpiAwarenessByPid(pid): """Get DPI awareness properties of a process specified by ID""" dpi_awareness = -1 hProcess = None if GetProcessDpiAwareness and pid: hProcess = OpenProcess( win32defines.PROCESS_QUERY_INFORMATION, 0, pid) if not hProcess: # process doesn't exist, exit with a default return value return dpi_awareness try: dpi_awareness = c_int() hRes = GetProcessDpiAwareness( hProcess, byref(dpi_awareness)) CloseHandle(hProcess) if hRes == 0: return dpi_awareness.value finally: if hProcess: CloseHandle(hProcess) # GetProcessDpiAwareness is not supported or pid is not specified, # return a default value return dpi_awareness