Привет! Хочу поделиться с вами своим проектом. Я сделал небольшую программу на Python, которая помогает легко очищать корзину в Windows 10. Этот инструмент — мой собственный open-source проект, и вы можете найти его в моем репозитории на GitHub.

Что Делает Программа?

  1. Очистка Корзины: Ппрограмма очищает корзину без необходимости подтверждения. Просто нажмите кнопку, и все, корзина пуста!

  2. Иконка в Системном Трейе: Программа имеет иконку в системном трее, которая показывает, пуста корзина или нет. Иконка меняется в зависимости от состояния корзины.

  3. Уведомления: Если корзина очищена успешно или возникла ошибка, программа отправит вам уведомление, чтобы вы знали, что произошло.

Код Программы

import ctypes
import threading
import pystray
from pystray import MenuItem as item, Menu as menu
from PIL import Image
import time
import os
import sys
from plyer import notification

class SHQUERYRBINFO(ctypes.Structure):
    _fields_ = [
        ("cbSize", ctypes.c_ulong),
        ("i64Size", ctypes.c_int64),
        ("i64NumItems", ctypes.c_int64)
    ]

def resource_path(relative_path):
    """ Получает путь к ресурсам, поддерживает работу с PyInstaller. """
    try:
        base_path = sys._MEIPASS
    except AttributeError:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

def load_icon(icon_path):
    return Image.open(resource_path(icon_path))

def show_notification(title, message, icon_path=None):
    notification.notify(
        title=title,
        message=message,
        app_icon=icon_path,
        timeout=1
    )

def empty_recycle_bin(icon, item):
    SHEmptyRecycleBin = ctypes.windll.shell32.SHEmptyRecycleBinW
    flags = 0x01  # SHERB_NOCONFIRMATION
    bin_path = ctypes.create_unicode_buffer(260)
    ctypes.windll.shell32.SHGetFolderPathW(0, 0x0005, 0, 0, bin_path)
    result = SHEmptyRecycleBin(None, bin_path, flags)

    if result == 0 or result == -2147418113:
        show_notification("Корзина", "Корзина успешно очищена.", resource_path("icons/minibin-kt-empty.ico"))
        update_icon()
    else:
        show_notification("Корзина", f"Произошла ошибка при очистке корзины. Код ошибки: {result}", "icons/minibin-kt-full.ico")

def exit_program(icon, item):
    icon.stop()

def update_icon():
    if is_recycle_bin_empty():
        tray_icon.icon = load_icon("icons/minibin-kt-empty.ico")
    else:
        tray_icon.icon = load_icon("icons/minibin-kt-full.ico")

def is_recycle_bin_empty():
    rbinfo = SHQUERYRBINFO()
    rbinfo.cbSize = ctypes.sizeof(SHQUERYRBINFO)
    result = ctypes.windll.shell32.SHQueryRecycleBinW(None, ctypes.byref(rbinfo))

    if result != 0:
        print("Ошибка при запросе состояния корзины.")
        return False

    return rbinfo.i64NumItems == 0

def periodic_update():
    while True:
        update_icon()
        time.sleep(3)

def create_tray_icon():
    menu_options = (item("Очистить корзину", empty_recycle_bin), item("Выход", exit_program))
    tray_menu = menu(*menu_options)
    global tray_icon

    initial_empty = is_recycle_bin_empty()
    tray_icon = pystray.Icon("name", load_icon("icons/minibin-kt-empty.ico") if initial_empty else load_icon("icons/minibin-kt-full.ico"), "Minibin от King Triton", tray_menu)
    return tray_icon

if __name__ == "__main__":
    tray_icon = create_tray_icon()
    threading.Thread(target=periodic_update, daemon=True).start()
    tray_icon.run()

Как Это Работает?

  1. Загрузка Ресурсов и Иконок: Программа умеет находить иконки и другие файлы, независимо от того, в каком режиме она запущена — в разработке или после упаковки.

  2. Очистка Корзины: Когда вы выбираете опцию очистки корзины, программа использует системные вызовы Windows 10 для выполнения этой задачи. Если все прошло хорошо, иконка меняется на пустую. В случае ошибки получите уведомление.

  3. Проверка Состояния Корзины: Скрипт регулярно проверяет состояние корзины и обновляет иконку, чтобы вы всегда знали, пуста она или нет.

  4. Создание Значка в Системном Трейе: Я использую библиотеку pystray, чтобы создать иконку в системном трее с простым меню, которое позволяет очистить корзину или выйти из программы.

Итог

Этот проект — мой вклад в мир open-source, и я надеюсь, что он окажется полезным. Программа проста в использовании и делает управление корзиной на Windows 10 легким и удобным. Если вы хотите попробовать её, посетите мой репозиторий на GitHub.

Буду рад любым отзывам и предложениям!

Комментарии (31)


  1. Grey83
    30.08.2024 07:52

    А что, в 10-ке отключили возможность размещать значок корзины на рабочем столе?
    В трее вроде её можно было размещать в XP.

    Из усовершенствований вижу только иконку в трее и отсутствие подтверждения.
    Может стоило бы добавить возможность включения/отключения этого самого подтверждения: вдруг оно кому-то всё же нужно?

    Ну и 8МБ для такой утилиты как-то многовато, кмк.


    1. KING_TRITON Автор
      30.08.2024 07:52

      согласен, но, делал под себя, а иконки рабочего стола я скрыл полностью, мне удобно по трею ориентироваться, по поводу включения и отключения уведомления, думал, может потом сделаю


    1. EasyMoney322
      30.08.2024 07:52
      +1

      На 10-ке, на 11 и на серверах (с Desktop Experience, очевидно) по-прежнему есть. Включается в персонализации->Темы->Иконки рабочего стола. Плюс можно на "Начальном экране" закрепить.

      Насколько я понял из статьи, концепт именно в отсутствии подтверждения очистки и отображении её состояния в системном "Трейе".


      1. KING_TRITON Автор
        30.08.2024 07:52

        в целом да, а на начальном экране я закреплял, не удобно лично мне


  1. zarnii
    30.08.2024 07:52
    +1

    Где-то такую утилиту уже видел в 2019-2020 году.....


    1. babypowder
      30.08.2024 07:52

      тогда ему было 20 лет


      1. zarnii
        30.08.2024 07:52

        Нашел вот такую информацию. Пишут, что MiniBin появилась в 2004. А еще, оказывается, от этого же автора есть MicroBin


        1. babypowder
          30.08.2024 07:52

          это выходит он с пяти лет программит


  1. Andrey_Solomatin
    30.08.2024 07:52
    +1

    Этот проект — мой вклад в мир open-source, и я надеюсь, что он окажется полезным.

    Это вклад в ваше образование и портфолио. Это полезно.


  1. Andrey_Solomatin
    30.08.2024 07:52
    +1

    Инстукции по установке: Скачайте испольняемый файл и запустите его.

    Для меня, это карсный флаг. Даже если у вас нет плохих намерений, то у вас могут быть вирусы, которые прописывают себя в каждый .exe файл.


    1. Wowhere
      30.08.2024 07:52

      А как распространять программы как не в исполняемых файлах?) Да и наличие инсталятора у программы тоже не является гарантией того что там нет вирусов


      1. dartraiden
        30.08.2024 07:52

        Инсталлятор это же тоже программа. В нём тоже могут быть "вирусы, которые прописывают себя в каждый .exe файл".

        Более того, если у программы есть инсталлятор, то вы запускаете, по сути, две программы: сначала программу-инсталлятор, а потом саму программу, которую инсталлятор установил.


    1. KING_TRITON Автор
      30.08.2024 07:52

      учту на будущее этот момент, подскажите пожалуйста если я буду через virustotal проверять и ссылку прикладывать этого будет достаточно?


    1. dartraiden
      30.08.2024 07:52
      +2

      Непонятная претензия. Код открыт. Скомпилируйте сами.

      А как вы другие программы используете? Не в виде исполняемых файлов?


      1. KING_TRITON Автор
        30.08.2024 07:52

        готовый .exe есть в репозитории, во вкладке releses


      1. KING_TRITON Автор
        30.08.2024 07:52

        А как вы другие программы используете? Не в виде исполняемых файлов?

        все программы которые создаю, использую как исполняемые файлы .exe,

        компилирую через pyinstaller


        1. dartraiden
          30.08.2024 07:52

          Это были вопросы Андрею Соломатину.