Global Hooks(非活跃计划)

时间:2012-01-06 23:39:23

标签: c# hook global hotkeys

我正在创建一个允许您粘贴文本的程序,但它看起来就像您在粘贴时键入它一样,粘贴Typer。

我想使用Ctrl + b来引发粘贴,但我遇到热键问题。

我认为我需要的是使用WH_KEYBOARD_LL挂钩并包含该user32文件,但是当我添加它和命名空间时,我通常会收到错误。

我最接近这个:http://thedarkjoker94.cer33.com/?p=111 - 但它似乎不适用于Ctrlalt和其他修饰符,即使我使用KeyData也是如此。

我需要一种方法来制作一个即使程序不是活动窗口也能工作的热键。这是Microsoft Visual C#2010中的Windows窗体应用程序。

有很多StackOverlow主题但它们已经过时且不够完整,我无法运行。

1 个答案:

答案 0 :(得分:5)

您在谈论HookManager吗?

我成功地使用它:

HookManager.KeyDown += new KeyEventHandler(HookManager_KeyDown);

void HookManager_KeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.IsKeyDown(Keys.LWin)) // Is the Left-Windows Key down and ...
        switch (e.KeyCode)
        {
            case Keys.O: 
                // ...
                e.Handled = true;
                break;
            case Keys.H: 
                // ...
                e.Handled = true;
                break;
        }
}

我在这里创建的Keyboard类是代码:

// Used: http://www.pinvoke.net/default.aspx/user32.getasynckeystate
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Win32.Devices
{
    public class Keyboard
    {
        [DllImport("user32.dll")]
        static extern ushort GetAsyncKeyState(Keys vKey);

        public static bool IsKeyDown(Keys key)
        {
            return 0 != (GetAsyncKeyState(key) & 0x8000);
        }
    }
}