C#WinFormショートカット設定テクニック

9782 ワード

1、Alt+*(ボタンショートカット)
ボタンショートカットも最も一般的なショートカットキーであり、その設定も簡単である.button、label、menuStripなどの他のコントロールのText属性に名前を指定する場合は、その後ろに「&」を付けて指定アルファベットを1つ追加すればよい.例えば、(&D)、(Alt+D)呼び出しを決定します.
複数の文字を指定すると、最初はショートカットキーになります.例えば、確定(&OK)、(Alt+O)呼び出し;ファイル(&Fill),(Alt+F)呼び出し.
2、Ctrl+*およびその他の組み合わせキー
FormのKeyPreview属性をTrueにする
Modifiersを使用して結合キーを設定し、キーボードの数字領域キーのKeysはDで始まり、キーボードの数字はNumPadで始まります.CtrlとShiftの結合キーを押す方法と同様に、CtrlとAltの列挙をint型加算に変換してModifiersと比較することで、その結合キーが押されたか否かを判断することができる.

private void  frmMain_KeyDown(object sender, KeyEventArgs e)
{
      //        frmMain,    btnOK,    btnSave
      //  
     switch (e.KeyCode)
     {
          case Keys.F1:
            btnOK_Click(this, EventArgs.Empty);
            break;
           case Keys.F2:
             btnSave_Click(this, EventArgs.Empty); 
             break; 
     }
      //    
      if (e.KeyCode == Keys.F1 && e.Modifiers == Keys.Control)     //Ctrl+F1
      {
        btnShouYi_Click(this, EventArgs.Empty);
      }
   if ((int)e.Modifiers == ((int)Keys.Control + (int)Keys.Alt) && e.KeyCode == Keys.D0)  //Ctrl + Alt +   0
   {
     MessageBox.Show("   Control + Alt + 0");
      }

また、フォームのAcceptButtonプロパティに関連付けられたボタンは、キーボード上のEnterキーに対応します.フォームのCancelButtonプロパティに関連付けられたボタンは、キーボードのEcsキーに対応します.}
======================================================
キーコード
  BACKSPACE   {BACKSPACE}、{BS}または{BKSP}BREAK{BREAK}CAPS LOCK{CAPSLOCK}DELまたはDELETE{DELETE}または{DEL}DOWN ARROW(下矢印キー){DOWN}END{END}ENTER{ENTER}または~ESC{ESC}HELP{HELP}HOME{HOME}INSまたはINSERT{INSERT}または{INS}LEFT ARROW(左矢印キー){LEFT}NUM LOCK{NUMLOCK}PAGE DOWN{PGDN}PAGE UP{PGUP}PRINT SCREEN{PRTSC}(将来使用のために保持)RIGHT ARROW(右矢印キー){RIGHT}SCROLL LOCK{SCROLLLOCK}TAB{TAB}UPARROW(上矢印キー){UP}F 1{F 1}F 2{F 2}F 3}F 4{F 4}F 5{F 5}F 6{F 6}F 7{F 7}F 8{F 8}F 9{F 9}F 10{F 10}F 11{F 11}F 12{F 12}F 13{F 13}F 14{F 14}F 15{F 15}F 16{F 16}テンキープラス記号{ADD}テンキーマイナス記号{SUBTRACT}テンキー乗数{MULTIPLY}テンキーマイナス記号{DIVIDE}
**************************************************************************************************************************************************************************************************************************************
#regionショートカット関連//////////////////////////////////////////////////////

private void txtHotKey_KeyDown(object sender, KeyEventArgs e)
{
  int HotKeyValue = 0;
  string HotKeyString = "";
  e.SuppressKeyPress = false;
  e.Handled = true;
  if (e.Modifiers != Keys.None)
  {
    switch (e.Modifiers)
    {
      case Keys.Control:
        HotKeyString += "Ctrl + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Alt:
        HotKeyString += "Alt + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Shift:
        HotKeyString += "Shift + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Control | Keys.Alt:
        HotKeyString += "Ctrl + Alt + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Control | Keys.Shift:
        HotKeyString += "Ctrl + Shift + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Alt | Keys.Shift:
        HotKeyString += "Alt + Shift + ";
        HotKeyValue = (int)e.Modifiers;
        break;
      case Keys.Control | Keys.Alt | Keys.Shift:
        HotKeyString += "Ctrl + Alt + Shift + ";
        HotKeyValue = (int)e.Modifiers;
        break;
    }
    if (e.KeyCode != Keys.None && e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.Menu && e.KeyCode != Keys.ShiftKey)
    {
      HotKeyString += KeyCodeToString(e.KeyCode);
      HotKeyValue += (int)e.KeyCode;
    }
  }
  else
  {
    if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back)
    {
      HotKeyString = " ";
      HotKeyValue = -1;
    }
    else if (e.KeyCode != Keys.None)
    {
      HotKeyString = KeyCodeToString(e.KeyCode);
      HotKeyValue = (int)e.KeyCode;
    }
  }
  if (HotKeyValue == 0)
    HotKeyValue = -1;
  TextBox txtHotKey = (TextBox)sender;
  txtHotKey.Text = HotKeyString;
  txtHotKey.Tag = HotKeyValue;
  txtHotKey.SelectionStart = txtHotKey.Text.Length;
}
///
///           
///
///   
///   
private string KeyCodeToString(Keys KeyCode)
{
  if (KeyCode >= Keys.D0 && KeyCode <= Keys.D9)
  {
    return KeyCode.ToString().Remove(0, 1);
  }
  else if (KeyCode >= Keys.NumPad0 && KeyCode <= Keys.NumPad9)
  {
    return KeyCode.ToString().Replace("Pad", "");
  }
  else
  {
    return KeyCode.ToString();
  }
}
///
///        
///
private void txtHotKey_KeyPress(object sender, KeyPressEventArgs e)
{
  e.Handled = true;
}
///
///      ,        ,   
///
private void txtHotKey_KeyUp(object sender, KeyEventArgs e)
{
  CheckHotkey(sender);
}
///
///      ,        ,   
///
private void txtHotKey_LostFocus(object sender, EventArgs e)
{
  CheckHotkey(sender);
}
///
///           ,    
///
private void CheckHotkey(object sender)
{
  TextBox txtHotKey = (TextBox)sender;
  if (txtHotKey.Text.EndsWith(" + ") || String.IsNullOrEmpty(txtHotKey.Text))
  {
    txtHotKey.Text = " ";
    txtHotKey.Tag = -1;
    txtHotKey.SelectionStart = txtHotKey.Text.Length;
  }
}

#endregion 
#ショートカットキー(システムホットキー)応答の実現
アプリケーションでは、Ctrl+Cレプリケーション、Ctrl+V貼り付けのようなショートカットキーを実装する必要があるかもしれません.本稿では、その実装を簡単に紹介し、実装クラスを示します.
(1)HotKeyという名前のクラスファイルを作成する.cs、コードは以下の通りです.

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KoalaStudio.BookshopManager
{
  class HotKey
  {
    //        ,     0。
    //        ,    0。         ,  GetLastError。
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool RegisterHotKey(
      IntPtr hWnd,        //           
      int id,           //    ID(     ID  )      
      KeyModifiers fsModifiers,  //        Alt、Ctrl、Shift、Windows       
      Keys vk           //       
      );
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool UnregisterHotKey(
      IntPtr hWnd,        //           
      int id           //      ID
      );
    //         (             ,              )
    [Flags()]
    public enum KeyModifiers
    {
      None = 0,
      Alt = 1,
      Ctrl = 2,
      Shift = 4,
      WindowsKey = 8
    }
  }
}


簡単に説明します.
「public static extern bool RegisterHotKey()」という関数は、ホットキーを登録するために使用されます.この関数はuser 32を参照する必要があるためである.dllダイナミックリンクライブラリは使用できません.
user32.dllは非管理コードであり、ネーミングスペースで直接参照することはできないため、「DllImport」で導入してから使用する必要があります.そして関数の前に
「[DllImport("user 32.dll",SetLastError=true)]行の文.
「public static extern bool UnregisterHotKey()」という関数はホットキーをログアウトするために使用され、同じようにDllImportでuser 32を参照する必要がある.dllは後で使用できます.
「public enum KeyModifiers{}」は、補助キーの数値コードを文字として直接表す列挙のセットを定義し、使いやすいようにします.これにより、呼び出し時に各セカンダリを覚える必要はありません.
名前を直接選択するだけで、ヘルプキーのコードを選択できます.
(2)フォームFormAを例としてHotKeyクラスの使用について説明する
FormAのActivateイベントにホットキーを登録し、この例ではShift+S、Ctrl+Z、Alt+Dの3つのホットキーを登録します.ここのId番号は任意に設定できますが、重複しないようにしてください.

private void Form_Activated(object sender, EventArgs e)
{
  //    Shift+S,Id  100。HotKey.KeyModifiers.Shift         4   。
  HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
  //    Ctrl+B,Id  101。HotKey.KeyModifiers.Ctrl         2   。
  HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
  //    Alt+D,Id  102。HotKey.KeyModifiers.Alt         1   。
  HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}

FormAのLeaveイベントでホットキーをオフにします.

private void FrmSale_Leave(object sender, EventArgs e)
{
  //  Id  100     
  HotKey.UnregisterHotKey(Handle, 100);
  //  Id  101     
  HotKey.UnregisterHotKey(Handle, 101);// http://ike.126.com
  //  Id  102     
  HotKey.UnregisterHotKey(Handle, 102);
}

FromAのWndProc関数の再ロード

/// 
///   Windows  
///   WndProc  ,        
/// 
/// 
protected override void WndProc(ref Message m)
{
  const int WM_HOTKEY = 0x0312;
  //     
  switch (m.Msg)
  {
    case WM_HOTKEY:
      switch (m.WParam.ToInt32())
      {
        case 100:  //    Shift+S
          //                
          break;
        case 101:  //    Ctrl+B
          //           
          break;
        case 102:  //    Alt+D
          //           
          break;
      }
    break;
  }
  base.WndProc(ref m);
}

コードが完了したら、フォームでShift+S、Ctrl+B、Alt+Dの3つのショートカットキーのいずれかを押すと、プログラムが応答します.
以上の内容は、編集者が紹介したC#WinFormショートカットキーの設定テクニックです.