handle'ını bildiğim bir edit kutusunda yazanı alamıyorum :(

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Matrix1536
Üye
Mesajlar: 19
Kayıt: 04 Tem 2007 11:32

handle'ını bildiğim bir edit kutusunda yazanı alamıyorum :(

Mesaj gönderen Matrix1536 »

Arkadaşlar ben başka bir programdaki edit kutusunda yazanı okumak istiyorum.
Programın eski versiyonunda Enumproc fonksiyonunu kullanarak yazanı alıyordum.
Yeni version'unda ise bu fonksiyonu kullandığımda hep boş olarak sonuç döndürüyor.

Kod: Tümünü seç

function EnumProc(wnd: HWND): BOOL; stdcall;
var
  buf, aCaption: array[0..255] of char;
begin
  Result := True;
  GetClassName(wnd, buf, SizeOf(buf) - 1);
  SendMessage(wnd, WM_GETTEXT, 256, Integer(@aCaption));
     // asd:=Caption;
      showmessage(acaption);
end;
burada wnd olarak programın tamamının whand'Inı verirsem programın başlığını buluyor.
ancak içindeki edit'in wnd'sini verdiğimde çalışmıyor..

Teşekkürler..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.

Bu işlem için öncelikle ilgili uygulamanın sonra da ilgili bileşenin handle değerini alman gerekli. @mrmarman'ın konuyla ilgili örnekli anlatımları forumda mevcut, ilgili keyword: FindWindow.

Kolay gele.
Matrix1536
Üye
Mesajlar: 19
Kayıt: 04 Tem 2007 11:32

Mesaj gönderen Matrix1536 »

yazdığımı okumuyorsunuz sanırım..

ben diyorum ki ben zaten bunları yaptım.
programın eski version'unda o editbox'un değerini alabiliyordum.
yeni versionda aynı kod ile edit'teki değeri alamıyorum.

WM_SETTEXT ile komut yolladığımda ise program çalışıyor.
Yani edit'e kendi progrmaımdan yazı yazabiliyorum ama yazılan yazıyı okuyamıyorum..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Hocam uyguladığın kodu yazarsan bakarız. @buffer olarak neyi nasıl ayarlıyorsun ve almaya çalışıyorsun onu bir görmek lazım.
Resim
Resim ....Resim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Yazdığını okuyorum ve sana stabil olan yöntem için yönlendirme yapıyorum tercih senin elbette..

Kolay gele.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Eski versiyon'da aldığın TEdit'in yeri değişmiş sen bir önceki boş olanını alıyor olabilirsin. Veya belki de sınıf adı artık TEdit bile değildir. Gerçi sen yazabiliyorum ama okuyamıyorum demişsin bu da manidar bir durum ama bence kodlarında atladığın bir yer vardır.

Aşağıdaki kodu bir button altında uygula. Formun CLASS'ını PChar('TForm1') dediğim yere yaz, sana o forma ait TEdit'lerin tümünü dolaşacak ve içeriğini verecektir. Sen de nerede yanlışlık olduğuna bakarsın.

Eğer içerik seni tatmin etmezse, WinSight gibi bir yazılım kullanarak içeriğini almaya çalıştığın edit'in PARENT'i hangisi onu bulmaya çalış. Çünkü FindWindowEX api fonksiyonı referans olarak PARENT olanın handle'ine göre filtreleme yapar.

Kod: Tümünü seç

Var
  Hand, Edit : HWND;
  Baslik : Array[0..255] of Char;
begin
  Hand := FindWindow( PChar('TForm1'), Nil );
  If Hand <> 0 then begin
    Edit := 0;
    Repeat
      Edit := FindWindowEx( Hand, Edit , PChar('TEdit'), Nil );
      If Hand <> 0 then begin
        SendMessage(Edit, WM_GETTEXT, 256, Integer(@Baslik));
        ShowMessage(Baslik);
      end;
    Until Edit <= 0;
  end;
end;
Resim
Resim ....Resim
Matrix1536
Üye
Mesajlar: 19
Kayıt: 04 Tem 2007 11:32

Mesaj gönderen Matrix1536 »

mrmarman yazdı:Eski versiyon'da aldığın TEdit'in yeri değişmiş sen bir önceki boş olanını alıyor olabilirsin. Veya belki de sınıf adı artık TEdit bile değildir. Gerçi sen yazabiliyorum ama okuyamıyorum demişsin bu da manidar bir durum ama bence kodlarında atladığın bir yer vardır.

Aşağıdaki kodu bir button altında uygula. Formun CLASS'ını PChar('TForm1') dediğim yere yaz, sana o forma ait TEdit'lerin tümünü dolaşacak ve içeriğini verecektir. Sen de nerede yanlışlık olduğuna bakarsın.

Eğer içerik seni tatmin etmezse, WinSight gibi bir yazılım kullanarak içeriğini almaya çalıştığın edit'in PARENT'i hangisi onu bulmaya çalış. Çünkü FindWindowEX api fonksiyonı referans olarak PARENT olanın handle'ine göre filtreleme yapar.

Kod: Tümünü seç

Var
  Hand, Edit : HWND;
  Baslik : Array[0..255] of Char;
begin
  Hand := FindWindow( PChar('TForm1'), Nil );
  If Hand <> 0 then begin
    Edit := 0;
    Repeat
      Edit := FindWindowEx( Hand, Edit , PChar('TEdit'), Nil );
      If Hand <> 0 then begin
        SendMessage(Edit, WM_GETTEXT, 256, Integer(@Baslik));
        ShowMessage(Baslik);
      end;
    Until Edit <= 0;
  end;
end;
hocam bu kod da benim yaptığımın aynısını yapıyor..
Sanırım programın kendisinin bir koruması var..
Şuan aklıma bşka bir şey gelmiyor..

Bu verdiğiniz kod yine eski version'da yazılanı alıyor. Ancak yeni version'da almıyor.
e WM_SETTEXT çalıştığı için doğru handle'ı aldığıma da eminim :S


ben bir oyuna ek yama gibi birşey yapıyorum.
Oyunda F2 ye bastığınızda o anda chat'te ne yazıyorsa onu alıyordu ve ona göre işlem yapıyordu.
Sanırım şimdi daha farklı bir hook yapmam gerekecek..
mesela F1 e basıldığında yazı yazma yeri aktif , F2 ye basınca tamam , F3 e basınca sil gibi :S

neyse cevaplarınız için teşekkürler...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

O zaman canvas üzerine yazdırma yapılıyordur. Mesajlar bir canvas üzerine TextOut ile yazılıyorsa tahmin edeceğin üzere bu metodla okuman imkansız.
Resim
Resim ....Resim
Matrix1536
Üye
Mesajlar: 19
Kayıt: 04 Tem 2007 11:32

Mesaj gönderen Matrix1536 »

Eğere canvas üzerine yazsaydı WM_SETTEXT'in de çalışmaması gerekmez miydi?

ve bir Edit'e canvas ile nasıl yazı yazdırabilir ki?
Sonuçta bu oyun online bir oyun ve yazdıklarını server'a göndermesi gerekiyor. Eğer Canvas olursa gönderememesi lazım :S
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Neden gönderemesin ? Önce SendText yapar sonra da Canvas'a basar..

Delphi'de yapılan birşeydir. Ownerdraw özelliği true yapılmış bir kontrole Canvas.TextOut ile yazdırmışsan onun içeriğini okuyamazsın.

TEdit'in canvas özelliği olmamasına rağmen nasıl yapıldığına dair sana bir örnek hazırladım. Bunu bir EDIT'e uygula (örnekte Edit1) ve okumaya çalış.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Canvas : TControlCanvas;
begin
  Canvas := TControlCanvas.Create;
  try
    Canvas.Control := Edit1;
    Canvas.TextOut(1, 1, 'Muharrem ARMAN');
  finally
    Canvas.Free;
  end;
end;
Resim
Resim ....Resim
Cevapla