110,561
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ChangeKeys
{
/// <summary>
/// 改键工具
/// <Author>YuSir</Author>
/// </summary>
public partial class ChangeKeys : Form
{
#region 构造
/// <summary>
/// 构造函数
/// </summary>
public ChangeKeys()
{
//绘制界面上控件等
InitializeComponent();
//设置焦点为输入按键文本框
TxtOldKey.Focus();
}
#endregion
#region 变量
/// <summary>
/// 声明委托
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
/// <summary>
/// 声明键盘钩子事件类型
/// </summary>
HookProc KeyboardHookProcedure;
/// <summary>
/// 键盘钩子句柄
/// </summary>
static int hKeyboardHook = 0;
//装置钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//卸下钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//获取某个进程的句柄函数
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
/// <summary>
/// 普通按键消息
/// </summary>
private const int WM_KEYDOWN = 0x100;
/// <summary>
/// 系统按键消息
/// </summary>
private const int WM_SYSKEYDOWN = 0x104;
//鼠标常量
public const int WH_KEYBOARD_LL = 13;
//声明键盘钩子的封送结构类型
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;
public int time;
public int dwExtraInfo;
}
#endregion
#region 事件
/// <summary>
/// 释放按键时把按键显示在文本框中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtOldKey_KeyUp(object sender, KeyEventArgs e)
{
TxtOldKey.Text = e.KeyCode.ToString();
}
/// <summary>
/// 释放按键时把按键显示在文本框中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtNewKey_KeyUp(object sender, KeyEventArgs e)
{
TxtNewKey.Text = e.KeyCode.ToString();
}
/// <summary>
/// 启动键盘钩子
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnStart_Click(object sender, EventArgs e)
{
//启动键盘钩子
if (hKeyboardHook == 0)
{
//实例化委托
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
Process curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);
}
}
/// <summary>
/// 截取全局按键,发送新按键,返回
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
if (keyData.ToString() == TxtNewKey.Text)
{
SendKeys.Send("{" + TxtOldKey.Text + "}");
//return为了屏蔽原来的按键,如果去掉,则原来的按键和新的按键都会模拟按。
return 1;
}
}
return 0;
}
/// <summary>
/// 停止键盘钩子
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnStop_Click(object sender, EventArgs e)
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
//如果卸下钩子失败
if (!(retKeyboard)) throw new Exception("卸下钩子失败!");
}
#endregion
}
}