C# 在游戏中按一个键,会使我的程序点击“开始”

C# 在游戏中按一个键,会使我的程序点击“开始”,c#,keyboard,fullscreen,C#,Keyboard,Fullscreen,我目前正在做一个程序,它将从示例中宣布并倒计时,比如说5分钟,所以当你按下开始按钮时,它将从5分钟倒计时到0 我想要的是: 如果我在一个全屏游戏中,例如魔兽世界、传奇联盟或任何具有全屏图形的游戏,并且我按下Numpad 8,我希望程序单击按钮1上的开始 这应该是可能的,因为我以前见过它,但我不知道怎么做。我在传奇联盟和Terria上测试了它。以下工作: public static class WindowsAPI { public enum HookType : int {

我目前正在做一个程序,它将从示例中宣布并倒计时,比如说5分钟,所以当你按下开始按钮时,它将从5分钟倒计时到0

我想要的是:

如果我在一个全屏游戏中,例如魔兽世界、传奇联盟或任何具有全屏图形的游戏,并且我按下Numpad 8,我希望程序单击按钮1上的开始


这应该是可能的,因为我以前见过它,但我不知道怎么做。

我在传奇联盟和Terria上测试了它。以下工作:

public static class WindowsAPI
{
    public enum HookType : int
    {
        WH_JOURNALRECORD = 0,
        WH_JOURNALPLAYBACK = 1,
        WH_KEYBOARD = 2,
        WH_GETMESSAGE = 3,
        WH_CALLWNDPROC = 4,
        WH_CBT = 5,
        WH_SYSMSGFILTER = 6,
        WH_MOUSE = 7,
        WH_HARDWARE = 8,
        WH_DEBUG = 9,
        WH_SHELL = 10,
        WH_FOREGROUNDIDLE = 11,
        WH_CALLWNDPROCRET = 12,
        WH_KEYBOARD_LL = 13,
        WH_MOUSE_LL = 14
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct KeyboardHookStruct
    {
        public int VirtualKeyCode;
        public int ScanCode;
        public int Flags;
        public int Time;
        public int ExtraInfo;
    }

    public delegate IntPtr HookProc(int nCode, IntPtr wp, IntPtr lp);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr SetWindowsHookEx(HookType idHook, HookProc lpfn, IntPtr hInstance, uint threadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(IntPtr hHook);

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr CallNextHookEx(HookType idHook, int nCode, IntPtr wParam, IntPtr lParam);
}
然后连接它:

public partial class Form1 : Form
{
    private IntPtr kbhook = IntPtr.Zero;

    private void Form1_Load(object sender, EventArgs e)
    {
        kbhook = WindowsAPI.SetWindowsHookEx(WindowsAPI.HookType.WH_KEYBOARD_LL, HandleKeyPress, IntPtr.Zero, 0);

        if (kbhook == IntPtr.Zero)
            Application.Exit();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        WindowsAPI.UnhookWindowsHookEx(kbhook);
    }


    private IntPtr HandleKeyPress(int nCode, IntPtr wp, IntPtr lp)
    {
        WindowsAPI.KeyboardHookStruct MyKeyboardHookStruct =
            (WindowsAPI.KeyboardHookStruct)Marshal.PtrToStructure(lp, typeof(WindowsAPI.KeyboardHookStruct));

        var key = (Keys)MyKeyboardHookStruct.VirtualKeyCode;

        // **********************************
        // if the pressed key is Keys.NumPad8
        if (key == Keys.NumPad8)
        {
            button1_Click(null, EventArgs.Empty);
        }

        return WindowsAPI.CallNextHookEx(WindowsAPI.HookType.WH_KEYBOARD_LL, nCode, wp, lp);
    }
}

可能有过时的代码示例,但了解方法签名很有帮助。

所以您想制作一个全局热键,即使在全屏应用程序具有焦点时也能工作?你说我想让程序点击按钮1的开始是什么意思?这是你唯一一次提到按钮1。如果用户在魔兽世界中按下“Numpad 8”,你想以某种方式截获该击键并将其传递给你的程序吗?看起来你想要的是一个键盘挂钩。贾斯汀:我想要的是当我按下Numpad 8的时候,比如哇,我想让我的C程序使用我的名为“开始”的按钮吉姆·米谢尔:我不太明白,因为我是一个新手:这是一个很难解决的问题。键盘输入通常进入活动窗口。你试图截取事件并将其发送到两个地方。如果你想知道它是如何工作的,你必须掌握一些相当先进的概念。我链接的问题显示了概念和一个实现。这取决于你学习更多关于低级键盘挂钩的知识,并根据自己的情况调整所学内容。好的,谢谢Jim,我想我可能对如何解决我的问题有另一个想法,但是不知道如何解决:p如果我做了一个新的表单,我怎么能一直在所有窗口上都这样做?在全屏上可以吗^^