Delphi ile Klavye Girişini Durdurma

click fraud protection

Bir an için hızlı bir arcade oyunu yaratmayı düşünün. Tüm grafikler diyelim ki bir TPainBox'ta görüntülenir. TPaintBox giriş odağını alamıyor - kullanıcı bir tuşa bastığında hiçbir olay tetiklenmiyor; zırhlımızı hareket ettirmek için imleç tuşlarını kesemeyiz. Delphi Yardım!

Klavye Girişini Durdur

Çoğu Delphi uygulaması, tipik olarak, kullanıcı yakalamamızı sağlayan belirli olay işleyicileri aracılığıyla kullanıcı girdisini işler tuş vuruşları ve işlem fare hareketi.

Odaklamanın fare veya klavye aracılığıyla kullanıcı girişi alma yeteneği olduğunu biliyoruz. Sadece odağı olan nesne bir klavye olayı alabilir. TImage, TPaintBox, TPanel ve TLabel gibi bazı kontroller odaklanamaz. Çoğu grafik kontrolünün temel amacı metin veya grafikleri göstermektir.

Giriş odağını alamayan kontroller için klavye girişine müdahale etmek istiyorsak, Windows API, kancalar, geri aramalar ve mesajları.

Windows Kancaları

Teknik olarak, bir "kanca" işlevi, Windows iletisine eklenebilen bir geri arama işlevidir böylece uygulamanın diğer ileti işlenmeden önce ileti akışına erişebilmesi yer. Birçok pencere kancası türü arasında, uygulama her çağrıldığında bir klavye kancası çağrılır. GetMessage () veya PeekMessage () işlevi ve bir WM_KEYUP veya WM_KEYDOWN klavye mesajı var süreci.

instagram viewer

Belirli bir iş parçacığına yönelik tüm klavye girişlerini engelleyen bir klavye kancası oluşturmak için, SetWindowsHookEx API işlevi. Klavye olaylarını alan rutinler, kanca işlevleri (KeyboardHookProc) adı verilen uygulama tanımlı geri arama işlevleridir. Windows, ileti uygulamanın ileti kuyruğuna yerleştirilmeden önce her tuş vuruşu iletisi (yukarı ve aşağı tuşu) için kanca işlevinizi çağırır. Kanca işlevi tuş vuruşlarını işleyebilir, değiştirebilir veya atabilir. Kancalar yerel veya küresel olabilir.

geri dönüş değeri SetWindowsHookEx yeni takılan kancaya bir tutamaçtır. Sonlandırmadan önce, bir uygulamanın UnhookWindowsHookEx kanca ile ilişkili sistem kaynaklarını serbest bırakma işlevi.

Klavye Kancası Örneği

Klavye kancalarının bir gösterimi olarak, tuşa basarak alabileceğiniz grafik kontrollü bir proje oluşturacağız. TImage TGraphicControl'den türetilmiştir, varsayımsal savaş oyunumuz için bir çizim yüzeyi olarak kullanılabilir. TImage, standart klavye olayları aracılığıyla klavye presleri alamadığından, çizim yüzeyimize yönlendirilen tüm klavye girişlerini engelleyen bir kanca işlevi oluşturacağız.

TImage İşleme Klavye Etkinlikleri

Yeni başlat Delphi Projesi ve bir Image bileşenini forma yerleştirin. Image1.Align özelliğini alClient olarak ayarlayın. Görsel kısım bu kadar, şimdi biraz kodlama yapmalıyız. İlk olarak, biraz ihtiyacımız olacak küresel değişkenler:

 var
Form1: TForm1;
KBHook: HHook; {Bu klavye girişini engelliyor}
cx, cy: tam sayı; {savaş gemisinin pozisyonunu izle}
{geri arama bildirimi}
işlevi KeyboardHookProc (Kod: Tamsayı; WordParam: Kelime; LongParam: LongInt): LongInt; stdcall;
uygulama
...

Bir kanca yüklemek için, formun OnCreate olayında SetWindowsHookEx'i çağırırız.

 prosedür TForm1.FormCreate (Gönderen: TObject);
başla
{Klavye girişini, klavye girişini arayabilecek şekilde ayarlayın}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @KeyboardHookProc,
hInstance,
GetCurrentThreadId ());
{savaş gemisini ekranın ortasına yerleştirin}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = Nokta (cx, cy);
son;

Kanca ile ilişkili sistem kaynaklarını serbest bırakmak için, OnDestroy olayında UnhookWindowsHookEx işlevini çağırmalıyız:

 prosedür TForm1.FormDestroy (Gönderen: TObject);
başla
{klavye müdahalesini kaldırın}
UnHookWindowsHookEx (KBHook);
son;

Bu projenin en önemli kısmı KeyboardHookProc geri arama prosedürü tuş vuruşlarını işlemek için kullanılır.

 işlevi KeyboardHookProc (Kod: Tamsayı; WordParam: Kelime; LongParam: LongInt): LongInt;
başla
vaka WordParam
vk_Space: {savaş gemisinin yolunu sil}
başla
Form1.Image1.Canvas ile
başla
Fırça. Renk: = clWhite;
Fırça. Stil: = bsSolid;
Fillrect (Form1.Image1.ClientRect);
son;
son;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
son; {durum}
Cx <2 ise cx: = Form1.Image1.ClientWidth-2;
Cx> Form1.Image1.ClientWidth -2 ise cx: = 2;
Cy <2 ise cy: = Form1.Image1.ClientHeight -2;
Cy> Form1.Image1.ClientHeight-2 ise cy: = 2;
Form1.Image1.Canvas ile
başla
Dolma kalem. Renk: = clRed;
Fırça. Renk: = clSarı;
TextOut (0,0, Biçim ('% d,% d', [cx, cy]));
Dikdörtgen (cx-2, cy-2, cx + 2, cy + 2);
son;
Sonuç: = 0;
{Windows'un tuş vuruşlarını hedef pencereye geçirmesini önlemek için Sonuç değerinin sıfır olmayan bir değer olması gerekir.}
son;

Bu kadar. Şimdi en iyi klavye işleme koduna sahibiz.

Sadece bir şeye dikkat edin: bu kod hiçbir şekilde sadece TImage ile kullanılmak üzere kısıtlanmamıştır.

KeyboardHookProc işlevi genel bir KeyPreview ve KeyProcess mekanizması olarak işlev görür.

instagram story viewer