zoukankan      html  css  js  c++  java
  • [收录]windows编程之为程序创建系统快捷键

    不用钩子了,钩子虽然肯定能实现,但是比较麻烦,用热键。我在我的资料里翻了一下,有这么一种解决方案,你试试!!!

    [问题提出]
    有的程序需要自定义组合键完成一定功能,如何实现?

    [解决方法]
    RegisterHotKey函数原型及说明:
    BOOL RegisterHotKey(
    HWND hWnd, // 接收WM_HOTKEY的窗口句柄
    int id, // hot key的ID号.
    UINT fsModifiers, // 响应那个热键.
    UINT vk // 与热键配合的键.

    其中:
    1)id的说明:
    id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一

    2)fsModifiers的取值如下:
    .MOD_ALT
    .MOD_CONTROL
    .MOD_SHIFT
    .MOD_WIN

    [程序实现]
    建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY.
    如下:

    在MyDlg.h中:
    class CMyDlg : public CDialog
    {
    // Construction
    public:
    int m_nHotKeyID;//为你自己定义的一个hot key的ID值,在整个程序唯一.
    ........
    protected:
    HICON m_hIcon;

    // Generated message map functions
    //{{AFX_MSG(CMyDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    在MyDlg.cpp中:
    #define VK_D 68

    ..............
    BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    //{{AFX_MSG_MAP(CHotKey1Dlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDOK, OnRegisterHotKey)
    ON_BN_CLICKED(IDCANCEL, OnUnregisterHotKey)
    ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入.
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    BOOL CMyDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.
    m_nHotKeyID=0;
    BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
    ASSERT(m_isKeyRegistered != FALSE);
    return TRUE; // return TRUE unless you set the focus to a control
    }

    在取消按钮的事件函数中加入:
    void CMyDlg::OnCancel()
    {
    BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
    ASSERT(m_iskeyUnregistered != FALSE);
    CDialog::OnCancel();
    }

    处理截到的组合键,并处理:
    LONG CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
    {
    AfxMessageBox("你按下了组合键:Alt+D");
    //加入相关代码.
    return 0;
    }

    大家试试此功能,希望有不对之处给以指正.

  • 相关阅读:
    [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
    [POJ1286&POJ2154&POJ2409]Polya定理
    monkey工具介绍及用法
    adb 命令使用与解释
    android-sdk的安装及配置
    spring-boot 加入拦截器Interceptor
    对spring boot 之AutoConfiguration 的理解
    java 集合操作小结
    java -d . **.java 与 java **.java 的区别
    关于Eclipse SVN 分支 与主干 小结
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/1441930.html
Copyright © 2011-2022 走看看