2009-07-28 109 views
3

我的程序我需要捕獲當打印屏幕鍵被按下但它不工作(但它與其他鍵)。我如何捕獲打印屏幕鍵?

我想這與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."); 
      } 
     } 
    } 
} 

回答

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

下面是我純粹的WPF解決方案。

我們可以通過使用NavigationCommands(命名空間:System.Window.Input)在XAML實現這一類,它提供了一組標準的導航命令(如下一頁,|上一頁,刷新,搜索等)

實現方法:

因此,我們可以調用任何自定義代碼使用NavigationCommands.Refresh應用刷新爲

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

現在在代碼執行隱藏類用戶控件的,我們可以定義方法

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