如何在未聚焦的情况下检测keyPress?

我正在尝试检测“ Print Screenbutton,而窗体不是当前活动的应用程序。

如果可能,怎么做?

是的,你可以称之为“系统钩子”,看一下.NET中的Global System Hooks 。

那么,如果你的系统钩子有问题,这里就是现成的解决scheme(基于http://www.dreamincode.net/forums/topic/180436-global-hotkeys/ ):

在你的项目中定义静态类:

 public static class Constants { //windows message id for hotkey public const int WM_HOTKEY_MSG_ID = 0x0312; } 

在你的项目中定义类:

 public class KeyHandler { [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); private int key; private IntPtr hWnd; private int id; public KeyHandler(Keys key, Form form) { this.key = (int)key; this.hWnd = form.Handle; id = this.GetHashCode(); } public override int GetHashCode() { return key ^ hWnd.ToInt32(); } public bool Register() { return RegisterHotKey(hWnd, id, 0, key); } public bool Unregiser() { return UnregisterHotKey(hWnd, id); } } 

添加使用:

 using System.Windows.Forms; using System.Runtime.InteropServices; 

现在,在你的表单中,添加字段:

 private KeyHandler ghk; 

并在Form构造函数中:

 ghk = new KeyHandler(Keys.PrintScreen, this); ghk.Register(); 

将这两种方法添加到您的表单中:

 private void HandleHotkey() { // Do stuff... } protected override void WndProc(ref Message m) { if (m.Msg == Constants.WM_HOTKEY_MSG_ID) HandleHotkey(); base.WndProc(ref m); } 

HandleHotkey是您的button按压处理程序。 你可以通过在这里传递不同的参数来改变button: ghk = new KeyHandler(Keys.PrintScreen, this);

现在你的程序对即时input做出了反应,即使没有集中注意力。