如何捕获Print Screen键?

时间:2009-07-28 01:21:48

标签: c# visual-studio visual-studio-2008 events keydown

我的程序我需要在按下Print Screen键时捕获但它不能正常工作(但它可以与其他键一起工作)。

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

这是我目前的代码:

namespace Boom_Screenshot_
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    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.");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:7)

我找到了一个答案,我发现here(我不会说中文,所以不要问我说的是什么:)。你必须设置一个钩子。他提供了一个包装类。我在这里重复一些没有汉字的代码。 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();
}

答案 1 :(得分:1)

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

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

实施方法:

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

<UserControl.CommandBindings>
<CommandBinding Command='NavigationCommands.Refresh'
                   Executed="ApplicationRefresh_Executed">
</CommandBinding>
</UserControl.CommandBindings>

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

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