• Получение количества открытых окон через WinApi?

    @antares4045
    Учитывая, что код на питоне принимается "на крайняк", не уверен, что это можно считать полноценным ответом: на питоне есть такая презамечательная либа: psutil при помощи которой я переодически пишу всякую грязь опираясь на шаблон
    import psutil
    import win32gui
    import win32process
    
    
    def enum_window_callback(hwnd, pid):
            tid, current_pid = win32process.GetWindowThreadProcessId(hwnd)
            if pid == current_pid and win32gui.IsWindowVisible(hwnd):
                windows.append(hwnd)
    
    for process in psutil.process_iter():
        pid = process.pid
        windows = []
        win32gui.EnumWindows(enum_window_callback, pid)
        windownames = [win32gui.GetWindowText(item) for item in windows]
        
        if len(windownames):
            exeName = process.name()
            for windowName in windownames:
                hwnd = win32gui.FindWindow(None, windowName)
                print(f'"{exeName}" - "{windowName}" - "{hwnd}"')

    Вывод:
    "NVIDIA Share.exe" - "NVIDIA GeForce Overlay" - "66250"
    "Code.exe" - "list of windows.py - grabscrren - Visual Studio Code" - "459882"
    "Code.exe" - "● N-mer-Krammer.py - Рандомный habr - Visual Studio Code" - "132316"
    "Battle.net.exe" - "Battle.net" - "132384"
    "explorer.exe" - "" - "65860"
    "explorer.exe" - "D:\" - "263030"
    "explorer.exe" - "" - "65860"
    "explorer.exe" - "" - "65860"
    "explorer.exe" - "" - "65860"
    "explorer.exe" - "" - "65860"
    "explorer.exe" - "Program Manager" - "131380"
    "python.exe" - "Jupyter Notebook" - "1639536"
    "chrome.exe" - "Получение количества открытых окон через WinApi? — Хабр Q&A - Google Chrome" - "1442268"


    На выходе имеем список формата запущенный экзешник - имя окна - pid
    для вашей задачи если вам не нравится какой-либо экзешник -- можете банить.

    но с трансляцией в плюсы есть проблема: psutil (я пытался разобраться пару лет назад) под капотом творит какую-то чёрную магию, так что единственное, что могу вам предложить, это скомпилировать этот скрипт в отдельный экзешник и вызывать его субпроцессом (ну или игнорировать мой ответ).

    Правда если вы знаете способ (вдруг), как под виндой получить список всех pid, то поделитесь -- буду очень рад.

    UPD:
    не смог отпустить и сделал реализацию полностью на winapi
    import win32gui
    import win32process
    import win32api
    import win32process
    import win32con
    
    
    def enum_window_callback(hwnd, _):
            if win32gui.IsWindowVisible(hwnd):
                tid, current_pid = win32process.GetWindowThreadProcessId(hwnd)
                handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, current_pid)
                proc_name = win32process.GetModuleFileNameEx(handle, 0)
                windows.append({
                    "hwnd":hwnd, 
                    "pid" : current_pid, 
                    "tid" : tid,
                    "window title" : win32gui.GetWindowText(hwnd),
                    "process name" : proc_name
                    })
    
    windows = []
    
    win32gui.EnumWindows(enum_window_callback, None)
    
    for window in windows:
        print(f'"{window["process name"]}"', window['pid'], f'"{window["window title"]}"', window['hwnd'], sep=' - ')

    Вывод:
    "C:\Windows\explorer.exe" - 8084 - "" - 65736
    "C:\Users\Тоха\AppData\Local\Programs\Microsoft VS Code\Code.exe" - 6124 - "list of windows.py - grabscrren - Visual Studio Code" - 459882
    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" - 11696 - "windows - How can I get process name using Python - Stack Overflow - Google Chrome" - 131222
    "C:\Users\Тоха\AppData\Local\Programs\Microsoft VS Code\Code.exe" - 6124 - "● N-mer-Krammer.py - Рандомный habr - Visual Studio Code" - 132316
    "C:\Qt\Tools\QtCreator\bin\qtcreator.exe" - 11308 - "main.cpp @ processScan - Qt Creator" - 1967294
    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" - 11696 - "Получение количества открытых окон через WinApi? — Хабр Q&A - Google Chrome" - 1442268
    "C:\Anaconda3\python.exe" - 9912 - "Jupyter Notebook" - 1639536
    "C:\Program Files (x86)\Battle.net\Battle.net.exe" - 6396 - "Battle.net" - 132384
    "C:\Windows\explorer.exe" - 8084 - "D:\" - 263030
    "C:\Windows\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\InputApp\TextInputHost.exe" - 12956 - "Microsoft Text Input Application" - 131658
    "C:\Program Files\NVIDIA Corporation\NVIDIA GeForce Experience\NVIDIA Share.exe" - 5488 - "NVIDIA GeForce Overlay" - 66250
    "C:\Windows\explorer.exe" - 8084 - "" - 65924
    "C:\Windows\explorer.exe" - 8084 - "" - 65932
    "C:\Windows\explorer.exe" - 8084 - "" - 65892
    "C:\Windows\explorer.exe" - 8084 - "" - 65890
    "C:\Windows\explorer.exe" - 8084 - "Program Manager" - 131380

    При переносе на плюсы столкнулся с тем, что не помню, как нормально импортировать всех этих винюзеров -- если напишете скиньте в комметарии, а мне надоело)
    Ответ написан
    2 комментария
  • Как поменять изображение на рабочем столе Windows 10?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Тебе нужно сделать всего 2 действия:
    1. Открыть гугл, написать "python change wallpaper windows 10" и просто открыть самую первую ссылку. Это я сделал за тебя, вот она.
    2. Открыть гугл, написать "run python on startup windows 10". Давай, я верю в тебя, ты сможешь нажать на первую ссылку (иногда по первой ссылке нет нужного ответа, но не беда - есть еще 2, 3, 4 и вообще много-много ссылок, не бойся их нажимать).

    Правда есть один нюанс - если ты тупо скопируешь код из ответа по первой ссылке и попробуешь таким образом его запустить - возможно что-то пойдет не так и тебе нужно будет чуть-чуть подумать и подредактировать код, что бы он соответствовал требованиям. Подумать тебе может помочь очень добрый дядька - Марк Лутц, он даже книгу написал, шикарную книгу, честно.
    Ответ написан
    1 комментарий
  • Как встроить видео ряд в программу?

    @o5a
    Можно запаковать в exe PyInstaller, или встроить свое видео в виде base64 в сам скрипт. Но видео даже небольшое заметно увеличит размер скрипта.
    Ответ написан
    Комментировать
  • Почему не могу встроить изображение в base64?

    @o5a
    Не надо туда вставлять служебную информацию типа "data:image/jpeg;base64", только сам код base64
    Ответ написан
    5 комментариев
  • Как встроить изображение в программу?

    NeiroNx
    @NeiroNx
    Программист
    Base64, помните что Base64 это не метод сжатия - код существенно увеличится не пропорционально объему изображения:
    import tkinter as tk
    
    IMAGE_DATA = '''
        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
        RU5ErkJggg==
        '''
    
    root = tk.Tk()
    image = tk.PhotoImage(data=IMAGE_DATA)
    label = tk.Label(root, image=image, padx=100, pady=100)
    label.pack()
    
    root.mainloop()
    Ответ написан
    1 комментарий
  • Как сделать проверку на схожесть элементов списка?

    @o5a
    Использовать множества (set). В множестве все элементы уникальны.
    mylist = [1,2,1,3,2,4]
    myset = set(mylist)
    print(myset)
    # {1,2,3,4}


    Таким образом, чтобы проверить, есть ли повторы, нужно сравнить длину изначального списка и множества от этого списка.

    И для создания изначально уникальных чисел можно сразу использовать random.sample. Он из указанной последовательности выберет N уже уникальных значений.
    mylist = random.sample(range(1, 40001), 47)
    Ответ написан
    3 комментария