Pencere Pozisyonunu KOXP Tarzı Yapmak

Başlıktan kastetmek istediğim şu arkadaslar, AKII, Tianhuo veya en eski kosp penceresi hep sag alt tarafta ayarlı bi biçimde karşımıza çıkardı. Yani kabak gibi ortada durmazdı, goze batmıcak sekilde sag alt kosede birden belirirdi. Hobi amaçlı yapılan coğu macro programı en ortalarda çıkar.
Eminimki sizde macro pencerenizin oyuna girildiği anda sağ alt kosede duzgun bir bicimde belirmesini istersiniz :). bunu yapmanın yolu cok basit aslında. Kendi ekranınızda sadece değeri girerek bu işi halledebilirsiniz, mesela 1024x768 ekranınız var yazarsınız left-top değerlerine 800-900 script sag altlarda biyerde çıkar. Ama şayet başka birilerinede bunu dagıtıcam ben derseniz, bunu daha profesyonel bir biçimde yapmanız gerekir. Şayet herkez sizin ekran çözünürlüğünüzde değildir. Şimdi gelelim nasıl yapıcağımıza.

Yardım alıcağımız nesne başlat cubuğudur. Belki bilmeyenler olabilir, başlat çubuğuda windows içinde var olan bir penceredir. Sizin scriptiniz gibi. ve ne olursa olsun her cozunurlukte hep aynı yerde sabit bir şekilde belirir. Buda tam bizim istediğimiz şeydir :)

Daha basite alırsak başlatı kullanmadanda yapabiliriz. Örneğin scriptimizin boyutları 100 e 100 olsun, left pozisyonuna @desktopwidth-100, top pozisyonuna @desktopheight-100 yazarak, ekran cozunurluğu ne olursa olsun scriptimizi sag alt kosede, her bilgisayarda sabit aynı yerde gosterebiliriz. Ama kullanıcı alt tab yaptığında başlat menusunude hesaba katmamız gerek veya kullanıcı oyunu pencere modunda oynuyorsa, scriptimizin bir kısmı başlat menusu altında kalıcaktır. Onun için başlat menusunude hesaba katmak daha iyi olur.

Bunu yapmak için ilk başta autoit e bir ayar yapmamız gerekiyor.
AutoItSetOption("WinTitleMatchMode", 4)
Bu ayar pencereyi class dan bulmamıza yardımcı olur. Yardım dosyasından 1,2,3,4 ne işe yarar bakabilirsiniz.

Şimdi yapmamız gereken başlat cubuğunun pozisyonlarını almaktır. bunun için :
$pos = WinGetPos("classname=Shell_TrayWnd")
Bu komut başlat cubuğunun left,top,uzunluk,genislik değerlerini $pos arrayına alacaktır. Yani :
$pos[0] sola gore yeri, $pos[1] yukarı gore yeri, $pos[2] uzunluğu, $pos[3] genisliği şeklinde.
Burada bize lazım olan şey başlat cubuğunun yukarıya gore olan yeridir.

Sonuç itibariyle, Elimizdeki değerleri penceremizin up,left değerlerine scriptimizin pencere boyutlarını goz onunde bulundurarak girecegiz. Scriptimizin 100e100 olduğunu var sayarsak yapacağımız olay şudur :
$pos = WinGetPos("classname=Shell_TrayWnd")
$left = @DesktopWidth-100
$up = $pos[1] - 100
$Form = GuiCreate("test",100,100,$left,$up)
left,up değerindeki -100 ü 102, 104, 108 vs yaparak birazdaha sola/saga yukarı/assaga oynatma yapabilirsiniz. Görüldüğü gibi gayet basit bir olay. Şimdi gelelim diğer kısıma.
Oynadığınız oyunun anti-cheat i yoksa ve memory e erişebiliyorsanız bu kısmıda kolaylıkla halledebilirsiniz. Bunu bilenler için anlatıyorum memory okuma yazma yı daha anlatmadım daha sonra detaylı bir biçimde anlatıcam. neyse devam edelim, Öncelikle oyundaki karakterinizin hpsinin memory adresini cheat engine yardımıyla buluyorsunuz. Bulduktan sonra yapıcagınız tek şey, scriptin en başına bir Do Loop u eklemek. neden do yu ekliyoruz ? olay şundan ibaret :)
oyunun giriş ekranındasınız diyelim, (id şifre girilen kısım) burada hp değeri yoktur. Yani siz oyuna tamamen girene kadar, karakterinizi gorene kadar hp değeri yuklenmez. (ko yu ornek alırsak) hp değeri yüklendiğinde ise oyuna girdiğimizi anlarız. Scriptimize bir kere neler dondugunu anlatırsa o her seferinde dediğimizi yapacaktır :)

örnek :
Do
Sleep(100)
$mem = memory değerini al
$hp = $mem değerini hex den decimale çevir
Until $hp > 0
Yapıcağımız şey, guisetstate den once bunu koymak yani penceremiz gozukmeden once. Bu loopun yaptığıda şudur : 100ms uyur, sleep koymazsak işlemciyi yorar, hp değerini sizin girdiğiniz memory adresinden alır ve hex den decimal e çevirir (yani bizim anladığımız dile). Püf nokta ise şu : daha karakterimiz yuklenmediği için elde kalan $hp değeri karakter yuklenene kadar 0 olacaktır. Untilede $hp 0 dan buyuk olana kadar dediğimiz için dongu devam edecek 0 dan buyuk değer gelene kadar o satırdan ileri gitmeyecektir. ve karakterimiz yuklendiğinde misal değer 30hp olarak donecek, döngüden çıkacak ve normal script işleyişine devam edecektir. yani penceremiz gozukecektir.

Bu değer sadece hp olmayabilir, mana vs vs de uyar, olmadı memory işinize gelmiyorsa pixel search da kullanabilirsiniz, yani diyelimki loading ekranında sol ust siyah oyuna girince değişik :)
yada oyunun exesinin kullandığı ram lede olabilir. misal 150500k kullanıyorsa 150000 den buyukse şeklinde yapabiliriz.

Burda unutmamaız gereken kolay kolay döngüden çıkılmaz :P eğer trayda autoit menumuz yoksa yani script pause, kapatamayız yada taskmanagerden kaparız.
Programımız do dongusundeyken başka hiçbir komut almaz. Çünkü biz ona şu olana kadar şöyle yap demişizdir dön dersek dönmez. Dönmesi için ona şu olana kadar şöyle yap ama şuda olursa bırak salla :D dememiz gerekir. Onuda aklıma gelen 2 şekilde orneklendiriyim :
$time = Timerinit() ; şuanki zamanı alır. 1 kere alıcaz ve farkı olcucez
Do
sleep(100)
until TimerDiff($time) > 25000
burda yaptığımız aldığımız sureden 25 saniye geçerse loopu bırakdır.

Diğer ornek :
Do
Sleep(100)
$mem = memory değerini al
$hp = $mem değerini hex den decimale çevir

if not processexists(oyunadı.exe) then exitloop

Until $hp > 0
Buradada eger kullanıcı soradan vazgeçip oyunu kaparsa onlemini aldık, dongudeyken oyunadı.exe açık değilse donguyu salla komutunu araya koyduk veya onu exitloop yerine exit yaparız komple kapanır.

Açıklayıcı olmuştur heralde burda komutları vermedim, çünkü anlatmadım yakında memory komutlarınıda anlatıcam, basittir memory.

Şimdilik bu kadar bi ara donguden nasıl cıkılır olayına değinicem, herkeze kolay gelsin.

Profesyoneller için :)

Selamlar, uzun zamandır yeni post atmadım taki bu günü bekledim :P
Auto-it ile ileri duzeye gelmiş arkadaslar için bi güzellik yapıcam.
Güzel botlarınız :P HackShield tarzı programlar yuzunden çalışmıyormu ?

Projemi tamamlamaya az kaldı,
Auto-it ile dll injecti önümüzdeki hafta paylaşıyorum ve açıklamasını yapıorum
bekleyiniz... :P