Klavye etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Klavye etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

20 Kasım 2016 Pazar

SendKeys Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Windows.Forms.SendKeys;
ForeGround'daki pencereye tuş basma olayı gönderir.

Send metodu
Tuş basma olayını gönderir. Şöyle yaparız.
SendKeys.Send("{TAB}");
Şöyle yaparız.
SendKeys.Send("^V");
SendKeys.Send("{ENTER}");
SendWait metodu
Tuş basma olayını gönderir ve mesajın işlenmesini bekler. Şöyle yaparız.
SendKeys.SendWait("{ENTER}");

24 Mayıs 2016 Salı

Klavye

1. HotKey Kullanmak
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.
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. KeyDown
1. KeyDown non-printable karakterler için de gelir. KeyPress ise sadece printable karakterler için gelir.
2. 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.

7 Şubat 2016 Pazar

Klavye 2 - Tuş Basılması Olayı Göndermek

Giriş
İlk klavye yazısı tuş basılmasını almak içindi. Bu örnekte kendimiz tuş basılmış gibi yapıyoruz.

1.  SendKeys Yöntemi
SendKeys Sınıfı yazısına taşıdım.

2. Interop Yöntemi
Tüm bu metod çağrıları için Interop yapmak gerekiyor.Şöyle yaparız.

1. Önce tuş göndermek istediğimiz pencereyi SetForegroundWindw ile ön plana alıyoruz.
2. Daha sonra SendMessage ile WM_KEYDOWN ve WM_KEYUP mesajlarını gönderiyoruz.

using System.Runtime.InteropServices;

namespace KeySendTest2
{
  class Program
  {
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, 
                                           string lpWindowName);

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, 
                                            IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    public static void SendKeyStroke(IntPtr window, ushort key)
    {
      const uint WM_KEYDOWN = 0x100;
      const uint WM_KEYUP = 0x0101;

      SendMessage(window, WM_KEYDOWN, ((IntPtr)key), (IntPtr)0);
      SendMessage(window, WM_KEYUP, ((IntPtr)key), (IntPtr)0);
    }

    static void Main(string[] args)
    {
      IntPtr hWnd = FindWindow("the class here", null);
      SetForegroundWindow(hWnd);
      System.Threading.Thread.Sleep(3000);
      while (true)
      {
        SendKeyStroke(hWnd, (ushort)Keys.F3); // Doesn't work
        //SendKeys.SendWait(Keys.F3); -- Also doesn't work
      }
    }
  }
}