C# 不传播到windows的背景键盘快捷键
我做了一个应用程序,需要处理特定的键盘按下,即使在窗口不活动时,现在我有了这个,它工作得很好;但是,已处理的密钥仍在传播到windows(不确定我的应用程序是否首先处理它们,因此我可能对此有所倒退) 有没有办法让我的应用程序可以处理我想要的按键操作,但不能将按键发送到当前的应用程序/窗口 EX)我在后台打开我的应用程序,监控数字键盘上的按键,每次我按下数字键盘上的数字键时,我都想将该数字添加到文本框中以供显示。现在我打开了chrome浏览器,并将光标放在地址栏中,我希望能够在应用程序处理数字键的同时按下数字键,但不会让它们显示在chrome地址栏中 谢谢 这基本上是一个非常简单的键盘记录器 (编辑) 键盘挂钩C# 不传播到windows的背景键盘快捷键,c#,keyboard-shortcuts,C#,Keyboard Shortcuts,我做了一个应用程序,需要处理特定的键盘按下,即使在窗口不活动时,现在我有了这个,它工作得很好;但是,已处理的密钥仍在传播到windows(不确定我的应用程序是否首先处理它们,因此我可能对此有所倒退) 有没有办法让我的应用程序可以处理我想要的按键操作,但不能将按键发送到当前的应用程序/窗口 EX)我在后台打开我的应用程序,监控数字键盘上的按键,每次我按下数字键盘上的数字键时,我都想将该数字添加到文本框中以供显示。现在我打开了chrome浏览器,并将光标放在地址栏中,我希望能够在应用程序处理数字键的
#endregion
using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class GlobalKeyboardHook
{
[DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int code, int wParam, ref keyBoardHookStruct lParam);
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, LLKeyboardHook callback, IntPtr hInstance, uint theardID);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
public delegate int LLKeyboardHook(int Code, int wParam, ref keyBoardHookStruct lParam);
public struct keyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
const int WH_KEYBOARD_LL = 13;
const int WM_KEYDOWN = 0x0100;
const int WM_KEYUP = 0x0101;
const int WM_SYSKEYDOWN = 0x0104;
const int WM_SYSKEYUP = 0x0105;
LLKeyboardHook llkh;
public List<Keys> HookedKeys = new List<Keys>();
IntPtr Hook = IntPtr.Zero;
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public GlobalKeyboardHook()
{
llkh = new LLKeyboardHook(HookProc);
hook();
}
~GlobalKeyboardHook()
{ unhook(); }
public void hook()
{
IntPtr hInstance = LoadLibrary("User32");
Hook = SetWindowsHookEx(WH_KEYBOARD_LL, llkh, hInstance, 0);
}
public void unhook()
{
UnhookWindowsHookEx(Hook);
}
public int HookProc(int Code, int wParam, ref keyBoardHookStruct lParam)
{
if (Code >= 0)
{
Keys key = (Keys)lParam.vkCode;
if (HookedKeys.Contains(key))
{
KeyEventArgs kArg = new KeyEventArgs(key);
if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
KeyDown(this, kArg);
else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
KeyUp(this, kArg);
if (kArg.Handled)
return 1;
}
}
return CallNextHookEx(Hook, Code, wParam, ref lParam);
}
}
在hookProc中,不能调用
return CallNextHookEx(Hook、code、wParam、ref lParam)代码>如果不希望WM_键传播
如果调用CallNextHookEx,消息将被传播
顺便说一句,您知道您使用的是全局钩子,而不是特定于线程的钩子吗?因此,您正在捕获所有按键,而不仅仅是与应用程序相关的按键 从描述中我看不出您是如何做到这一点的,您能发布一些代码来解释得更清楚一点吗?添加了一个简单的代码使用示例。您可能希望使用RegisterHotkey,而不是挂钩。请参阅使用RegisterHotKey更容易/更好。谢谢如果你愿意,请回答,我会接受。这很有效,谢谢。我知道我正在捕获所有按键,因为这是我想要的。我希望我的应用程序能够在后台(不活动)并且仍然可以接收按键。我不是100%你所说的特定于线程的钩子(这是否意味着只有当我的应用程序处于活动状态时,它才会收到压榨?)如果有更好的方法,请告诉我,因为我总是乐于学习更好的方法。你实际上可以钩住一个特定的过程。我说的是线程,但实际上是进程。因此,是的,当应用程序处于活动状态时,您将只处理发送到应用程序的关键消息。所以这不是你需要的。
GlobalKeyboardHook gHook;
private void Form1_Load(object sender, EventArgs e)
{
gHook = new GlobalKeyboardHook(); // Create a new GlobalKeyboardHook
// Declare a KeyDown Event
gHook.KeyDown += new KeyEventHandler(gHook_KeyDown);
// Add the keys you want to hook to the HookedKeys list
foreach (Keys key in Enum.GetValues(typeof(Keys)))
gHook.HookedKeys.Add(key);
}
// Handle the KeyDown Event
public void gHook_KeyDown(object sender, KeyEventArgs e)
{
textBox1.Text += ((char)e.KeyValue).ToString();
}
private void button1_Click(object sender, EventArgs e)
{
gHook.hook();
}
private void button2_Click(object sender, EventArgs e)
{
gHook.unhook();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
gHook.unhook();
}