【问题标题】:How to check if a specific key was pressed when program is minimized?如何检查程序最小化时是否按下了特定键?
【发布时间】:2014-01-11 23:36:02
【问题描述】:

我正在为游戏制作一些工具,用于计算距离某事发生还有多长时间。 按下 F1 时开始计数。

如何检测是否按下了 F1?该程序当然会被最小化。 我正在使用 C#,winform。

【问题讨论】:

  • 什么是“工具”?为什么程序最小化?如果它不是活动窗口,您可能需要一个键盘挂钩。
  • 一些*。并且程序被最小化,因为用户全屏运行游戏,所以它在后台运行。

标签: c# winforms keyboard key


【解决方案1】:

我使用以下方法禁用我的键盘中的 Rwin 和 Lwin。我修改了一下,也许对你有用。事情基本上是 F1 用于 Windows 中的帮助,因此您必须首先禁用默认功能。看看吧:

// Structure contain information about low-level keyboard input event
[StructLayout(LayoutKind.Sequential)]
private struct KBDLLHOOKSTRUCT
{
    public Keys key;
    public int scanCode;
    public int flags;
    public int time;
    public IntPtr extra;
}

//System level functions to be used for hook and unhook keyboard input
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool UnhookWindowsHookEx(IntPtr hook);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string name);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern short GetAsyncKeyState(Keys key);

//Declaring Global objects
private IntPtr ptrHook;
private LowLevelKeyboardProc objKeyboardProcess;

private IntPtr CaptureKey(int nCode, IntPtr wp, IntPtr lp)
{
      if (nCode >= 0)
    {
        KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));
        if (objKeyInfo.key == Keys.F1) // Disabling Windows keys
        {
            MessageBox.Show("F1 PRESSED");
            return (IntPtr)1;            
        }

    }
    return CallNextHookEx(ptrHook, nCode, wp, lp);
}


public Form1()
{
    InitializeComponent();
    this.WindowState = FormWindowState.Minimized;

    //Get Current Module
    ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
    //Assign callback function each time keyboard process
    objKeyboardProcess = new LowLevelKeyboardProc(CaptureKey);
    //Setting Hook of Keyboard Process for current module
    ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0); 

} 

注意:您必须使用以下命名空间:

using System.Diagnostics;
using System.Runtime.InteropServices;

【讨论】:

  • 非常感谢!我会试试的!
  • 不客气!当然,您必须对其进行一些修改。
猜你喜欢
  • 2014-01-15
  • 2023-03-03
  • 2012-08-14
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-10
相关资源
最近更新 更多