本帖最后由 cejay 于 2010-06-16 02:09:34 编辑

解决方案 »

  1.   

    以下代码我也是从CSDN 别人回答问题时拷贝过来的,按你的要求修改了一下,供你参考:
             private void button7_Click(object sender, EventArgs e)
             {
                 this.Hide();
                 if (_RegisKey != null) { return; }             _RegisKey = new RegisterHotKeyClass();
                 _RegisKey.Keys = Keys.Q;
                 _RegisKey.ModKey =  RegisterHotKeyClass.MODKEY.MOD_ALT;
                 _RegisKey.WindowHandle = this.Handle;
                 _RegisKey.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey);
                 _RegisKey.StarHotKey();
             }
      

  2.   


          private RegisterHotKeyClass _RegisKey;
             void _Regis_HotKey()
             {
                 MessageBox.Show("You are pressed Alt + Q");
                 
                 this.Show();
                 //Do something
             }
             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);         } 
      

  3.   

    private void Form1_KeyDown(object sender, KeyEventArgs e)  
      {  
      switch (e.KeyCode)  
      {  
      case Keys.Control Or Keys.A: Button2_Click(sender, e); break;  
      case Keys.B: Button4_Click(sender, e); break;  
      default:break;
      }  
      }  
    钩子函数
    protected override void WndProc(ref Message m)   
    {   
    }
      

  4.   

     //全局按键
            void keyboardHook_KeyDown(object sender, KeyEventArgs e)
            {
               if (e.Alt&& e.KeyCode == Keys.Q)
                {
                 }
             }
    可到http://download.csdn.net/source/2046112下载例子
      

  5.   

       KeyboardHook keyboardHook = new KeyboardHook();//全局按键 public frmMonitor()
            {
                InitializeComponent();
                keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
                keyboardHook.Start();
            }结合上面即可完成,将GlobalHook.cs和KeyboardHook.cs复制到你的项目
      

  6.   


    这里是假设在 Button 里调用,后面的代码是放在和  button7_Click 同一级的IDE 窗口中,
    代码是通过了的,没有错误。至于有些有些不明白,我也一样,你不要太在乎,等你C#技术高了,再回过头来看,里面使用了属性,事件,委托 ,API,重载等等