Вводная: windows 10 (x64), python 3.6, pyCharm 3.2(CE), pypiwin32(220), tkinter
Пишу небольшой скрипт для получения дескриптора окна с последующим обращением к нему, в принципе всё нормально работает кроме одного момента, если закрыть гуи виндовым “крестиком” программа выпадает с:
Process finished with exit code -1073740771 (0xC000041D)
Если дать программе полностью выполнить код, она сама закроет гуи без ошибок.
Методом перебора выяснил что ошибку вызывает модуль win32ui, но он нужен.
Код программыc с примером работы:
from tkinter import * from tkinter.ttk import * import win32gui, win32con, win32ui #processListReturn[0] - hwnd #processListReturn[0] - title def gui_finder(): processList = [] processListTitle = [] processListReturn= [] def start_parsing(event): processListReturn.append(processList[processList.index(comboboxValues.get())-1]) processListReturn.append(processList[processList.index(comboboxValues.get())]) wProcessWin.quit() def window_callback(hwnd, n): title = win32gui.GetWindowText(hwnd) if title != '' and win32gui.IsWindowVisible(hwnd): processList.append(hwnd) processList.append(title) processListTitle.append(title) def quit(): wProcessWin.destroy() sys.exit() wProcessWin = Tk() wProcessWin.protocol("WM_DELETE_WINDOW", quit) wProcessWin.geometry('234x78') wProcessWin.resizable(width='false', height='false') wProcessWin.title('finderGui') Label(text='Select windows:').place(x=6, y=0) win32gui.EnumWindows(window_callback, None) comboboxValues = StringVar() Combobox(wProcessWin, textvariable=comboboxValues, value=processListTitle, width=33).place(x=6, y=20) wButton = Button(wProcessWin, text='Start', width=14) wButton.bind("<Button-1>", start_parsing) wButton.place(x=134, y=47) wProcessWin.mainloop() wProcessWin.destroy() return processListReturn def screen(hwnd, path="screenshot.png"): left, top, right, bot = win32gui.GetWindowRect(hwnd) w = right - left h = bot - top wDC = win32gui.GetWindowDC(hwnd) dcObj = win32ui.CreateDCFromHandle(wDC) cDC = dcObj.CreateCompatibleDC() dataBitMap = win32ui.CreateBitmap() dataBitMap.CreateCompatibleBitmap(dcObj, w, h) cDC.SelectObject(dataBitMap) cDC.BitBlt((0, 0), (w, h), dcObj, (0, 0), win32con.SRCCOPY) dataBitMap.SaveBitmapFile(cDC, path) dcObj.DeleteDC() cDC.DeleteDC() win32gui.ReleaseDC(hwnd, wDC) win32gui.DeleteObject(dataBitMap.GetHandle()) test = gui_finder() screen(test[0])