c#如何在应用程序或插件中添加键盘快捷键侦听器
本文关键字:添加 键盘 快捷键 侦听器 插件 应用程序 | 更新日期: 2023-09-27 18:03:46
如何绑定c#将侦听的键盘事件?下面的代码应该在任何Office插件或c#桌面应用程序中工作。要使其工作,你应该在应用程序的加载函数中调用Hotkeys.Setup()。
应用程序的本地键盘事件和全局键盘事件之间有区别吗?
应该做些什么来扩展代码以测量键盘按下的持续时间?
应该做些什么来扩展代码,使其能够跨任何窗口工作?
当前代码: using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MyApp{
public class Hotkeys{
private delegate int LowLevelKeyboardProc(bool pressEnd, int keyData, Int64 keyState);
private static IntPtr hookID;
//Hotkeys.Setup() inside your app's loading function to initialize this class
//return 0 to continue events registered to that keyboard shortcut, return 1 to stop
private static int HookCallback(bool pressEnd, int keyData, Int64 keyState)
{
if (pressEnd || keyState > Math.Pow(2,30))
return 0;
String key = ((Keys)keyData).ToString();
if (GetKeyState((int)Keys.RShiftKey)<0 || GetKeyState((int)Keys.LShiftKey)<0)
key += ", Shift";
if (GetKeyState((int)Keys.ControlKey)<0)
key += ", Control";
if (GetKeyState((int)Keys.Menu)<0)
key += ", Alt";
switch (key) {
case "F1":
MessageBox.Show("F1 pressed, continue events -- help window should popup");
return 0;
break; case "F2, Control":
MessageBox.Show("Control F2 pressed, stop events");
return 1;
break; case "S, Control":
MessageBox.Show("Control S pressed, stop events -- disabling save function");
return 1;
break;
}
return 0;
}
public static void Setup()
{
hookID = SetWindowsHookEx(2, HookCallback, IntPtr.Zero, (uint)Process.GetCurrentProcess().Threads[0].Id);
}
public static void Dispose()
{
UnhookWindowsHookEx(hookID);
}
[DllImport("user32.dll")]
private static extern short GetKeyState(int keyId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int kid, LowLevelKeyboardProc llkp, IntPtr h, uint processId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hookid);
}
}
你可以重写ProcessCmdKey for windowsForms:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.F1:
break;
case Keys.F2:
break;
}
return base.ProcessCmdKey(ref msg, keyData);
}