/// <summary> /// 设置当前按钮的状态 /// </summary> /// <param args="KeyExEventArgs">键信息</param> /// <param isDown="bool">标识,当前键是否按下</param> private void SetButtonStatus(HookEx.KeyExEventArgs args, bool isDown) { IList <FecitButton> buttonList = FindButtonList(args); //查找当有键 if (buttonList.Count <= 0) //如果没有找到 { return; //退出本次操作 } short key = (short)args.KeyValue; //获取当前键的键值 if (spacialVKButtonsMap.ContainsKey(key)) //如果键/值列表中有该键 { if (!isDown) //如果按钮没有被按下 { FecitButton button = spacialVKButtonsMap[key][0]; //设置按钮的信息 button.Checked = !button.Checked; //设置当前按钮为按下状态 } } else { foreach (FecitButton button in buttonList) //遍历IList中的所有按钮 { if (button == null) //如果按钮为空 { break; //退出循环 } button.Checked = isDown; //设置按钮的状态 } } }
private void ButtonOnClick(object sender, EventArgs e) //按键的单击事件 { FecitButton btnKey = sender as FecitButton; //获取当前按键的信息 if (btnKey == null) //如果按键为空值 { return; } SendKeyCommand(btnKey);//发送按键的信息 }
/// <summary> /// 在键列表中查找键值 /// </summary> /// <param args="KeyExEventArgs">键信息</param> private IList <FecitButton> FindButtonList(HookEx.KeyExEventArgs args) { short key = (short)args.KeyValue; //获取键值 if (key == KeyboardConstaint.VK_LCONTROL || key == KeyboardConstaint.VK_RCONTROL) //如果是CTRL键 { key = KeyboardConstaint.VK_CONTROL; //记录CTRL键值 } else if (key == KeyboardConstaint.VK_LSHIFT || key == KeyboardConstaint.VK_RSHIFT) //如果是SHIFT键 { key = KeyboardConstaint.VK_SHIFT; //记录SHIFT键值 } else if (key == KeyboardConstaint.VK_LMENU || key == KeyboardConstaint.VK_RMENU) //如果是ALT键 { key = KeyboardConstaint.VK_MENU; //记录ALT键值 } else if (key == KeyboardConstaint.VK_RWIN) //如果是WIN键 { key = KeyboardConstaint.VK_LWIN; //记录WIN键值 } if (combinationVKButtonsMap.ContainsKey(key)) //如果在IDictionary的集合中 { return(combinationVKButtonsMap[key]); //返回当前键的键值 } IList <FecitButton> buttonList = new List <FecitButton>(); //实例化IList<FecitButton> foreach (Control ctrl in this.Controls) //遍历当前窗体中的所有控件 { FecitButton button = ctrl as FecitButton; //如果当前控件是FecitButton按钮 if (button == null) //如果当前按钮为空 { continue; //重新循环 } short theKey = Convert.ToInt16(button.Tag.ToString()); //获取当前按钮的键值 if (theKey == key) //如果与当前操作的按钮相同 { buttonList.Add(button); //添加当前操作的按键信息 break; } } return(buttonList); }
/// <summary> /// 接收并发送按键信息 /// </summary> /// <param keyButton="FecitButton">按键信息</param> private void SendKeyCommand(FecitButton keyButton) { short key = Convert.ToInt16(keyButton.Tag.ToString()); //获取当前键的键值 if (combinationVKButtonsMap.ContainsKey(key)) //如果键值在键值列表中 { if (keyButton.Checked) //如果按钮处于按下状态 { SendKeyUp(key); //对按钮进行抬起操作 } else { SendKeyDown(key);//对按钮进行按下操作 } } else { //执行按钮按下和抬起的操作 SendKeyDown(key); SendKeyUp(key); } }
private static IDictionary <short, IList <FecitButton> > combinationVKButtonsMap; //表示键/值对应的泛型集合 public Frm_Main() { InitializeComponent(); #region 将指定的按钮值添加到键类型中 spacialVKButtonsMap = new Dictionary <short, IList <FecitButton> >(); combinationVKButtonsMap = new Dictionary <short, IList <FecitButton> >(); IList <FecitButton> buttonList = new List <FecitButton>(); //实例化IList<FecitButton>(按照索引单独访问的一组对象) buttonList.Add(this.btnLCTRL); //添加左面的CTRL键 combinationVKButtonsMap.Add(KeyboardConstaint.VK_CONTROL, buttonList); //添加左面的CTRL键值 buttonList = new List <FecitButton>(); buttonList.Add(this.btnLSHFT); //添加左面的LSHFT键 buttonList.Add(this.btnRSHFT); //添加右面的LSHFT键 combinationVKButtonsMap.Add(KeyboardConstaint.VK_SHIFT, buttonList); //添加LSHFT键值 buttonList = new List <FecitButton>(); //实例化IList<FecitButton> buttonList.Add(this.btnLALT); //添加左面的ALT键 combinationVKButtonsMap.Add(KeyboardConstaint.VK_MENU, buttonList); //添加左面的ALT键值 buttonList = new List <FecitButton>(); //实例化IList<FecitButton> buttonList.Add(this.btnLW); //添加左面的WIN键 combinationVKButtonsMap.Add(KeyboardConstaint.VK_LWIN, buttonList); //添加左面的WIN键值 buttonList = new List <FecitButton>(); //实例化IList<FecitButton> buttonList.Add(this.btnLOCK); //添加LOCK键 spacialVKButtonsMap.Add(KeyboardConstaint.VK_CAPITAL, buttonList); //添加LOCK键值 #endregion foreach (Control ctrl in this.Controls) { FecitButton button = ctrl as FecitButton; if (button == null) { continue; } #region 设置按键的消息值 short key = 0;//记录键值 bool isSpacialKey = true; //记录快捷键的键值 switch (button.Name) //获取键名称 { case "btnLCTRL": //CTRL键的左键名称 case "btnRCTRL": //CTRL键的右键名称 key = KeyboardConstaint.VK_CONTROL; //获取CTRL键的键值 break; case "btnLSHFT": //SHFT键的左键名称 case "btnRSHFT": //SHFT键的左键名称 key = KeyboardConstaint.VK_SHIFT; //获取SHFT键的键值 break; case "btnLALT": //ALT键的左键名称 case "btnRALT": //ALT键的左键名称 key = KeyboardConstaint.VK_MENU; //获取ALT键的键值 break; case "btnLW": //WIN键的左键名称 case "btnRW": //WIN键的左键名称 key = KeyboardConstaint.VK_LWIN; //获取WIN键的键值 break; case "btnESC": //ESC键的名称 key = KeyboardConstaint.VK_ESCAPE; //获取ESC键的键值 break; case "btnTAB": //TAB键的名称 key = KeyboardConstaint.VK_TAB; //获取TAB键的键值 break; case "btnF1": //F1键的名称 key = KeyboardConstaint.VK_F1; //获取F1键的键值 break; case "btnF2": key = KeyboardConstaint.VK_F2; break; case "btnF3": key = KeyboardConstaint.VK_F3; break; case "btnF4": key = KeyboardConstaint.VK_F4; break; case "btnF5": key = KeyboardConstaint.VK_F5; break; case "btnF6": key = KeyboardConstaint.VK_F6; break; case "btnF7": key = KeyboardConstaint.VK_F7; break; case "btnF8": key = KeyboardConstaint.VK_F8; break; case "btnF9": key = KeyboardConstaint.VK_F9; break; case "btnF10": key = KeyboardConstaint.VK_F10; break; case "btnF11": key = KeyboardConstaint.VK_F11; break; case "btnF12": key = KeyboardConstaint.VK_F12; break; case "btnENT": case "btnNUMENT": key = KeyboardConstaint.VK_RETURN; break; case "btnWave": key = KeyboardConstaint.VK_OEM_3; break; case "btnSem": key = KeyboardConstaint.VK_OEM_1; break; case "btnQute": key = KeyboardConstaint.VK_OEM_7; break; case "btnSpace": key = KeyboardConstaint.VK_SPACE; break; case "btnBKSP": key = KeyboardConstaint.VK_BACK; break; case "btnComma": key = KeyboardConstaint.VK_OEM_COMMA; break; case "btnFullStop": key = KeyboardConstaint.VK_OEM_PERIOD; break; case "btnLOCK": key = KeyboardConstaint.VK_CAPITAL; break; case "btnMinus": key = KeyboardConstaint.VK_OEM_MINUS; break; case "btnEqual": key = KeyboardConstaint.VK_OEM_PLUS; break; case "btnLBracket": key = KeyboardConstaint.VK_OEM_4; break; case "btnRBracket": key = KeyboardConstaint.VK_OEM_6; break; case "btnPath": key = KeyboardConstaint.VK_OEM_5; break; case "btnDivide": key = KeyboardConstaint.VK_OEM_2; break; case "btnPSC": key = KeyboardConstaint.VK_SNAPSHOT; break; case "btnINS": //Insert键的名称 key = KeyboardConstaint.VK_INSERT; //获取Insert键的键值 break; case "btnDEL": //Delete键的名称 key = KeyboardConstaint.VK_DELETE; //获取Delete键的键值 break; default: isSpacialKey = false; break; } if (!isSpacialKey) { key = (short)button.Name[3]; //获取按钮的键值 } button.Tag = key; //在按钮的Tag属性中记录相应的键值 #endregion button.Click += ButtonOnClick; //重载按钮的单击事件 } this.hook = new HookEx.UserActivityHook(true, true); HookEvents(); }