2014-01-11 2 views
-3

Я делаю инструмент для игры, подсчитывая, сколько осталось времени, пока что-то не произойдет. начинает отсчитываться при нажатии F1.Как проверить, был ли задан конкретный ключ, когда программа сведена к минимуму?

Как определить, нажата ли клавиша F1? конечно, программа будет сведена к минимуму. Я использую C#, winform.

+0

Что такое 'так инструмент'? Почему программа минимизирована? Если это не активное окно, вам, вероятно, понадобится клавиатурный крючок. – stuartd

+0

Некоторые *. И программа сведена к минимуму, потому что пользователь запускает игру в полноэкранном режиме, поэтому ее запуск в фоновом режиме. – user3186270

+0

Возможный дубликат [Захват нажатия клавиш в фоновом режиме] (http://stackoverflow.com/questions/15413172/capture-a-keyboard-keypress-in-the-background) –

ответ

0

Я использовал ниже метод, чтобы отключить мой 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; 
+0

Большое спасибо! Я попробую! – user3186270

+0

Добро пожаловать! Конечно, вы должны немного изменить его. –

Смежные вопросы