| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2634 人关注过本帖
标题:如何实现快捷键功能
取消只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
结帖率:96.08%
收藏
已结贴  问题点数:20 回复次数:3 
如何实现快捷键功能
问题是基于C#代码的,不知道发在哪里,就放在这个版块了。

要求实现全局快捷键,而且是单键,不是组合键。比如Space、A-Z等等。

1.非全局的组合快捷键(实现方法参见:http://blog.

2.非全局单键(不知道怎么实现)

3.全局组合键(同样参见上链接)

4.全局单键(我的问题)

搜索更多相关主题的帖子: 如何 组合键 快捷键 而且 
2015-08-25 14:12
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
这段代码我看不太懂,我写的是winForm代码

我运行了一下程序,似乎并没有什么反应?

这是程序运行界面:
图片附件: 游客没有浏览图片的权限,请 登录注册

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-08-25 22:16
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
从你的叙述:不论在何处按键,都会在上面的TextBlock中显示按下的键名
我感觉有点鼠标追踪的意思(我听说钩子可以这样做,因为我C#刚接触,还未仔细看钩子是什么)

我听说钩子用来做全局快捷键挺方便,且暂不用这种办法。

我还是挺想知道这样做为什么不行的,下面是我的代码:
1.HotKey类的定义
程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;  

namespace Hangman_Steven
{
    class HotKey
    {
        //如果函数执行成功,返回值不为0。  
        //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。  
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,                 //要定义热键的窗口的句柄  
            int id,                      //定义热键ID(不能与其它ID重复)            
            KeyModifiers fsModifiers,    //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效  
            Keys vk                      //定义热键的内容  
            );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,
            int id,
            Keys vk
            );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                 //要取消热键的窗口的句柄  
            int id                       //要取消热键的ID  
            );

        //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)  
        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
    }
}



2.调用
HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Shift, Keys.A);//定义Shift+A


我幻想着可以这样调用
HotKey.RegisterHotKey(Handle, 101, Keys.A);


所以我在HotKey类的定义中重载了RegisterHotKey函数(具体见定义代码)。但是实践证明:
HotKey.RegisterHotKey(Handle, 101, Keys.A);

这样定义的快捷键并不起作用。

PS:快捷键功能定义函数(部分代码)
程序代码:

 /// 监视Windows消息,重载WndProc方法,用于实现热键响应 
        protected override void WndProc(ref Message m)
        {
            const int WM_HOTKEY = 0x0312;
            //按快捷键  
            switch (m.Msg)
            {
                case WM_HOTKEY:
                    switch (m.WParam.ToInt32())
                    {
                        case 101:
                            //这里写具体的函数内容
                            break;

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-08-25 22:27
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
我想知道为什么我的代码原来那样是对的,为什么不能那样重载声明,简而言之,就是:这一切是怎么回事?


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-08-25 22:34
快速回复:如何实现快捷键功能
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023955 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved