如何捕获Print Screen键?

我按下Print Screen键时我需要捕获的程序,但它不起作用(但它可以与其他键一起使用)。

我想这与windows劫持我的权威有关,因为我还是新手,我很想知道如何解决这个问题。

这是我目前的代码:

namespace Boom_Screenshot_ { ///  /// Interaction logic for Window1.xaml ///  public partial class Window1 : Window { //SETTINGS Key TRIGGER_KEY = Key.PrintScreen; public Window1() { InitializeComponent(); } private void Window_KeyDown(object sender, KeyEventArgs e) { if (e.Key == TRIGGER_KEY) { MessageBox.Show("'PrintScreen' was pressed."); } } } } 

我找到了你在这里找到的答案(我不会说中文,所以不要问我说的是什么:)。 你必须设置一个钩子。 他提供了一个包装类。 我在这里重复一些没有汉字的代码。 RegisterHotKey.cs ……

 using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace TestKeydown { public class RegisterHotKeyClass { private IntPtr m_WindowHandle = IntPtr.Zero; private MODKEY m_ModKey = MODKEY.MOD_CONTROL; private Keys m_Keys = Keys.A; private int m_WParam = 10000; private bool Star = false; private HotKeyWndProc m_HotKeyWnd = new HotKeyWndProc(); public IntPtr WindowHandle { get { return m_WindowHandle; } set { if (Star)return; m_WindowHandle = value; } } public MODKEY ModKey { get { return m_ModKey; } set { if (Star)return; m_ModKey = value; } } public Keys Keys { get { return m_Keys; } set { if (Star)return; m_Keys = value; } } public int WParam { get { return m_WParam; } set { if (Star)return; m_WParam = value; } } public void StarHotKey() { if (m_WindowHandle != IntPtr.Zero) { if (!RegisterHotKey(m_WindowHandle, m_WParam, m_ModKey, m_Keys)) { throw new Exception(""); } try { m_HotKeyWnd.m_HotKeyPass = new HotKeyPass(KeyPass); m_HotKeyWnd.m_WParam = m_WParam; m_HotKeyWnd.AssignHandle(m_WindowHandle); Star = true; } catch { StopHotKey(); } } } private void KeyPass() { if (HotKey != null) HotKey(); } public void StopHotKey() { if (Star) { if (!UnregisterHotKey(m_WindowHandle, m_WParam)) { throw new Exception(""); } Star = false; m_HotKeyWnd.ReleaseHandle(); } } public delegate void HotKeyPass(); public event HotKeyPass HotKey; private class HotKeyWndProc : NativeWindow { public int m_WParam = 10000; public HotKeyPass m_HotKeyPass; protected override void WndProc(ref Message m) { if (m.Msg == 0x0312 && m.WParam.ToInt32() == m_WParam) { if (m_HotKeyPass != null) m_HotKeyPass.Invoke(); } base.WndProc(ref m); } } public enum MODKEY { MOD_ALT = 0x0001, MOD_CONTROL = 0x0002, MOD_SHIFT = 0x0004, MOD_WIN = 0x0008, } [DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr wnd, int id, MODKEY mode, Keys vk); [DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr wnd, int id); } } 

在表单中调用代码…

 private RegisterHotKeyClass _RegisKey = new RegisterHotKeyClass(); void _Regis_HotKey() { MessageBox.Show("ok"); } private void Form1_Load(object sender, EventArgs e) { _RegisKey.Keys = Keys.PrintScreen; _RegisKey.ModKey = 0; _RegisKey.WindowHandle = this.Handle; _RegisKey.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey); _RegisKey.StarHotKey(); } 

以下是我的纯WPF解决方案。

我们可以使用NavigationCommands(Namespace:System.Window.Input)类在xaml中实现这一点,该类提供一组标准的导航命令(例如NextPage,PreviousPage,Refresh,Search等)

实施方法:

因此,我们可以使用NavigationCommands.Refresh调用任何自定义代码在应用程序刷新时执行

     

现在在UserControl类后面的代码中我们可以将方法定义为

 private void ApplicationRefresh_Executed(object sender, ExecutedRoutedEventArgs e) { // Implementation goes here. }