Ekranda çalışan programdan verileri kapmak

Başlatan z, 13 Ağustos 2010, 15:41:36

z

PC de bir program çalışmakta ve bu ekranda programa ait textboxlar, textboxlar içinde de veriler bulunmaktadır. 

Ben de bir program yazacağım, ekranda bir butona bastığımda yukarıda bahsettiğim programın tektboxlarındaki verileri yakalasın istiyorum.

Böyle bir şey mümkünmü?

(Ekrandaki verilerini kapmaya çalıştığım programı birileri yazmış ve sadece exesi var)





Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

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

nuriozdas

#2
Daha önce yapmıştım böyle bir program. İşin mantığını anlatim size, işlemcide her nesnenin  bir değeri vardır biz bu değerlere kısaca HwND Diyoruz. Nesnenin(textbox) HwND değerini bularak bu nesne üzerinde neler yazılı öğrenebiliriz.


Edit:
Dipnot: HwND değeri değişkendir. BUNU UNUTMAYIN  Programı kapatıp açtığınızda Textbox'ın Hwnd Değeride değişir.

SpeedyX

Anahtar kelime "window handle".

Çabuk çözüm için window hande ları gösteren hazır program bulunup o exe nin textboxunun değeri alınır, sonra kendi programınızdan exe nin aktif olduğunu sorguladıktan sonra ona mesaj gönderilerek textbox içeriği okunabilir. İnternette yığınla örnek var, çok basit.

picusta

Visual studio Spy++ ile Handle ve ressource ID bulabilirsin.
GetDlgItemText fonksyonu ise yarabilir.

z

Programı çalıştırmadan önce her defasında handle numaralarını tespit etmem mi gerekecek?

Eğer öyleyse bu iş nasıl otomatik hale getirilebilir?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

Pencere başlığına bakarak handle'ı otomatik bulabiliyorsun. Fakat aynı başlığa sahip başka pencereler varsa karışıklık çıkacaktır.  findwindow, findwindowEx  fonksiyonlarıyla yapılıyor.

orhanc

#7
http://support.microsoft.com/kb/147659
http://msdn.microsoft.com/en-us/library/ms682615%28VS.85%29.aspx
http://www.blong.com/Conferences/BorConUK97/WinAPI/Api.htm

Bunları bir incele. Çalışan programları listeletip uygun olanları seçimine göre ayıklayabilirsin
i'm doing nothing... Giddy Up  http://www.drorhan.com

gurcanx

arkadaşın dediği gibi programın caption(title) değeri sayesinde doğru formu bulur
sonra da ona ait objelerin text özelliğini handle mantığı ile bulabilirsiniz.

http://www.memikyanik.net/windows-mesajlari-makalesi/77.aspx



* parent := FindWindow('Class name of parent', nil);
* child1 := FindWindowEx(parent, 0, 'ThunderRT6Textbox', nil); // find first child with classname 'ThunderRT6Textbox'
* child2 := FindWindowEx(parent, child1, 'ThunderRT6Textbox', nil); // find next child with same classname

FindWindow(0,'Calculator');

-----------------------------------------

procedure EnsureSingleInstance;
var
  Wnd: HWnd;
  WndClass, WndText: array[0..255] of char;
begin
{$ifdef Win32}
  { Try and create a semaphore. If we succeed, then check }
  { if the semaphore was already present. If it was }
  { then a previous instance is floating around. }
  { Note the OS will free the returned semaphore handle }
  { when the app shuts so we can forget about it }
  if (CreateSemaphore(nil, 0, 1,
        PChar(ExtractFileName(Application.ExeName))) <> 0) and
     (GetLastError = Error_Already_Exists) then
{$else}
  if HPrevInst <> 0 then
{$endif}
  begin
    Wnd := GetWindow(Application.Handle, gw_HWndFirst);
    while Wnd <> 0 do
    begin
      { Look for the other TApplication window out there }
      if Wnd <> Application.Handle then
      begin
        { Check it's definitely got the same class and caption }
        GetClassName(Wnd, WndClass, Pred(SizeOf(WndClass)));
        GetWindowText(Wnd, WndText, Succ(Length(Application.Title)));
        if (StrPas(WndClass) = Application.ClassName) and
           (StrPas(WndText) = Application.Title) then
        begin
          { This technique is used by the VCL: post }
          { a message then bring the window to the }
          { top, before the message gets processed }
          PostMessage(Wnd, wm_SysCommand, sc_Restore, 0);
{$ifdef Win32}
          SetForegroundWindow(Wnd);
{$else}
          BringWindowToTop(Wnd);
{$endif}
          Halt
        end
      end;
      Wnd := GetWindow(Wnd, gw_HWndNext)
    end
  end
end;