如何在未聚焦的情况下检测keyPress?
我正在尝试检测“ Print Screen
button,而窗体不是当前活动的应用程序。
如果可能,怎么做?
是的,你可以称之为“系统钩子”,看一下.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做出了反应,即使没有集中注意力。