Как можно запустить счётчик при открытии приложения?

Как реализовать простой счётчик на JS, Python (или Ruby), который будет запускать таймер при открытии и закрытии определённого приложения?
  • 13 февраля 2025 г. 22:34
Ответы на вопрос 2
Для реализации простого счётчика, который будет отслеживать время, проведенное в определённом приложении, можно использовать разные подходы в зависимости от языка программирования. 

### JavaScript
Если вы хотите отслеживать активность в веб-приложении, то можно использовать JavaScript с помощью интерфейса `setInterval` для запуска таймера:

```javascript
let timer;
let count = 0;

function startTimer() {
    timer = setInterval(() => {
        count++;
        console.log(`Время, проведённое в приложении: ${count} секунд`);
    }, 1000);
}

function stopTimer() {
    clearInterval(timer);
    console.log(`Счётчик остановлен. Проведено времени: ${count} секунд`);
}

// Запускейте таймер
startTimer();

// Остановите таймер при закрытии приложения (например с помощью window.onbeforeunload)
// window.onbeforeunload = stopTimer;
```

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

### Python
Для создания более универсального счётчика в настольном приложении на Python можно использовать библиотеку `psutil` для отслеживания запущенных процессов:

```python
import time
import psutil

app_name = 'имя_вашего_приложения.exe'
count = 0

def is_app_running(app_name):
    for proc in psutil.process_iter(['name']):
        if proc.info['name'] == app_name:
            return True
    return False

try:
    while True:
        if is_app_running(app_name):
            count += 1
            print(f"Время, проведённое в приложении: {count} секунд")
        else:
            if count > 0:
                print(f"Счётчик остановлен. Проведено времени: {count} секунд")
                count = 0
        time.sleep(1)  # проверять каждую секунду
except KeyboardInterrupt:
    print("Счётчик завершён.")
```

### Ruby
На Ruby можно использовать библиотеку `sys-proctable` для аналогичных целей:

```ruby
require 'sys/proctable'

app_name = 'имя_вашего_приложения'
count = 0

def running?(app_name)
  Sys::ProcTable.ps.any? { |p| p.name == app_name }
end

begin
  loop do
    if running?(app_name)
      count += 1
      puts "Время, проведённое в приложении: #{count} секунд"
    else
      if count > 0
        puts "Счётчик остановлен. Проведено времени: #{count} секунд"
        count = 0
      end
    end
    sleep 1  # проверять каждую секунду
  end
rescue Interrupt
  puts "Счётчик завершён."
end
```

### Заключение
Выше приведены примеры на JavaScript, Python и Ruby для создания простого счётчика времени, проведённого в приложении. Вы можете изменить название приложения в переменной `app_name` на необходимое вам, а также адаптировать код под свои нужды. Каждый из этих примеров представляет собой бесконечный цикл, который проверяет, запущено ли приложение, и обновляет счётчик времени.
Если нужно зацепиться за другой элемент, вбей 
powershell gps | where {$_.MainWindowTitle } | select *


import asyncio

class timer_executer:
    def __init__(self, appname, timeout, do):
        self.appname = appname
        self.timeout = timeout
        self.do = do

    async def get_active_apps(self):
        cmd = 'powershell "gps | where {$_.MainWindowTitle } | select Path'
        cmd_execution_result = await asyncio.create_subprocess_shell(cmd, shell=True, stdout=asyncio.subprocess.PIPE)
        responce_raw, _ = await cmd_execution_result.communicate()
        responce_splited = responce_raw.decode().split("\n")[3:]
        return [responce_line.strip().lower() for responce_line in responce_splited if responce_line.strip()]

    async def loop_await(self):
        time_on_active = 0
        while True:
            active_apps = await self.get_active_apps()

            if self.appname.lower() in active_apps:
                time_on_active += 1
                if time_on_active >= self.timeout:
                    self.do()
                    break
            else:
                time_on_active = 0
            await asyncio.sleep(1)

    async def start(self):
        await self.loop_await()


def do_something():
    print("Привет!")


async def main():
    timer = timer_executer("c:\\program files\\windowsapps\\microsoft.windowsnotepad_11.2409.9.0_x64__8wekyb3d8bbwe\\notepad\\notepad.exe", 10, do_something)
    await timer.start()

asyncio.run(main())
Похожие вопросы