Mega Code Archive

 
Categories / Delphi / Strings
 

Windows api

Windowsda hemen hemen her görsel bileşen bir penceredir ve her pencerenin Windows'un aklında tuttuğu bir tutacağı vardır.Buna programcılık ortamında "Handle" denir. Bu tutacak (Handle) vasıtası ile görsel olan tüm kontrollere erişebilirsiniz ve onları istediğiniz gibi kontrol edebilirsiniz. Esas problem bu penceresel denetimin tutacağını (handle) nasıl bulacağımızdadır. Bunun için Windows API'nin içinde FindWindow ve FindWindowEx adlı fonksiyonlar mevcuttur. Bu fonksiyonlar herhangi bir pencereye başlığı (caption) yada sınıf adı ile erişip geri dönüşte de pencere tutacağını döndürürler.Bu sayede penceresel denetimlere istenilen yaptırılabilir. Bazı penceresel denetimlere sınıf adı ile erişmek gerekir. Çünki bazılarının başlık bilgileri mevcut değildir.Örneğin TaskBar için bir başlık bilgisi yoktur. Öyleyse TaskBar ve onun gibi başlık bilgisi olmayan penceresel denetimlere nasıl erişeceğiz. Bunun için benim sizlere tavsiyem Borland Delphi ile gelen WinSight programını kullanmanızdır. Bu program vasıtası ile Windows altında o anda çalışan programların tutacaklarını, sınıf adlarını, çocuk pencerelerinin ad ve tutacakları gibi gerekli bilgileri elde edebilirsiniz. Windows mesajların gelip gittiği bir işletim sistemidir. Şimdi mesaj kavramını biraz açıklamak gerekir. Mesaj herhangi bir programın, görsel yada görsel olmayan tüm Windows kontrollerinin ne yapması gerektiğini yada ne yaptığını anlamamızı sağlayan bir yapıdır. Windows bir mesajlar hiyerarşisinden oluşmuştur. Windows'ta olup biten herşeyin bir mesajı vardır. Örneğin bir button'un üzerine gelmek, onun üzerinde mouse ile dolaşmak, sağ kliklemek, sol kliklemek, aktif pencereyi değiştirmek, herhangi bir tuşa basmak, herhangi bir tuşu bırakmak bunların hepsi aktif pencereye dolayısıyla İşletim sistemine gönderilen mesajlardır. Örneğin herhangi bir pencere üzerinde bir tuşa basarsanız Windows hemen bir Wm_Keydown, Wm_Char vb. mesajları uygulama penceresine gönderecektir. Yani bir mesaj oluşturacaktır. Bu mesaja bağlı bir kodunuz mevcut ise o olay oluştuktan (yani mesaj gönderildikten) sonra var olan kod çalıştırılacaktır. Windows'un API yardımında "Wm_" kelimesi arattığınızda mesajlar hakkında daha detaılı bilgi bulabilme imkanına sahip olursunuz. Bazı durumlarda Windows'u mesaj konusunda zorlamak gerekir. Gerçekte olmayan bir olayı Windows'a olmuş olarak nasıl gösterebiliriz...? Örneğin yaptığımız bir programın olay yöneticilerinden bir tanesinin tuşa basma olayına yönlendiğini düşünelim. Yani programımızın aktif formunun üzerinde klavye'nin herhangi bir tuşuna basılınca herhangi bir olayın gerçekleşeceğini düşünelim. Bu gibi bir durum sözkonusu iken başka bir uygulama aktif durumdayken acaba bu isteğimizi nasıl gerçekleştireceğiz..? Yine bu iş için Windows'un API fonksiyonlarından iki tanesini anlatmak isterim. Bunlardan birincisi SendMessage, ikincisi PostMessage fonksiyonlarıdır. Bu fonksiyonlar Windows ortamına harici mesajlar gönderebilmenizi sağlar. SendMessage fonksiyonu ile Windows ortamına gönderilen mesajlar "Message queue" adı verilen mesaj kuyruğunun en sonuna atılır ve en üstteki mesajdan en alttakine doğru işletim sistemince sıra ile işlenir. Bu fonksiyon vasıtası ile gönderilen mesajların aktivasyonunu görmek biraz geç olabilir ama daha sağlıklıdır. PostMessage fonksiyonu ise Windows Mesaj kuyruğunun en başına yerleşir. Yani mesaj gönderilir gönderilmez aktif hale geçer ve etkisini kısa bir zaman içinde görebilirsiniz. Şimdi kısa bir örnek verelim.. <ol> Eğer winsight programınız var ise onu açın. Windows'un Calculator (Hesap makinası) programını çalıştırın. Winsight programında Hesap mkinasını bulunca onun sol tarafında sınıf adı olarak "sciCalc" göreceksiniz. Şimdi WinSight programını kapatın. (Zira hafızada çok yer kaplar). Şimdi hesap makinasının pencere tutacağını almamız gerekir. (Sınıf adını bildiğimiz için bu çok kolay..) Bunun için H:=FindWindow(PChar('SciCalc'),Nil); yazmak yeterlidir. (Burada H, HWND tipinde bir değişkendir.) Bunu bulduktan sonra bu pencereye elimizde var olan tutacağı vasıtası ile istenilen mesaj gönderilebilir. Örneğin tuşa basma olayı, şöyleki programımızın OnKeyDown olay yöneticisinde PostMessage(H,WM_Keydown,Key,0); şeklinde bir kod yazarsak Hesap makinasında basılan tuşların aktive olduğunu göreceksiniz. </ol>