1. HotKey Kullanmak
Eğer input focus uygulamamızda olmasa bile HotKey kullanmak istersek RegisterHotKey ile yapabiliriz.
2. KeyDown event'i KeyPress'ten önce gelir.
Önce form için
1 Alt, Ctrl Tuşları
KeyEventArgs parametresini kullanarak tuş basıldığında Alt, Control gibi diğer tuşların durumunu öğrenmek mümkün. e.Modifiers kullanılabilir
Örnek
Örnek
4. SuppressKey
Eğer gerekirse SuppressKeyPress ile tuşu göstermeyebiliriz.
5. KeyPress
Bu event ile gelen KeyPressEventArgs parametresini kullanarak hangi karakterin basıldığını öğrenmek mümkün.
Eğer input focus uygulamamızda olmasa bile HotKey kullanmak istersek RegisterHotKey ile yapabiliriz.
public class GlobalHotKey
{
private int modifier;
private int key;
private IntPtr hWnd;
private int id;
public GlobalHotKey(int modifier, Keys key, Form form)
{
this.modifier = modifier;
this.key = (int)key;
this.hWnd = form.Handle;
id = this.GetHashCode();
}
public bool Register()
{
return RegisterHotKey(hWnd, id, modifier, key);
}
public bool Unregister()
{
return UnregisterHotKey(hWnd, id);
}
public override int GetHashCode()
{
return modifier ^ key ^ hWnd.ToInt32();
}
[DllImport("user32.dll")]
static extern bool RegisterHotKey(IntPtr hWnd,int id,int modifiers,int vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
}
Bu metodu şöyle kullanırız.
private GlobalHotKey globalHotKey;
// Registering your hotkeys
private void Form2_Load(object sender, EventArgs e)
{
globalHotKey = new HotKeys.GlobalHotKey(Constants.CTRL, Keys.F12, this);
bool registered = globalHotKey.Register();
// Handle instances where the hotkey failed to register
if(!registered)
{
MessageBox.Show("Hotkey failed to register");
}
}
// Listen for messages matching your hotkeys
protected override void WndProc(ref Message m)
{
if (m.Msg == HotKeys.Constants.WM_HOTKEY_MSG_ID)
{
HandleHotkey();
}
base.WndProc(ref m);
}
// Do something when the hotkey is pressed
private void HandleHotkey()
{
if(this.Visible)
this.Hide();
else
this.Show();
}
2. Shortcut Key Kullanmak
Eğer input focus uygulamamızdaysa ve bazı tuşları kısayol olarak kullanmak istiyorsak Form sınıfımıza şöyle bir metod yazarız. Bu metod herhangi bir control key event'i almadan önce çağrılır. true dönerse control'e key event'i gitmez. Message parametresini pek kullanmaya gerek kalmıyor. Keys parametresi gerekli girdiyi çoğunlukla sağlıyor.
3. PreFilterMessage
Bu yöntem ProcessCmdKey yöntemine benziyor. Sadece daha alt seviye. Önce bir Form tanımlarız. Bu Form IMessageFilter arayüzünden kalıtır.
1. KeyDown non-printable karakterler için de gelir. KeyPress ise sadece printable karakterler için gelir.Eğer input focus uygulamamızdaysa ve bazı tuşları kısayol olarak kullanmak istiyorsak Form sınıfımıza şöyle bir metod yazarız. Bu metod herhangi bir control key event'i almadan önce çağrılır. true dönerse control'e key event'i gitmez. Message parametresini pek kullanmaya gerek kalmıyor. Keys parametresi gerekli girdiyi çoğunlukla sağlıyor.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Alt | Keys.F)) {
// Alt+F pressed
doSomething();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Benzer bir örnek burada.3. PreFilterMessage
Bu yöntem ProcessCmdKey yöntemine benziyor. Sadece daha alt seviye. Önce bir Form tanımlarız. Bu Form IMessageFilter arayüzünden kalıtır.
public partial class Form1 : Form, IMessageFilter {
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += delegate { Application.RemoveMessageFilter(this); };
}
Daha sonra tuşları şöyle okuruz.public bool PreFilterMessage(ref Message m) {
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if (m.Msg == WM_KEYDOWN || m.Msg == WM_SYSKEYDOWN) {
var key = (Keys)m.WParam.ToInt32();
if (key == Keys.F3) {
MessageBox.Show("yada"); // Your code here
return true;
}
}
return false;
}
4. KeyDown2. KeyDown event'i KeyPress'ten önce gelir.
Önce form için
KeyPreview = True
yapılmalıdır. Daha sonra aşağıdaki işlemleri yaparız.1 Alt, Ctrl Tuşları
KeyEventArgs parametresini kullanarak tuş basıldığında Alt, Control gibi diğer tuşların durumunu öğrenmek mümkün. e.Modifiers kullanılabilir
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.Modifiers== Keys.F12) {
this.Visible = true;
}
}
veya e.Control kullanılabilir.private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.DECIMAL) {
}
}
2. non-printable karakterÖrnek
private void OnKeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.PrintScreen)
{
MessageBox.Show("Test");
}
}
3. printable karakter Örnek
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.A)
{
//Do whatever you want here...
}
}
4. SuppressKey
Eğer gerekirse SuppressKeyPress ile tuşu göstermeyebiliriz.
private void TextBox1KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.T || e.KeyCode == Keys.M)
{
e.SuppressKeyPress = true;
Button1Click(this, EventArgs.Empty);
}
}
Bu kod TextBox'ın sadece sayı alması için kullanılabilir.private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (!char.IsNumber((char)e.KeyCode))
{
e.SuppressKeyPress = true;
}
}
5. KeyPress
Bu event ile gelen KeyPressEventArgs parametresini kullanarak hangi karakterin basıldığını öğrenmek mümkün.
Hiç yorum yok:
Yorum Gönder