Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi
Ön Sipariş Talebinde Bulunan Üyelerimiz
Sipariş Talebinde Bulunan Üyelerimiz

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Keyboard Macro Recorder Yapımı
#1
Merhabalar

Başlıktada belirttiğim gibi keyboard tuşlarını önce istediğim komutları belirtip sonra aynı şekilde tekrar çalıştıracak tarzda bir program geliştirmek istiyorum. Fakat bir sorunla karşılaştım. Altta paylaştığım kodlar çalışıyor ama sadece veri girişi olabilen yerlerde iş görüyor hotkeylerde ve oyunlarda tepkisiz kalıyor. 
Örneğin : Chorme url kısmında verileri yazıyor fakat F1 tuşu gönderdiğimde yeni sekmeyi açmıyor. 
bu sorunu nasıl aşabiliriz. Klavyeden tuş basılıyormuş gibi veri göndermek mümkün mü siz üstatların yardımlarını bekliyom.
Sendkeys kodu :
{$POINTERMATH ON}
procedure Sendkys(const S: String);
var
 InputEvents: PInput;
 I, J: Integer;
begin
 if S = '' then Exit;
 GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
 try
   J := 0;
   for I := 1 to Length(S) do
   begin
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
   end;
   SendInput(J, InputEvents[0], SizeOf(TInput));
 finally
   FreeMem(InputEvents);
 end;
end;
 

Key Event kodu : 
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);
Cevapla
#2
Merhaba,

Oyunlarda Shield yapısı vardır. Hile yapılmasını engellemek için tuş göndermenizi bloklar. Bunu yapabilmeniz için önce o Shieldi devre dışı bırakmanız gerekmektedir. Ama bu hiç kolay değil, hele ki günümüzde oyunların çok ciddi hasılatlar yaptığı bir dönemde bu güvenlik açıklarını kapatmak için çok ciddi yatırımlar yapılmaktadır.
Cevapla
#3
(10-10-2018, Saat: 17:40)codder71 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhabalar

Başlıktada belirttiğim gibi keyboard tuşlarını önce istediğim komutları belirtip sonra aynı şekilde tekrar çalıştıracak tarzda bir program geliştirmek istiyorum. Fakat bir sorunla karşılaştım. Altta paylaştığım kodlar çalışıyor ama sadece veri girişi olabilen yerlerde iş görüyor hotkeylerde ve oyunlarda tepkisiz kalıyor. 
Örneğin : Chorme url kısmında verileri yazıyor fakat F1 tuşu gönderdiğimde yeni sekmeyi açmıyor. 
bu sorunu nasıl aşabiliriz. Klavyeden tuş basılıyormuş gibi veri göndermek mümkün mü siz üstatların yardımlarını bekliyom.
Sendkeys kodu :
{$POINTERMATH ON}
procedure Sendkys(const S: String);
var
 InputEvents: PInput;
 I, J: Integer;
begin
 if S = '' then Exit;
 GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
 try
   J := 0;
   for I := 1 to Length(S) do
   begin
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
   end;
   SendInput(J, InputEvents[0], SizeOf(TInput));
 finally
   FreeMem(InputEvents);
 end;
end;
 

Key Event kodu : 
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);

Yıllardır Chrome kullanıyorum, F1'e basınca yeni bir tab açıldığını bilmiyordum Big Grin
There's no place like 127.0.0.1
WWW
Cevapla
#4
F1'e basınca yeni sekme açmıyor, Help'i yeni sekmede açıyor. Bu nedenle yeni sekme açılmış oluyor. Yeni sekme Ctrl+T ile açılıyor.
Cevapla
#5
Oyunlar için olan özel durumu @aruno belirtmiş.

Chrome'a yada genel olarak farklı bir uygulamaya tuş göndermek için o uygulamanın Window Handle'ına (HWND) ihtiyacın var. Sonrasında PostMessage ile F1 vs. virtaul key gönderebilirsin.

Şöyle bir örnek paylaşayım: Butona bastıktan 1 sn sonra aktif olan uygulamaya F1 tuşu göndermek için;
procedure TForm1.Button1Click(Sender: TObject);
var
  AktifPencere: HWND;
begin
  Sleep(1000);
  AktifPencere := GetForegroundWindow;
  PostMessage(AktifPencere, WM_KEYDOWN, VK_F1, 0);
  PostMessage(AktifPencere, WM_KEYUP, VK_F1, 0);
end;
There's no place like 127.0.0.1
WWW
Cevapla
#6
(02-11-2018, Saat: 23:41)aruno Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,

Oyunlarda Shield yapısı vardır. Hile yapılmasını engellemek için tuş göndermenizi bloklar. Bunu yapabilmeniz için önce o Shieldi devre dışı bırakmanız gerekmektedir. Ama bu hiç kolay değil, hele ki günümüzde oyunların çok ciddi hasılatlar yaptığı bir dönemde bu güvenlik açıklarını kapatmak için çok ciddi yatırımlar yapılmaktadır.

Merhabalar Hocam haklısın ama macrorecoder diye bir uygulama var. Her uygulamada işe yarıyor. Buradaki mevzu hocam klavyeden tuşa basılıyormuş hissi vermek sonuçta bu formada neler başarıyoruz bu ne ki bence bu klavye portuna doğrudan bağlantı denedim ama başaramadım. Com portlarına erişim sağlayabiliyorum. Fakat klavye $60 portuna veri yazmayı başaramadım. Asm tekniği denedim ama oda olmadı ne yapabiliriz aklıma bişey gelmedi forma paylaştım ama altlarda kalınca cevap verilebileceği ümidimide kaybetmiştimki bu gün cevaplarla dolmuş.  Big Grin

(03-11-2018, Saat: 00:35)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(10-10-2018, Saat: 17:40)codder71 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhabalar

Başlıktada belirttiğim gibi keyboard tuşlarını önce istediğim komutları belirtip sonra aynı şekilde tekrar çalıştıracak tarzda bir program geliştirmek istiyorum. Fakat bir sorunla karşılaştım. Altta paylaştığım kodlar çalışıyor ama sadece veri girişi olabilen yerlerde iş görüyor hotkeylerde ve oyunlarda tepkisiz kalıyor. 
Örneğin : Chorme url kısmında verileri yazıyor fakat F1 tuşu gönderdiğimde yeni sekmeyi açmıyor. 
bu sorunu nasıl aşabiliriz. Klavyeden tuş basılıyormuş gibi veri göndermek mümkün mü siz üstatların yardımlarını bekliyom.
Sendkeys kodu :
{$POINTERMATH ON}
procedure Sendkys(const S: String);
var
 InputEvents: PInput;
 I, J: Integer;
begin
 if S = '' then Exit;
 GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
 try
   J := 0;
   for I := 1 to Length(S) do
   begin
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
     InputEvents[J].Itype := INPUT_KEYBOARD;
     InputEvents[J].ki.wVk := 0;
     InputEvents[J].ki.wScan := Ord(S[I]);
     InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
     InputEvents[J].ki.time := 0;
     InputEvents[J].ki.dwExtraInfo := 0;
     Inc(J);
   end;
   SendInput(J, InputEvents[0], SizeOf(TInput));
 finally
   FreeMem(InputEvents);
 end;
end;
 

Key Event kodu : 
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);

Yıllardır Chrome kullanıyorum, F1'e basınca yeni bir tab açıldığını bilmiyordum Big Grin

Hocam onu bende tesadüfen bu denemelerim sonucu farkettim.  Big Grin
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Uzaktan Sohbet Programı Yapımı Halil Han Badem 7 1.017 11-07-2017, Saat: 22:40
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi