2011-04-19 15 views
7

ProcessCmdKey geçersiz kıldım ve Keys argümanını aldığımda, bu Keys'un Harf veya Rakam veya Özel Sembol olup olmadığını kontrol etmek istiyorum.Tuşların Harf/Rakam/Özel Simgesi olup olmadığını kontrol edin

Ben

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
      char key = (char)keyData; 
      if(char.IsLetterOrDigit(key) 
      { 
       Console.WriteLine(key); 
      } 
      return base.ProcessCmdKey(ref msg, keyData); 
    } 

Her şey harf ve rakamlardan için çalışan bu pasajı var. ama F1-F12'ye bastığımda onları harflere dönüştürür.

Belki birisi bu görevi çözmek için daha iyi bir yol biliyor?

+0

Sorun, 'keyData' öğesini bir karaktere çevirmektir. Bunu yapamazsın. Bu bilgiyi almak için 'Keys' sayısında tanımlanan sabitleri kullanmalısınız. –

+0

Eğer http://stackoverflow.com/questions/887377/how-do-i-get-a-list-of-all-the-printable-characters-in-c –

cevap

11

ile tahrik formun OnKeyPress yöntem. KeyPressEventArgs, char'daki statik yöntemleri kullanmanıza olanak veren KeyChar özelliğini sağlar.

Açıklamada, Cody Gray tarafından belirtildiği gibi, bu yöntem yalnızca karakter bilgisine sahip tuş vuruşlarına basar. F1-F12 gibi diğer tuş vuruşları, durumunuza bağlı olarak OnKeyDown veya OnKeyUp'da işlenmelidir. MSDN itibaren

:

Anahtar olaylar aşağıdaki sırayla gerçekleşir:

KeyPress olayı, karakter aralığı olmayan anahtarlar tarafından yükseltilmiyor; ancak, noncharacter tuşları KeyDown ve KeyUp olaylarını yükseltir.

Örnek

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    base.OnKeyPress(e); 
    if (char.IsLetter(e.KeyChar)) 
    { 
    // char is letter 
    } 
    else if (char.IsDigit(e.KeyChar)) 
    { 
    // char is digit 
    } 
    else 
    { 
    // char is neither letter or digit. 
    // there are more methods you can use to determine the 
    // type of char, e.g. char.IsSymbol 
    } 
} 
+1

Bu işlemin, ProcessCmdKey'den çok daha yüksek bir seviyede gerçekleştiğine ve çeşitli nedenlerden dolayı bazı önemli basımların kaybolmasına neden olduğunu unutmayın. Amaçlarınız için çalışıyorsa, harika. Ancak bunun gerçekleşmeyebileceğini fark etmek önemlidir - eşdeğer işlevsellik ve amaç ile yerine konan bir değiştirme değildir. –

+0

Kesinlikle değil, 'OnKeyPress' sadece' KeyChar' ve başka bir şey sağlar, bu yüzden bu özel durum için çok uygun. Diğer tuş vuruşları 'OnKeyDown'da işlenmelidir. Bu konu için – bernhof

+0

.. veya 'OnKeyUp'. Cevabı daha fazla bilgi ile güncelledim. – bernhof

3

if(!(keyData >= Keys.F1 && keyData <= Keys.F12)) 
{ 
    char key = (char)keyData; 
    if(char.IsLetterOrDigit(key)) 
    { 
     Console.WriteLine(key); 
     return false; 
    } 

} 
return base.ProcessCmdKey(ref msg, keyData); 
+0

ı don deneyin olabilir olabilir F1-F12 bastığında bir şey yapması gerek. Bu düzenlenmiş cevap hakkında mektup, rakam veya özel sembol – Zlobaton

+0

@ Zlobato'ya basıp basmadığımı kontrol etmem gerekiyor mu? –

1

keyData.KeyCode kullanmayı deneyin ve belki de bir aralıkta test yerine Char.IsLetterOrDigit kullanmayı deneyin. Örneğin.

if (keyData.KeyCode >= Keys.D0 && keyData.KeyCode <= Keys.Z) { 
    ... 
} 
+0

Özel semboller hakkında ne düşünüyorsunuz? + = -/\? ve e.t.c – Zlobaton

+0

@Zlobaton: 'Keys.Add', 'Keys.Subtract',' Keys.Divide' vb. –

+2

Ve yazılımınızda, Latin tabanlı olmayan bir klavye kullanan tüm kullanıcılar (ör. Rusça, Yunanca, Hintçe, ...) tamamen bozuk yazılımlar yaşarlar. Char.IsLetterOrDigit' ve ark.'nın varlığının bir nedeni vardır. - onları kullan. – Timwi

0
if (keyData >= Keys.F1 && keyData <= Keys.F12) 
{ 
    //one of the key between F1~F12 is pressed 
} 
+0

F1-F12 basıldığında bir şey yapmam gerekmiyor. Harf, rakam veya özel sembol basıp basmadığımı kontrol etmeliyim – Zlobaton

+0

@Zlobaton: Tanımla * özel sembol *. –

+0

'+ = -/\?' Ve e.t.c – Zlobaton

0

ya dev switch/case deyimi gerekir veya aralıklar için kontrol edin. Daha az olan içeriğe bağlı olarak hariç tutmak istediğiniz tuşları kontrol etmeyi daha kolay bulabilirsiniz. Tüm olası değerler için buna bakın. http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

if (keyData >= Keys.A && keyData <= Keys.Z) 
    // do something 

veya

yerine
switch(keyData) { 
case Keys.Add: 
case Keys.Multiply: 
// etc. 
    // do something 
    break; 
} 
-1

Aşağıdaki kod çalıştık ancak herhangi bir nedenle char.IsLetter() yöntemi Letters olarak aşağıdaki tuşları kabul edilir ???

F1, F8, F9, F11, F12, SağShift, LeftShift, RightAlt, RightCtrl, LeftCtrl, LeftWin, RightWin, NumLock.

Bu yöntem, bir harf olduğunu düşündüğüyle ilgili tam bir kanıt gibi görünmüyor.

if(char.IsLetter((char)e.Key) || char.IsDigit((char)e.Key)) 
İlgili konular