怎样才可以在任何地方按快捷键,我的c#程序都能接收得到?谢谢!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    用钩子  钩子哦 
    例子如下
    通过热键隐藏/显示窗口,以前看到用钩子做过,下面的这个方法也好像挺好的
    using System; 
    using System.Text; 
    using System.Collections; 
    using System.Runtime.InteropServices; namespace WindowHider 

    /// <summary> 
    /// Object used to control a Windows Form. 
    /// </summary> 
    public class Window 

    /// <summary> 
    /// Win32 API Imports 
    /// </summary> 
    [DllImport("user32.dll")] private static extern 
    bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
    [DllImport("user32.dll")] private static extern 
    bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] private static extern 
    bool IsIconic(IntPtr hWnd); 
    [DllImport("user32.dll")] private static extern 
    bool IsZoomed(IntPtr hWnd); 
    [DllImport("user32.dll")] private static extern 
    IntPtr GetForegroundWindow(); 
    [DllImport("user32.dll")] private static extern 
    IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 
    [DllImport("user32.dll")] private static extern 
    IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach); /// <summary> 
    /// Win32 API Constants for ShowWindowAsync() 
    /// </summary> 
    private const int SW_HIDE = 0; 
    private const int SW_SHOWNORMAL = 1; 
    private const int SW_SHOWMINIMIZED = 2; 
    private const int SW_SHOWMAXIMIZED = 3; 
    private const int SW_SHOWNOACTIVATE = 4; 
    private const int SW_RESTORE = 9; 
    private const int SW_SHOWDEFAULT = 10; /// <summary> 
    /// Private Fields 
    /// </summary> 
    private IntPtr m_hWnd; 
    private string m_Title; 
    private bool m_Visible = true; 
    private string m_Process; 
    private bool m_WasMax = false; /// <summary> 
    /// Window Object's Public Properties 
    /// </summary> 
    public IntPtr hWnd 

    get{return m_hWnd;} 

    public string Title 

    get{return m_Title;} 

    public string Process 

    get{return m_Process;} 
    } /// <summary> 
    /// Sets this Window Object's visibility 
    /// </summary> 
    public bool Visible 

    get{return m_Visible;} 
    set 

    //show the window 
    if(value == true) 

    if(m_WasMax) 

    if(ShowWindowAsync(m_hWnd,SW_SHOWMAXIMIZED)) 
    m_Visible = true; 

    else 

    if(ShowWindowAsync(m_hWnd,SW_SHOWNORMAL)) 
    m_Visible = true; 


    //hide the window 
    if(value == false) 

    m_WasMax = IsZoomed(m_hWnd); 
    if(ShowWindowAsync(m_hWnd,SW_HIDE)) 
    m_Visible = false; 


    } /// <summary> 
    /// Constructs a Window Object 
    /// </summary> 
    /// <param name="Title">Title Caption</param> 
    /// <param name="hWnd">Handle</param> 
    /// <param name="Process">Owning Process</param> 
    public Window(string Title, IntPtr hWnd, string Process) 

    m_Title = Title; 
    m_hWnd = hWnd; 
    m_Process = Process; 
    } //Override ToString() 
    public override string ToString() 

    //return the title if it has one, if not return the process name 
    if (m_Title.Length > 0) 

    return m_Title; 

    else 

    return m_Process; 

    } /// <summary> 
    /// Sets focus to this Window Object 
    /// </summary> 
    public void Activate() 

    if(m_hWnd == GetForegroundWindow()) 
    return; IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(), 
    IntPtr.Zero); 
    IntPtr ThreadID2 = GetWindowThreadProcessId(m_hWnd,IntPtr.Zero); if (ThreadID1 != ThreadID2) 

    AttachThreadInput(ThreadID1,ThreadID2,1); 
    SetForegroundWindow(m_hWnd); 
    AttachThreadInput(ThreadID1,ThreadID2,0); 

    else 

    SetForegroundWindow(m_hWnd); 
    } if (IsIconic(m_hWnd)) 

    ShowWindowAsync(m_hWnd,SW_RESTORE); 

    else 

    ShowWindowAsync(m_hWnd,SW_SHOWNORMAL); 


    } /// <summary> 
    /// Collection used to enumerate Window Objects 
    /// </summary> 
    public class Windows : IEnumerable, IEnumerator 

    /// <summary> 
    /// Win32 API Imports 
    /// </summary> 
    [DllImport("user32.dll")] private static extern 
    int GetWindowText(int hWnd, StringBuilder title, int size); 
    [DllImport("user32.dll")] private static extern 
    int GetWindowModuleFileName(int hWnd, StringBuilder title, int size); 
    [DllImport("user32.dll")] private static extern 
    int EnumWindows(EnumWindowsProc ewp, int lParam); 
    [DllImport("user32.dll")] private static extern 
    bool IsWindowVisible(int hWnd); //delegate used for EnumWindows() callback function 
    public delegate bool EnumWindowsProc(int hWnd, int lParam); private int m_Position = -1; // holds current index of wndArray, 
    // necessary for IEnumerable ArrayList wndArray = new ArrayList(); //array of windows //Object's private fields 
    private bool m_invisible = false; 
    private bool m_notitle = false; /// <summary> 
    /// Collection Constructor with additional options 
    /// </summary> 
    /// <param name="Invisible">Include invisible Windows</param> 
    /// <param name="Untitled">Include untitled Windows</param> 
    public Windows(bool Invisible, bool Untitled) 

    m_invisible = Invisible; 
    m_notitle = Untitled; //Declare a callback delegate for EnumWindows() API call 
    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow); 
    //Enumerate all Windows 
    EnumWindows(ewp, 0); 

    /// <summary> 
    /// Collection Constructor 
    /// </summary> 
    public Windows() 

    //Declare a callback delegate for EnumWindows() API call 
    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow); 
    //Enumerate all Windows 
    EnumWindows(ewp, 0); 

    //EnumWindows CALLBACK function 
    private bool EvalWindow(int hWnd, int lParam) 

    if (m_invisible == false && !IsWindowVisible(hWnd)) 
    return(true); StringBuilder title = new StringBuilder(256); 
    StringBuilder module = new StringBuilder(256); GetWindowModuleFileName(hWnd, module, 256); 
    GetWindowText(hWnd, title, 256); if (m_notitle == false && title.Length == 0) 
    return(true); wndArray.Add(new Window(title.ToString(), (IntPtr)hWnd, 
    module.ToString())); return(true); 
    } //implement IEnumerable 
    public IEnumerator GetEnumerator() 

    return (IEnumerator)this; 

    //implement IEnumerator 
    public bool MoveNext() 

    m_Position++; 
    if (m_Position < wndArray.Count) 

    return true; 

    else 

    return false; 


    public void Reset() 

    m_Position = -1; 

    public object Current 

    get 

    return wndArray[m_Position]; 



    }
      

  2.   

    我不建议使用Hook来实现,用如下的方法:Application.AddMessageFilter(IMessageFilter);
      

  3.   

    hbxtlhx(平民百姓) 的方式有点问题,比如在其他程序界面无法响应按键;
      

  4.   

    太麻烦了,楼主加入这个代码就行了
            protected override bool ProcessCmdKey( ref Message msg, Keys e ) 
            {
                MessageBox.Show("Catched");
                return false;
            }
      

  5.   

    到www.codeproject.com找RuntimeObjectEditor的代码看看,可以实现。
    RuntimeObjectEditor是个很好用的程序:)
      

  6.   

    RuntimeObjectEditor里面有一个DLL,叫wfspyhook,也有代码
      

  7.   

    系统热键不行吗?!
    RegisterHotKey
      

  8.   

    KeyHook,-----------------------
    祝个位师兄Happy new Year!jf
      

  9.   

    参考http://community.csdn.net/Expert/topic/5239/5239299.xml?temp=.2025873
      

  10.   

    最簡單的辦法是就定義一個Menu,對Menu定義一個快捷項,然後添加到你想要的窗體中去。