USB mouse vs yapmam lazım. (PC yazılımcılarına uyuz oluyorum)

Başlatan z, 04 Haziran 2015, 00:54:46

peko

@z Hocam,
Mouse kontrol kısmı hariç yazıp(c#) test ettiğim kod. (10kb )

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace ZMonitorDemo
{
    public partial class Form1 : Form
    {
        private List<Bitmap> ScreenCaptureList = new List<Bitmap>();
 
        public Form1()
        {
            InitializeComponent();
            Thread t = new Thread(ZMonitor);
            t.Start();
        }

        private void ZMonitor()
        {
            int monitorPeriod = 5; // Second

            Thread.Sleep(3000);

            while (true)
            {
                try
                {
                    Bitmap bmp = ScreenCapture();
                    string bmpFileName = string.Format("ZMonitor_{0: ddMMyyyy_HHmm_ss}.Png", DateTime.Now);
                    bmp.Save(bmpFileName, ImageFormat.Png);
                    ScreenCaptureList.Add(bmp);

                    if (ScreenCaptureList.Count == 2)
                    {
                        byte[] dashboardFirst = ImageToByte(ScreenCaptureList[0]);
                        byte[] dashboardSecond = ImageToByte(ScreenCaptureList[1]);

                        if (ByteArrayCompare(dashboardFirst, dashboardSecond))
                        {
                            string changeByteValues = string.Format("\nDashboard First:{0:n0}\nDashboard Second:{1:n0}",
                                dashboardFirst.Length,
                                dashboardSecond.Length
                                );

                            MessageBox.Show("- Z Monitor value has changed!! -" + changeByteValues);
                        }
                            
                        
                        ScreenCaptureList.Clear();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }

                Thread.Sleep(monitorPeriod * 1000);
            }
        }

        private Bitmap ScreenCapture()
        {
            Bitmap bmpScreenCapture = null;

            bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                            Screen.PrimaryScreen.Bounds.Height);

            using (Graphics g = Graphics.FromImage(bmpScreenCapture))
            {
                g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                    Screen.PrimaryScreen.Bounds.Y,
                                    0, 0,
                                    bmpScreenCapture.Size,
                                    CopyPixelOperation.SourceCopy);
            }

            return bmpScreenCapture;
        }

        private byte[] ImageToByte(Image img)
        {
            byte[] byteArray = new byte[0];
            using (MemoryStream stream = new MemoryStream())
            {
                img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                stream.Close();
                byteArray = stream.ToArray();
            }
            return byteArray;
        }

        private bool ByteArrayCompare(byte[] a1, byte[] a2)
        {
            return !StructuralComparisons.StructuralEqualityComparer.Equals(a1, a2);
        }
    }
}
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

Klein

SetCursorPos(1000,500);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);


Masa üstünde belirtilen koordinta ( Koordinatlar masa üstüne göredir. Aktif pencereye göre değil) tıklar.

extern "C" __declspec(dllimport) __stdcall  ptrrettype ImageSearch(int x1, int y1, int x2, int y2, char* str);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *x;
char arr[255];
char *res;
TImgPos pos;
AnsiString s =ExtractFilePath(Application->ExeName) + "images\\logo.bmp";
	x =  s.c_str();
	res = ImageSearch(0,0,1000,1000, x);
	Memo1->Lines->Add(x) ;
	sscanf(res, "%d|%d|%d|%d|%d",&pos.found, &pos.left, &pos.top, &pos.width, &pos.height);
	Memo1->Lines->Add(IntToStr(pos.left));
}


Bu da parametre olarak verilen iajın ekran üzerinde hangi koordinatta olduğunu bulabileceğiniz kod.
"ImageSearchDLL.dll" isimli internette bulabileceğiniz bir dll kullanır.  Oyunlar için yazılan botların bazıları bu DLL'i kullanır.

Delphi'ye rahatlıkla uyarlanabilir.

peko


Limit:
Alıntı YapFakat bunlar asla internetten indirilen uygulama olamaz.


Alıntı YapBu da parametre olarak verilen iajın ekran üzerinde hangi koordinatta olduğunu bulabileceğiniz kod.
"ImageSearchDLL.dll" isimli internette bulabileceğiniz bir dll kullanır.  Oyunlar için yazılan botların bazıları bu DLL'i kullanır.

@Klein
Sanırım bazı noktaları gözden kaçırıyoruz.

1- "İnternet'ten indirilien x bir şey olamaz" gibi bir limitation söz konusu.
2- Koordinatları bulunması için verilen bir imaj yok.

Benim anladığım :
Tüm masaüstünü kaplayan büyüklükte bir dashboard'u izliyoruz. Her köşede farklı göstergeler/değerler var.
Her şey yolunda gidiyor.. x sn'de bir biz bu ekranın tamamının fotoğrafını çekiyoruz. Imaj'ı o anda biz oluşturuyoruz.
Normalde yapılması gereken 2 imaj alıp x,y koordinatlarında  pixel alanında bir değişiklik var mı kontrol etmek. Ama burda istenilen o hassasiyet/çözünürlük değil.
Sadece 2 imajın birbirinden farkı olup olmadığı basitliği.
Verdiğim kodu çalıştırıp beklediğinde ekranda sağ alt köşedeki saat'in dakikası değiştiğinde bile hemen alarm üretecek.
Alarm farkının ne olduğu ile ilgili log kayıtlarına da kaydedilen imajdan kontrol edebileceksin.

Hareket farkettiğinde kayıt yapmaya başlamasını istediğin bir kamera'ya bile uygulabilirsin mesela..
Veya 2 resim değil, x sayıda resmin birbirine göre oranlarını bile hesaplatabilirsin çok basit bir şekilde.

Core bir kod yani..

" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

z

Şimdilik sadece buton tıklamayı yaptım bu bile büyük rahatlık oldu. En azından diğer masaya geçmeme gerek kalmadı.

implementation

function SetCursorPos(X,Y:integer):boolean ; stdcall; external 'user32.dll';


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
      if fileexists('BuloParam.txt') then
        begin
          memo1.lines.LoadFromFile('BuloParam.txt');
          Edit1.Text:=memo1.lines[0];
          Edit2.Text:=memo1.lines[1];
          Edit3.Text:=memo1.lines[2];
        end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
begin
      x:=strtoint(Edit1.text);
      y:=strtoint(Edit2.text);
      SetCursorPos(x,y);
      mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
      mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
      if form1.Color=clyellow then form1.color:=clgreen else form1.color:=clyellow;
      Timer1.Interval:=strtoint(Edit3.text)*1000;
      form1.Show;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     if CheckBox1.Checked=true then Button1Click(Sender);
end;


mesaj birleştirme:: 08 Haziran 2015, 00:08:26

Bu arada;

Yukarıdaki örnekte olduğu gibi parametre dosyasını memo  içine okutup satırları çekip kullanıyorum.

Böyle yapmak yerine doğrudan okunacak dosyanın mesela 3.satırını edit1.text içine  2.satırını edit2.text içine yaz diyebilirmiyiz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

engerex

procedure TForm1.FormCreate(Sender: TObject);
var StringList1 : TStringList;
begin
          StringList1 := TStringList.Create;
      if fileexists('BuloParam.txt') then
        begin
          StringList1.LoadFromFile('BuloParam.txt');
          Edit1.Text:=StringList1.Strings[0];
          Edit2.Text:=StringList1.Strings[1];
          Edit3.Text:=StringList1.Strings[2];
        end;
end;

z

Adı geçen programı yazdım ve 1 ayı geçkin zamandır kullanıyorum.

Basılması gereken butonun X,Y Koordinatlarını kutucuklara yazıyorum.

Ekranın fotosunu çekeceğim kısmın x,y koordinatlarını da kutucuklara yazıyorum.

Programım butona basıp ekran fotoğrafını çekiyor. Sonra bir önce çektiği fotoğrafla pixel pixel aynımı diye bakıyor.

Sistem süper çalışıyor Fakat işletim sisteminden kaynaklandığını sandığım bir sorun var.

Fotoğraf bazen 1 pixel kayık çekiliyor.

Yani peş peşe foto çek dediğimde fotolar arasında 1 pixel satır fark oluyor ve sistem alarm veriyor. Alarm susturup tekrar deniyorum. bazen 10 denemeden sonra sistem rayına giriyor ve hep aynı fotoyu çekmeye başlıyor.

Yazdığım kodla alakalı bir şey değil. Ama böyle bir sorun var. İki ayrı PC de denedim. Makineler aynı sadece monitörler farklı. Birinde bu sorun oluyor.

Fotolar tabiki fiziksel anlamda çekilmiyor memoryden bmp imaj kopyası alınıyor.

Neyse buna da alengirli bir karşılaştırma yöntemi ile çözüm getireceğim.


Edit: Makinelerin modelleri de farklıymış.

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

fatih6761

@z hocam ekranı hangi yöntemle fotoğrafladığınızı bilirsek belki yardımcı olabiliriz.
Kayma bana bitmap ve stride sözcüklerini çağrıştırıyor.
Bir de hocam 1 pixel derken sola sağa bir satır veya yukarı aşağı bir sütun mu yoksa sıralı veride 1 pixel kayma mı?
Eğer en sonuncusu gibiyse o 1 pixelin nereden geldiğine bakmak lazım.
Bellekte 0 mı yoksa gerçekten ekrandan gelen bir pixel verisi mi?
Eğer 0 ise bitmap dizine indeksleme ile ilgili bir problem olabilir.
Çok değişkenli bir sorun. Fotoyu nasıl çektiğiniz, onu bellekte nasıl sakladığınız ve en nihayetinde pixelleri nasıl okuduğunuzla ilgili bir durum.
Ama en kötü ihtimal olması gereken ilk pikseli veya pikseller dizisini magic data olarak kullanıp bulunduğu yere göre tüm diziyi ofsetlersiniz.
Mesela atıyorum çektiğiniz pencerede 3. 4. 5. pixelin red değerleri 120, 130, 140 diye değişiyor. Bu seriyi bulana kadar başta tararsınız.
Zaten 1 pixel kayıyorsa çok kısa sürecektir. Kayma miktarını pixel dizisinin indislerine offset olarak eklersiniz.

z

Mesela ekrandaki goruntunun ilk 4 satırına ait pixellerin renk değerleri yerine harfler olsun

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

Bu görüntüden 3 pixel yüksekliğinde kopya aldığımı varsay.

1. foto çekimi

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC


2. foto çekimi

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

oluyor.

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

fatih6761

@z hocam peki bu üstteki AAA... verisi sizin için önemli kısımda mı?
Eğer öyleyse veri kaybediyoruz demektir.
Ama bu AAA.. sorun değilse siz kodu başta BBB arayacak şekilde yapılandırırsınız, her iki durumda da BBB nin başladığı yeri indeks 0 kabul ederek tarama yaparsınız.
Bu oyun programlamacıların çözümüne benzedi (çözemediysen özellik olarak sun, o da olmazsa üstünü kapat)
Pek de mühendis işi değil :)

Hocam eğer fotoyu çekme, saklama ve pixelleri okuma yönteminizden bahsederseniz belki çözüme daha çok yaklaşırız.

z

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ImgList, ComCtrls;

type
  TForm1 = class(TForm)
    Tikla: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Edit3: TEdit;
    Label4: TLabel;
    CheckBox1: TCheckBox;
    Timer1: TTimer;
    Label6: TLabel;
    Help: TButton;
    Label7: TLabel;
    Edit4: TEdit;
    Edit5: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Sustur: TButton;
    Cerceve1: TImage;
    Display: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure TiklaClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure HelpClick(Sender: TObject);
    procedure ScreenShot(Sender: TObject);
    procedure SusturClick(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit4Change(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Sakla();
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Alarm,IlkCalisma,Yasak:boolean;
  Bmp:TCanvas;
  MyRect, MyOther: TRect;

  MyBmp1,MyBmp2:Tbitmap;
  En,Boy,max_x,max_y,CizimRengi,ZeminRengi:integer;

  Win: HWND;
  DC: HDC;

  FileName: string;
  WinRect: TRect;
  Left, Top: Integer;
  H,W:integer;
  zaman:integer;
  Renk:integer;

implementation

function SetCursorPos(X,Y:integer):boolean ; stdcall; external 'user32.dll';

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var x,y:integer;
begin

      Timer1.Interval:=5000;

      if fileexists('BuloParam.txt') then
        begin
          memo1.lines.LoadFromFile('BuloParam.txt');
          Edit1.text:=memo1.lines[0];
          Edit2.text:=memo1.lines[1];
          Edit3.Text:=memo1.lines[2];
          Edit4.Text:=memo1.lines[3];
          Edit5.Text:=memo1.lines[4];
        end;

      IlkCalisma:=true;

      En:=Form1.Cerceve1.Width;
      Boy:=Form1.Cerceve1.Height;

      MyBmp1:=TBitmap.create;
      MyBmp1.Width := Width;
      MyBmp1.Height:= Height;
      MyBmp1.PixelFormat:=pf24bit;
      MyBmp1.Canvas.brush.color:=ZeminRengi;
      MyBmp1.Canvas.pen.color:=CizimRengi;
      MyBmp1.Canvas.FillRect(Rect(0,0,En,Boy));
      MyBmp1.Transparent := false;//True;
      MyBmp1.TransParentColor := clblack;
      MyBmp1.TransparentMode := tmFixed;

      MyBmp2:=TBitmap.create;
      MyBmp2.Width := Width;
      MyBmp2.Height:= Height;
      MyBmp2.PixelFormat:=pf24bit;
      MyBmp2.Canvas.brush.color:=ZeminRengi;
      MyBmp2.Canvas.pen.color:=CizimRengi;
      MyBmp2.Canvas.FillRect(Rect(0,0,En,Boy));
      MyBmp2.Transparent := false;//True;
      MyBmp2.TransParentColor := clblack;
      MyBmp2.TransparentMode := tmFixed;

      Form1.Hide;
      Form1.Show;

end;

procedure boya();
begin

        bitblt(Form1.Cerceve1.Canvas.Handle,0,0,En,Boy, MyBmp1.Canvas.Handle,0,0,srccopy);
        form1.refresh;
end;

procedure TForm1.TiklaClick(Sender: TObject);
var x,y:integer;
begin
        x:=strtoint(Edit1.text);
        y:=strtoint(Edit2.text);
        SetCursorPos(x,y);
        mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
        mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
        ScreenShot(Nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin

        Zaman:=Zaman-5;

        Display.Caption:=intTostr(Zaman);

        if Alarm=true then
          begin
            Beep();
          end;

        Display.Refresh;

        if zaman<=0 then
           begin
             Zaman:=strtoint(Edit3.text);
             if Zaman<30 then begin Zaman:=30; Edit3.Text:='30'; end;
             ScreenShot(Sender);
             if CheckBox1.Checked=false then exit;
             if Not Alarm then TiklaClick(Sender);
           end;
end;

procedure TForm1.HelpClick(Sender: TObject);
var s:string;
begin
     S:='Bla bla bla';
     application.MessageBox(Pchar(S),'Dikkat',MB_OK)
end;


procedure TForm1.ScreenShot(Sender: TObject);
label AlarmVer;
var x,y:integer;
begin

        Form1.Hide;
        Win := GetForegroundWindow;
        DC := GetDC(Win);

        x:=strtoint(Edit4.text);
        y:=strtoint(Edit5.text);

//      MyBm1'i MyBmp2'ye taşıyalım

        BitBlt(MyBmp2.Canvas.Handle, 0, 0, En, Boy, MyBmp1.Canvas.Handle, 0, 0, SRCCOPY); // MyBmp2 ye MyBmp1 kopyasını getirdik

//      Ekran görüntüsünü MyBmp1'e alalım

        BitBlt(MyBmp1.Canvas.Handle, 0, 0, En, Boy, DC, x, y, SRCCOPY); // MyBmp1'e ekranın kopyasını getirdik

        ReleaseDC(Win, DC);
        Form1.Show;
        Boya();

        if IlkCalisma=true then
          begin
             BitBlt(MyBmp2.Canvas.Handle, 0, 0, En, Boy, MyBmp1.Canvas.Handle, 0, 0, SRCCOPY); // MyBmp2 ye MyBmp1 kopyasını getirdik
             IlkCalisma:=false;
             Boya();
             exit;
          end;

        for x:=0 to En-1 do
          begin
            for y:=0 to Boy-1 do
              begin
                 if (MyBmp1.Canvas.Pixels[x,y])<>(MyBmp2.Canvas.Pixels[x,y]) then
                   begin
                     Alarm:=True;
                     Form1.color:=Clred;
                     Zaman:=5;
                     Timer1Timer(Nil);
                     exit;
                   end;
              end;
          end;
end;

procedure TForm1.SusturClick(Sender: TObject);
begin
        Alarm:=false;
        IlkCalisma:=true;
        ScreenShot(Sender);
        Form1.color:=clBtnFace;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
        Zaman:=strtoint(Edit3.text);
        if Zaman<30 then begin Zaman:=30; Edit3.Text:='30'; end;
end;

procedure Tform1.Sakla();
begin
          memo1.lines[0]:=Edit1.text;
          memo1.lines[1]:=Edit2.text;
          memo1.lines[2]:=Edit3.text;
          memo1.lines[3]:=Edit4.text;
          memo1.lines[4]:=Edit5.text;
          memo1.lines.SaveToFile('BuloParam.txt');
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
        Sakla();
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
        Sakla();
end;

procedure TForm1.Edit4Change(Sender: TObject);
begin
        Sakla();
end;

procedure TForm1.Edit5Change(Sender: TObject);
begin
        Sakla();
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
        Sakla();
end;

end.


mesaj birleştirme:: 04 Ağustos 2015, 03:25:26

Alıntı yapılan: fatih6761 - 04 Ağustos 2015, 04:03:59
@z hocam peki bu üstteki AAA... verisi sizin için önemli kısımda mı?
Eğer öyleyse veri kaybediyoruz demektir.
Ama bu AAA.. sorun değilse siz kodu başta BBB arayacak şekilde yapılandırırsınız, her iki durumda da BBB nin başladığı yeri indeks 0 kabul ederek tarama yaparsınız.
Bu oyun programlamacıların çözümüne benzedi (çözemediysen özellik olarak sun, o da olmazsa üstünü kapat)
Pek de mühendis işi değil :)

Hocam eğer fotoyu çekme, saklama ve pixelleri okuma yönteminizden bahsederseniz belki çözüme daha çok yaklaşırız.

AAAAAA zaten bir pixellik satırın renk bilgileri.

Biraz akıllı karşılaştırma rutini yazarsam hallederim sadece bu 1 pixellik sorun garibime gitti.

Dediğim gibi resim çekiyorum fark var diyip alarm veriyor. Alarmı susturuyorum bir daha resim çek diyorum böyle böyle nihayetinde hatasız aynı resmi çekiyor.
Zaten ondan sonra tanımlanan süre sonunda peryodik olarak resim çekip karşılaştırıyor. Taki ekranda geröekten değişim oluncaya kadar...
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

engerex

 Acaba kayan pencere mi? Mümkünse ekran görüntüsü ve kaynak kodu proje dosyası halinde paylaşırsan inceleyelim.

kimlenbu

Selamlar z hocam,

İşleri basitleştirmek adına bir önerim olacak, eğer veriler textbox'ta tutuluyorsa ekran görüntüsü almak yerine programınız textbox'lara konumlanıp bu değerleri okuyarak size daha ayrıntılı bir rapor verebilir. Textbox'a konumlanıp 3 fare tıklaması, daha sonra ctrl+c sendkey. İstediğiniz veri neymiş, ne olmuş ayrıntılı olarak görebilirsiniz.

Zamanında ogame için yazdığım ilk botta bu yöntemi kullanmıştım. Bunun tek sıkıntısı eğer ekrana bir uyarı, hata mesajı, windows güncellemesi vs çıkarsa işler sarpa sarıyor. Daha sonra getelementbyid ve invoke yöntemleri ile daha düzgün bir hale getirmiştim.

makdeniz

Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

z

Aşağıdaki iki fonksiyon bazen null dönebiliyormuş. Sorun da bundan kaynaklanıyor.

        Win := GetForegroundWindow;
        DC := GetDC(Win);

satırları yerine

        DC := GetDC (GetDesktopWindow);

yazınca problemim bitti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: kimlenbu - 04 Ağustos 2015, 11:01:03
Selamlar z hocam,

İşleri basitleştirmek adına bir önerim olacak, eğer veriler textbox'ta tutuluyorsa ekran görüntüsü almak yerine programınız textbox'lara konumlanıp bu değerleri okuyarak size daha ayrıntılı bir rapor verebilir. Textbox'a konumlanıp 3 fare tıklaması, daha sonra ctrl+c sendkey. İstediğiniz veri neymiş, ne olmuş ayrıntılı olarak görebilirsiniz.

Zamanında ogame için yazdığım ilk botta bu yöntemi kullanmıştım. Bunun tek sıkıntısı eğer ekrana bir uyarı, hata mesajı, windows güncellemesi vs çıkarsa işler sarpa sarıyor. Daha sonra getelementbyid ve invoke yöntemleri ile daha düzgün bir hale getirmiştim.

Bu konuyu hep merak etmişimdir.

Ekranda bir program çalışıyor olsun. Mesela Keil.

Keil'in Source kodu yok.

Ben bir program yazayım keil'in bazı butonlarına bassın bazı text boxları okusun. Mükünmü? Nasıl? Çok basit bir örnek verebilirmisiniz?

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