Я использовал ниже метод, чтобы отключить мой Rwin и Lwin на моей клавиатуре. Я немного изменил, может быть, это может быть полезно для вас. Дело в том, что в основном F1 используется для помощи в окнах, поэтому сначала вы должны отключить функциональность по умолчанию. Проверьте это:
// 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;
Что такое 'так инструмент'? Почему программа минимизирована? Если это не активное окно, вам, вероятно, понадобится клавиатурный крючок. – stuartd
Некоторые *. И программа сведена к минимуму, потому что пользователь запускает игру в полноэкранном режиме, поэтому ее запуск в фоновом режиме. – user3186270
Возможный дубликат [Захват нажатия клавиш в фоновом режиме] (http://stackoverflow.com/questions/15413172/capture-a-keyboard-keypress-in-the-background) –