LinkedIn FriendFeed Twitter

C# Mouse Events

by Ordinaryus 8. January 2010 23:34

In C# programming using mouse events is a need for many programmer. Using C#, Mouse positions can be easily used but, we can’t change mouse position or create mouse click.

There is a solutions for this problem. We can use DllImport to access windows APIs, so we can both change mouse position and create click event.

I write a Mouse class because of this need. We can access mouse position, set cursor coordinates and create left and right click events.

    class Fare
    {
        [DllImport("user32.dll")]
        private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, 
        UInt32 dwData, IntPtr dwExtraInfo);
        
        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int x, int y);
        
        private const UInt32 MouseEventLeftDown = 0x0002;
        private const UInt32 MouseEventLeftUp = 0x0004;
        private const UInt32 MouseEventRightDown = 0x0008;
        private const UInt32 MouseEventRightUp = 0x0010;

        static public int konumX
        {
            get { return System.Windows.Forms.Control.MousePosition.X; }
        }

        static public int konumY
        {
            get { return System.Windows.Forms.Control.MousePosition.Y; }
        }


        public static void SendLeftClick()
        {
            mouse_event(MouseEventLeftDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
            mouse_event(MouseEventLeftUp, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        public static void SendRightClick()
        {
            mouse_event(MouseEventRightDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
            mouse_event(MouseEventRightUp, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        public static void SendMouseDown()
        {
            mouse_event(MouseEventLeftDown, (uint)konumX, (uint)konumY, 0, new System.IntPtr());
        }

        static public void SetFare(int x, int y)
        {
            SetCursorPos(x,y);
        }
    }

Tags: ,

.NET

CPU Sıcaklığını Okumak

by Ordinaryus 19. July 2009 03:09

 

Bazı uygulamalarda makinaların bilgilerine ulaşmak performansını kontrol etmek özellikle uzaktaki bilgisayarlarımız için önemli olmaktadır. Bunun haricinde Everest gibi ticari yazılımlarda makinanın o anki pek çok bilgisine ulaşabilmektedir. Bunların arasında CPU, Harddisk bilgileri, Fan hızları, bellek kullanımı gibi bilgilere erişmektedir.

Bunu yapmanın yolları arasında windows 200 ve sonraki sürümlerde kullanılan WMI (Windows Managment Interface) ile sağlanmaktadır. Burada WMI kullanılarak pek çok bilgiye erişmemiz mümkündür. CPU sıcaklığını kullanmam gereken bir uygulama için böyle bir kod yazmıştım. Bunun nasıl yapıldığını burada açıklamaya çalışacağım.

WMI Windows XP içerinde 900 adet özelliği donanım özelliklerini barındırmaktadır. WMI yardımıyla bu bilgilere erişmek mümkün olmaktadır. Bunlar arasında

Buradaki sınıfların kullanılması ile makine üzerindeki pek çok bilgiye ulaşmak mümkün olmaktadır.Burada anlatılacak olan uygulama için

using System.Management;

 

Ad uzayı altında kullanılan özelliklerden faydalanmaktayız. WMI nesneleri hakkında en geniş bilgi her zaman olduğu gibi MSDN üzerinde bulunmakta.

 

string scope = @"root\WMI";

string query = @"select * from MSAcpi_ThermalZoneTemperature";

 

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

 

            foreach (ManagementObject obj in searcher.Get())

            {

                lblSicaklik.Text = "  "+((Convert.ToInt32(obj.Properties["CurrentTemperature"].Value) - 2732) / 10).ToString() + "ºC";

            }

 

 

Bu uygulamada sıcaklik bilgilerine nasıl ulaştığımızı görmüş olduk ancak diğer donanım özelliklerine ulaşmak, windows özelliklerini yönetmek içinde benzer şekilde MSDN üzerinden gerekli bilgiler alınarak WMI kullanılabilir.

 

Tags: ,

.NET

IP adresi girmekten sıkılanlara

by Ordinaryus 29. May 2009 14:46

 

Uzun süredir yapmak istediğim ve finallerin bitişini fırsat bilim hemen uygulamaya geçirdiğim bir projem vardı. Amaç olarak okul ve yurt arasında her gün Laptopunu taşıyan benim gibi insanlar için sürekli IP adresi girmek ve sonrasında DHCP’den IP alarak önceki IPyi yurda dönünce Static IP olarak değiştirmekten sıkılmış olanlar için hazırladım.

İlk başta IP değişikliklerini Regiterlar yardımıyla yapmaya çalışıp makinamı fazlasıyla hırpaladım ve çoğunda Static IPye geçişte problemler yaşadım. Register işlemleri Ethernet kartlarına ve Ağ adlarına ulaşmak için kullanıldığında oldukça faydalı ancak buradaki DWORD değerleri ile oynamak hiçte iyi olmamakta.

Daha sonrasında Windows sistem üzerinde kullanılan komut satırı işlemleri ile çözüme ulaşılacağını öğrendim. Burada uygulanan komutları internet üzerinden bulmak oldukça kolaydır. Bunların sürekli olarak komut satırına yazılmasındansa batch file olarak adlandırılan dosyalar kullanılmakta. Bende bu dosyaları yazdığım arayüz üzerinde editleyerek ve program üzerinden çalıştırarak uygulamayı gerçekleştirdim.

Bu uygulamanın benzer bir versiyonunu Linux içinde yapmamız mümkün burada Tcpip dosyası okunarak ve yazılarak Linuxta da herhangi bir script dili yardımıyla gerekleştirilebilir.

Aşağıda verilmekte olan metni dhcp.bat olarak kaydederek kullanabilir. Bu dosya çalıştırıldığında komut satırında dosyada yazılı olan satırları teker teker çalıştırarak otomatik IPye geçişi sağlamış olacaktır.

 

netsh interface ip set address name="Local Area Connection" dhcp

netsh interface ip set dns name="Local Area Connection" dhcp

 

Static IPye geçmek içinse kullanılması gereken komutlar makinenin IP bilgelerini DNS sunucusunu ve gateway adresini de içereceğin daha kapsamlı ve uzun süren bir işlem yapmaktadır.

netsh interface ip set address name="Local Area Connection" source=static addr=192.168.23.32 mask=255.255.255.0

netsh interface ip set address name="Local Area Connection" gateway=192.168.23.0  gwmetric=0

netsh interface ip set address name="Local Area Connection" source=static addr=192.168.23.1

netsh interface ip add dns name = "Local Area Connection" addr = 192.168.23.2

 

Buradaki bilgelerin yazılan bir arayüz üzerinden düzenlenmesi sağlanacağı gibi bunun haricinde dosyaların herhangi metin editörleri ile açılıp elle değiştirilmesi de mümkündür. Daha sonra bu batch dosyaları çalıştırılarak işlem yapılır.

 

 

 

Tags: ,

.NET

Program kesmeleri

by Ordinaryus 13. March 2009 06:01

 

Sistem programlama ile uğraşmak güzel hoş assembly sıkıcı. Ama birkaç bir sey paylaşabilirim bu konuda. İşletim sistemininde ötesinde makinenin kesmelerine müdehale etmek. Tamer Hocamın dediği gibi bilgisayarın atardamarını tutup yalvartmak elimizde. Bu entryde de kısaca temel kesmelerden ve nasıl çalıştığından bahsedeceğim.

Program kesmeleri INT n şeklinde bir komut ile kullanılmaktadır. Program adresi n sayısı 4 ile çarpılarak 0-3FF arasındaki tablodan elde edilir. Bu kesme vektörlerinin gösterdiği programlar daime RAM içerisinde bulunur, hem DOS hem de diğer yazılımlar tarafından kullanılır.

Program kesmelerinden en çok INT 21H kesmesi kullanılmaktadır. Burada bizde sıklıkla bu kesmeden faydalanarak, klavye, monitör gibi çeşitli donanımları kontrol edeceğiz.

Tüm kesme programlarında INT komutu koşturulmadan önce değişkenlerin ayarlanması gerekmektedir. Programa geri dönüldüğünden ise kesme hizmet programları çıkış olarak belirli değerler üretebilmektedirler. Bu sonuçlar ile kesmenin düzgün çalışıp çalışmadığı gibi bilgiler elde edilebilmektedir.

İlk olarak klavyeden değer almak için bir uygulama yapalım. Burada 0AH klavye değeridir. Burada tampon alanının ilk byte değeri girilebilecek maksimum karakter sayısını tutmaktadır. Enter komutunu alana kadar klavyeden alınanları tampon alanına yerleştirir. Tampon alanının ikinci byteı ise alanınan karakterlerin sayısını göstermektedir.

 

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

DATA_SEG        SEGMENT

             my_buffer            db          10                          

                                             db             0                            

              girilen                   db           10 dup ('$'),'$'                  

DATA_SEG ENDS

 

              mov        ah,0ah                                 ;klavyeden girileni okumak için

                mov       dx,seg  my_buffer                         ;my_buffer, klavye girisi için duzenlendi

                mov       ds,dx

                mov       dx, offset            my_buffer                        

                int 21h                                                 ;çağrıldığı anda, klavyeden bir metin girilmesi için bekler

---------

Bu aşamadan sonra yapılması beklenen diğer işlem tamponda yer alan dizinin ekrana yazdırılmasının sağlanmasıdır. Burada 09H değeri ekranın kontrol edilmesi için kullanılmakta olan program kesmesidir. Bir stringi alıp ekrana bastırma amacıyla kullanılan programcık aşağıda verilmiştir.  Burada önemli olan nokta tanımlanan stringin sonunda mutlaka ‘$’ işareti bulunması gerekmesidir. Yoksa bellek içerisinde $ işareti görene kadar bulunduğu bellek değerlerini yazacaktır.

---------

DATA_SEG        SEGMENT

             merhaba                db          'merhabaaa',cr,lf,'$'

              cr                             equ        0dh

              lf                             equ        0ah

DATA_SEG ENDS

 

              mov        ah,09h                  ;ekrana bir şeyler yazdırmak için 09h yazılır

                mov       dx,seg  girilen

                mov       ds,dx

                mov       dx, offset           

                int 21h                                 ;çağrıldığı anda, "$" işaretini görene kadar ekrana yazar 

  ---------

Dosya açma kapama işlemlerinde kullanılmak amacıyla bir alt program yazmak istersek aynı şekilde bir donanım kesmesi kullanmamız gerekmektedir. 3DH dosya açma işlemi için 3EH ise dosyanın kapatılması için kullanılmaktadır. Bu işlemlerin sonuçlarında fonksiyonlar başarılı ise taşıma bayrağı sıfır, AX ise dosya numarasına eşit olmaktadır. Başarısız olması durumunda ise AX altında hatanın kodu yer alırken taşıma bayrağı da bir değerini göstermektedir.

 

  --------

;dosyayı açalım

              mov        ah,3dh

                mov       al,02h

                mov       dx,seg dosyaadi

                mov       ds,dx

                mov       dx, offset dosyaadi

                int          21h

                mov       numara,ax

 

;dosyayı kapatalım

              mov ah, 3eh;

                mov bx, numara

                int 21h 

----------

Dosyayı açma işlemi yapmamızdaki amaçlardan biri bu dosyanın içeriğini değiştirmek veya bu dosyada yazan verileri okumaktır. Bu amaç doğrultusunda dosyadan okuma ve yazma işlemlerinin nasıl yapıldığını inceleyelim.

Dosya okuma işleminde kullanılan program kesmeleri 3FH, BX içinde ise dosya numarası saklanmaktadır. CX içinde okunacak veya yazılacak byte sayısı saklanmaktadır. 40H değeri ise yazma işlemi içerisinde kullanılmaktadır. Fonksiyonun durum kontrolleri ise gene taşma bayrağı ve AX ile yapılmaktadır. Eğer fonksiyon başarılı olarak sonuçlanmamışsa taşma bayrağı bir ve AX içinde hata kodu yer almaktadır. Başarılı olması durumunda ise taşma bayrağı sıfır, AX içinde ise okunan veya yazılan değerler bulunmaktadır.

----------

           ;okuma işlemi

              mov        ah,3fh

                mov       bx,numara

                mov       cx,100

                mov       dx,seg   tampon1

                mov       ds,dx

                mov       dx,offset tampon1

                int     21h

 

            ;yazma işlemi

              mov       ah, 40h;

              mov       bx,numara;

              mov       cx,1024;

              mov       dx,seg tampon1;

              mov       ds,dx;

              mov       dx,offset tampon1;

              int       21h;

----------

Tüm bunlar yapıldıktan sonra tabiî ki programı sonlandırma işleminin nasıl yapıldığının da incelenmesi gerekmektedir. Aşağııda programın sonlandırılması için gereken kod parçası görülmektedir. 4CH kullanılarak belleğin silinerek sonlandırılması işlemi, AL içinde ise dönme bilgisi saklanmaktadır. 31H ise bellekten silmeden sonlandırma yapmaktadır.

 

---------

mov       ah,4ch;

                int          21h; 

---------

Burada belleğin boşaltılması en önemli noktalardan biridir. Bellek eğer bu işlemler sonrasında boşaltılmazsa istenmeyen sonuçlar doğabilmektedir. İşletim sistemine ve program kesmelerine müdahale ettiğimizden istediklerimizi yapmamız daha kolay hale gelmiştir. Bellekteki boşaltılmamış alanları kullanarak çok basit bilgisayar virüsleri yazmakta mümkün olmuştur. İşlemcinin saatiyle interrupta girip bellekte yer işgal eden virüsler bilgisayarı olumsuz etkileyip bir süre sonra kapanmasına neden olmaktadır.  

 

 


 

Tags:

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Ordinaryus Hakkında

Hayata gözlerini İzmirde açtı. 3 yaşında legolarla oynadı =) Küçük yaşta baskete başladı zaten başka sporlarla arası hiç olmadı. Orta okulda matematikle ilgilendi. Liseyi Karşıyaka Anadolu Lisesinde okudu. 

İTÜ Elektronik Mühendisliğinden 2010 yılında mezun oldu. Fizik bölümünde çift anadala kabul oldu lisans hayatına Fizikten devam etmekte. Koç Üniversitesinde Bilgisayar Mühedisliği Master programına kabul edildi ve akademik hayatının ilk adımlarını sevdiği bir alanda çalışarak atıyor. Fizik ve Bilgisayarın ortak noktalarını gördü ve bunları geliştirmek amacıyla çalışıyor.

Yazılımı sevdi.. Başlarda herşeyle ilgilendi web programlama da yaptı, sokette programladı yeri geldi ağ yönetimi ile uğraştı. Görüntü işlemeden keyif aldı Makine Öğrenmesi ve Örüntü Tanımada kendisini geliştirmeyi istemekte.

2008te MSP oldu belkide bu blogu yazmaya başlamasında en büyük etken=) Bu görevi 2 sene boyunca sürdürdü. Bir yandan 2008de EuroSkillsde Mobil Robotik alanında Türkiyeyi temsil etti. Ardından 2009da Kanada da tekrardan yarışmacı olarak bulundu. Artık bu alanda hakemlik yaparak ve Robotino hakkında öğrendiklerini paylaşarak faydalı olmaya çalışıyor. 

Yapay Zeka, Görüntü İşleme, Kuantum Mekaniği, İstatistik Mekanik ve Bilişsel Bilimlerle ilgili. Geceleri kafasına göre takılıyo. Sabahlarıda öğrencilik yapıyo =)

gibi gibi... 

 

Page Rank

Loading

Google Translate


Şuan ne okuyorum

Bilişsel Psikoloji

Singularity is Near


Ayrıca okuduklarımdan seçtiğim kitaplara buradan ulaşabilirsiniz..

Okuduklarımı üye olarak takip etmek için ise aşağıdaki RSS bağlantısını kullanabilirsiniz. Ayrıca bana kitapta hediye edebilirsiniz =)


CCL


Copyright © Ordinaryus Says That by http://www.vypro.org/ is licensed under a Creative Commons Attribution-No Derivative Works 3.0