[Çözüldü]Programı Arka Planda Çalıştırmak

Merhaba. Python’la ilgili bir çalışma yapıyorum. Çalışmam bir tuşa basıldığında kolayca ekran görüntüsünü alıp istediğim dizine kaydetme üzerine. PyAutoGui modülüyle basit bir şekilde ekran görüntüsü alabiliyorum ancak kullanılabilirlik açısından programı döngüye sokmam gerekiyor. Mesela S tuşuna basınca ekran görüntüsü alıyorum. Programı her ekran görüntüsünde tekrar çalıştırmak yerine döngü ile her S’ye basışımda ekran görüntüsü almasını sağladım. Fakat CMD ekranını arka plana attığım zaman, yani örnek olarak tarayıcıya tıklayıp S’ye bastığım zaman ekran görüntüsünü almıyor. İlla CMD ekranının ön planda olması gerekiyor görüntü alması için. Bunu engellemenin bir yolu var mı?

Umarım derdimi anlatabilmişimdir. :slight_smile:

Merhaba,
Acaba aşağıda anlatılan yöntem işinize yarar mı?

  1. Öncelikle pyxhook modülünü kurun:
pip install pyxhook
  1. Pyxhook, basit bir keylogger’dır. Yani klavyeye bastığınız tuşları algılayan ve dilerseniz basılan tuşları sizin belirlediğiniz bir dosyaya kaydetmeye yarayan bir modüldür. Aşağıdaki örnek kod yapısına bir göz atın:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pyxhook


def dinle(event):
    if event.Ascii == 113:  # 113, q karakterinin ascii değeri.
        # q'ya basınca program sonlanacak.
        ornek.cancel()
    # İkinci bir durum tanımlayalım, yani:
    elif event.Ascii == 115: # 115, s karakterinin ascii değeri.
        # Buraya da 's' tuşuna basılınca yapılması gereken işlemleri
        # tanıtabilirsiniz.
        print("\n{} harfine basıldı.".format(chr(event.Ascii)))


# HookManager sınıfından bir örnek oluşturulur.
ornek = pyxhook.HookManager()

# Bütün tuş vuruşları dinlenir.
ornek.KeyDown = dinle

# Klavye yakalanır
ornek.HookKeyboard()

# Yakalama başlatılır
ornek.start()

Yukarıdaki kodları bir kez çalıştırmanız yeterlidir. Programı kapatana veya “q” tuşuna basana kadar program arka planda çalışmaya devam eder. Örnek olsun diye “s” tuşuna basıldığında konsol ekranına yazı bastıran bir print fonksiyonu kullandım. Siz “s” tuşuna bastığınızda print() fonksiyonu yerine ekran görüntüsü almanızı sağlayacak olan başka bir fonksiyonu yazabilirsiniz.

Teşekkür ediyorum yanıtladığınız için. Farklı bir tuş kaydı alan modül kullanarak çözdüm sorunumu. Şimdi de başka bir problemle karşılaştım. Dosya işlemlerinde integer olarak işlem yapabiliyor muyuz? Çok uğraştım ama bir türlü çözemedim. Bir sayaç oluşturdum ve her tuşa basıldığında artmasını istiyorum. Buraya kadar basit bir işlem. sayac += 1 oluyor. Ancak bunu bir dosyanın içindeki sayı için yapmak istiyorum. Yani şöyle:

sayac = 0
dosya = open("loglar.txt", "w")
sayac += 1
dosya.write("{0}".format(sayac))
print(sayac)
dosya.close()

sayac değişkeninin her seferinde 1 artması gerekiyor ancak bir türlü arttıramadım. Yani bu işlem dosyanın içindeki 1 sayısına etki etmeli. Nasıl çözebilirim bunu?

Aşağıdaki kodları bir deneyin:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pyxhook

# kayıtların tutulacağı dizin seçilir.
dizin = '/.../.././yeni.txt'  # veya yeni.log
say = 0


def dinle(event):
    global say
    say += 1
    dosya = open(dizin, 'w') 
    dosya.write(str(say))
    dosya.write('\n')
    if event.Ascii == 113:  # 113, q karakterinin ascii değeri.
        # q'ya basınca program sonlanacak.
        dosya.close()
        ornek.cancel()


# HookManager sınıfından bir örnek oluşturulur.
ornek = pyxhook.HookManager()

# Bütün tuş vuruşları dinlenir.
ornek.KeyDown = dinle

# Klavye yakalanır
ornek.HookKeyboard()

# Yakalama başlatılır
ornek.start()

Yukarıdaki kodlara göre bastığınız her tuş sayılır ve metin belgesinin üzerine yazılır.

Teşekkür ediyorum tekrar. Dediğiniz gibi yaptım ve istediğimi elde ettim fakat yine başka bir sorunla karşılaştım. Programı her kapatıp açtığımda saymaya sıfırdan başlıyor. Sizi uğraştırmamak için deminden beri çözümünü arıyorum, bir sürü yol deniyorum ama bir türlü başaramıyorum. Son çare olarak yine size sormak istedim. Program kapatılıp açıldığında kaldığı yerden saymaya devam etmesini nasıl sağlarım?

Dosya açma moduna (“w”) yazdığımız için, program tekrardan çalıştırıldığında yeni veriler eski verilerin üstüne yazıyor.

Şayet dosyayı (“a”) modunda açarsak da şöyle bir sonuçla karşılaşırız:

Diyelim 5 tane tuşa bastınız ve programı sonlandırdınız, txt dosyasında şunlar yazar:

1
2
3
4
5

Sonra programı yeniden çalıştırdınız ve bu kez 6 tane tuşa bastınız ve programı sonlandırdınız, txt dosyasında şöyle yazar:

1
2
3
4
5
1
2
3
4
5
6

Kaldığı yerden devam edemez çünkü say değişkeni program tekrardan çalıştırıldığında otomatik olarak 0’a eşitlenir çünkü öyle tanımlanmış.

Ha başka türlü tanımlanabilir mi?

Önce dosya okunur, dosyadaki değer say’a eşitlenir. Sonra da her basılan tuş için say 1 arttırılır. Birazdan deneyeceğim bunu.

Evet, oluyor. Kodları şu şekilde değiştirin:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pyxhook
import os

# kayıtların tutulacağı dizin seçilir.
dizin = '/.../.././yeni.txt'  # veya ***.log
say = 0
if os.path.exists(dizin):
    oku = open(dizin, "r")
    say += int(oku.read())
    oku.close()


def dinle(event):
    global say
    say += 1
    dosya = open(dizin, 'w')
    dosya.write(str(say))
    dosya.write('\n')
    if event.Ascii == 113:  # 113, q karakterinin ascii değeri.
        # q'ya basınca program sonlanacak.
        dosya.close()
        ornek.cancel()


# HookManager sınıfından bir örnek oluşturulur.
ornek = pyxhook.HookManager()

# Bütün tuş vuruşları dinlenir.
ornek.KeyDown = dinle

# Klavye yakalanır
ornek.HookKeyboard()

# Yakalama başlatılır
ornek.start()

Sonsuz teşekkür ediyorum. Ben de dosyayı “a” kipiyle açıp dilimleme yöntemini uygulamaya çalışmıştım. Yani 12345 diye gidiyordu dosya ben de sadece son sayıyı kaydettiriyordum. Kısmen başarılı olabilmişti ama sizin yaptığınız çok daha verimli oldu.

Rica ederim kolay gelsin.

oho dostum :smiley: bak şimdi sayac bir artar fakat dosya.write çalışır print sayacı basar ve kapanır bidaha artmaz sen oraya döngü koyman gerekiyor :smiley: