Yazılımla windowsda klavyede istenilen tuşa bastırmak.

Başlatan Zoroaster, 27 Nisan 2017, 13:38:48

Zoroaster

Daha önce mouse ile benzer talebim olmuştu ve forumda çözüm getirilmişti.

PC de bir yazılım var. Bu yazılımı kullanan (insan gibi davranan) bir yazılım geliştirmem gerekiyor. Fakat bazı veri giriş alanlarına veri girilmesi gerekiyor.

Yazılımım veri girilecek alanı mouse ile tıklayacak. Ardından da buraya klavyeden veri giriliyormuş gibi veri yazacak.

Bu kısmı Delphi ile nasıl yapabilirim?


Seytan deliginden kacti.

boreas

Veri girilecek programda size mi ait yoksa harici bir yazılıma atıyorum windows notepad gibi bir programa mı veri girilecek.

Zoroaster

Veri girilecek program bana ait değil. Kaynak kodları falan da yok o sadece bir uygulama.

Daha önceleri benzer bir robot program yazmıştım. Robot yazılım uygulama ekranını gözlüyor beklenen durum olduğunda uygulamadaki bir butonu tıklıyordu.

Şimdi daha gelişkin bir robot yazılım yapmaya çalışıyorum.
Seytan deliginden kacti.

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

ds01

http://www.gezginler.net/indir/auto-mouse-click.html  hocam ben bunu kullanmıştım daha önce ekranda önceden ayarladıgınız koordinatlara gidiyor sağ tuş sol tuş kopyala yapıştır vs yapılıyor. Birde şöyle birşey var halen kullanıyorum. http://m.ebay.com/itm/400985432499?_mwBanner=1  klavye , fare yerine kullanılabiliyor. Bunun yaptığı işi düz atmega chipleride yapabiliyor illa bu ürünü almanızda şart değil

Zoroaster

Örnek gösterdiğiniz programlar ekranı takip ediyormu bilmiyorum. Bahse konu uygulama web tabanlı ve clicklenen buton vs bilgisi servere gidip cevaplar web üzerinden geliyor ve ekrandaki görüntü tıklama ardından hemen oluşmuyor.

Dolayısı ile robotun ekranı izleyip klavye verisi girilecek editbox'ın ekrana gelip gelmediğini bilebilmesi gerekiyor.

O kısımları dert değil şu anda bana sadece klavyeden basılmış gibi uygulamaya data yollamam yeterli.

Özel klavye ile falan da işim olmamalı. Aradığım şey basit bir win fonksiyonudur.
Seytan deliginden kacti.

sovalye

WM_KEYUP ve WM_KEYDOWN fonksiyonlari istediginiz isi yapiyor. Onlara bakabilirsiniz

kutahyaspor


engerex


Önce "a" tuşuna basıyor ardından "a" tuşundan kaldırıyoruz.


keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0);


Biraz daha detaya inersen ilgili pencereyi yakalayıp editler içinde dolaşarak ilgili kısımları doldurabilirsin.

Zoroaster

Biraz daha detaya inip ilgili pencereyi yakalamaktan bahsetmişsin.

Eğer ilgili pencereyi yakalamın pratik bir yolu varsa açıklayabilirmisin. Bu işimi çok kolaylaştırır zira mevcut yapıda işi dolaylı yoldan çözdüm, robot yazılımım ekran fotosunu çekip beklenen pencere çıktımı diye imaj işlemleri yapıyor.

@engerex ana konuyla ilgili cevabın için teşekkürler. İşimi gördü.
Seytan deliginden kacti.

yas

@Zoroaster hocam, sizin isteğinizden anladığım bilgisayarda çalışan kaynak kodları olmayan paket programa ait ilgili textboxlara tıkladıkça hangisine tıklandığının bulunarak ilgili bilginin klavyeden giriliyormuş gibi doldurulması. Eğer anladığım doğruysa bunu sağlıklı olarak yapmanın en iyi yolu windowsun uygulamaya atadığı HANDLE numaralarını bilmek. Paket programın kaynak kodu elinizde olsaydı işlem çok kolaydı fakat yinede imkansız değil çalışan paket programın handle numaralarına erişebilmenin bir yolu bulunursa (bence muhakkak vardır.) gerisi çorap söküğü olur.


Kaynak kodu içerisinde Handle kullanılışı hatırladığım kadarıyla vb6 yazım şekilleri


Me.hWnd
Screen.ActiveForm.hWnd


gibiydi.


Birde aşağıdaki linkteki örnek işinize yarayabilir.


http://stackoverflow.com/questions/42787272/using-handles-to-extract-data-from-external-application

engerex

Bir tane Not Defteri açın ve uygulamanızdaki bu butona tıklayın. Mouse ile tıklamanıza gerek kalmıyor. Ancak biraz çaba istiyor.
Ekleme : Bu örnekte Not defterinin aktif olmasına gerek yok. Hatta note defterinin farklı bir formu ekranda iken bile tuş ilgili kutucuğa gidiyor.

procedure TForm1.Button1Click(Sender: TObject);
var
Pen_Nu,Edit_Nu: Thandle;
begin
Pen_Nu := FindWindow('Notepad', nil);
Edit_Nu    := FindWindowEx(Pen_Nu, 0, 'Edit', nil);
postMessage(Edit_Nu, WM_KEYDOWN,65,0);
end;




muhittin_kaplan

vb de doğrudur, her pencereye bir UniqId verir(Hwnd), ve her pencere içerisindeki kontrolede bir id verir, hatırladığım kadarıyla bunları öğrenmek için spy++ adında bir tool kullanıyordum.
aşağıdaki videoda "pencere başlığından" yakalayarak, key gönderiyor.
https://www.youtube.com/watch?v=f_ZBFJMlhYQ