Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不传播到windows的背景键盘快捷键_C#_Keyboard Shortcuts - Fatal编程技术网

C# 不传播到windows的背景键盘快捷键

C# 不传播到windows的背景键盘快捷键,c#,keyboard-shortcuts,C#,Keyboard Shortcuts,我做了一个应用程序,需要处理特定的键盘按下,即使在窗口不活动时,现在我有了这个,它工作得很好;但是,已处理的密钥仍在传播到windows(不确定我的应用程序是否首先处理它们,因此我可能对此有所倒退) 有没有办法让我的应用程序可以处理我想要的按键操作,但不能将按键发送到当前的应用程序/窗口 EX)我在后台打开我的应用程序,监控数字键盘上的按键,每次我按下数字键盘上的数字键时,我都想将该数字添加到文本框中以供显示。现在我打开了chrome浏览器,并将光标放在地址栏中,我希望能够在应用程序处理数字键的

我做了一个应用程序,需要处理特定的键盘按下,即使在窗口不活动时,现在我有了这个,它工作得很好;但是,已处理的密钥仍在传播到windows(不确定我的应用程序是否首先处理它们,因此我可能对此有所倒退)

有没有办法让我的应用程序可以处理我想要的按键操作,但不能将按键发送到当前的应用程序/窗口

EX)我在后台打开我的应用程序,监控数字键盘上的按键,每次我按下数字键盘上的数字键时,我都想将该数字添加到文本框中以供显示。现在我打开了chrome浏览器,并将光标放在地址栏中,我希望能够在应用程序处理数字键的同时按下数字键,但不会让它们显示在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();
}