none
自定义快捷键问题 RRS feed

  • 问题

  • 最近在做一个功能,就是winfrom程序上的所有按钮的快捷键需要支持自定义。我的思路是,让自定义的数据保存在INI文件或者XML 配置文件了,然后每次启动的时候读这个问题,判断是否有自定义的设置,如果有自定义的就读取然后在程序的设置,问题来了,我读取数据后如何设置上去?因为设置键组合方式不定,比如:Ctrl+任意键、Ctrl+Alt+任意键、单个键等等。我的代码方法如下: 

                 

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {

                    // 默认快捷键

    //我如何读取文件的值然后转换为Keys.Escape等??????     

           if (keyData == Keys.Escape)   // 退出
                    {
                       ...
                    }
                    if (keyData == Keys.F1) //登陆
                    {
                       ...
                    }
                    if (keyData == Keys.F2)  //帮助
                    {
                      ...
                    }

    }

    各位帮忙看看,给点建议。这个功能类似游戏的快捷键的设置,应该有比较成熟的方法了。

    2012年3月25日 12:35

答案

  • dear

    要用快捷键,button要有focus


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    dear

    你可以记key的状态,Keys.ControlKey.ToString()存挡,读挡时再把string反射为Enum

    当然,组合键要存放的是集合List<Keys>,你可以參考以下的範例

            private void Form1_Load(object sender, EventArgs e)
            {
                this.KeyPreview = true;
            }
     
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                Keys key = e.KeyData;
                Keys key1 = Keys.Control | Keys.ControlKey;
                Keys key2 = Keys.D1;
     
                Keys key3 = key1 | key2;
                if (key == key3)
                {
                    MessageBox.Show("Ctr1+1");
                }
                
                string keyData = e.KeyData.ToString();
                string keyCode = e.KeyCode.ToString();
                this.label1.Text = keyData;
                this.label2.Text = keyCode;
            }

    或是使用Win32API

    http://yerik.blog.51cto.com/1662422/487570

    http://www.pin5i.com/showtopic-22435.html

    WndProc的用法

    http://www.dotblogs.com.tw/yc421206/archive/2011/01/24/20971.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/



    2012年3月27日 3:49

全部回复

  • 您好,

    請參考 Keys 枚举

    它也是數值哦!

    所以轉成數值就可以了哦!

    如Keys.Escape存到ini中是27,取出時,轉成Int就可以比較了哦!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月26日 1:24
  • dear

    要用快捷键,button要有focus


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年3月26日 3:05
  • 您好,我看了Keys枚举, 单个按键这样存储没有问题,但是如果是组合键呢?我的程序是允许他们使用组合的,例如:Ctrl+数字或者字母,Ctrl+shift+数字和字母,这样怎么存储呢?难道我枚举要列出所有的情况?这样肯定不对吧。

    如果是用FlagsAttribute 来的话,我该如何设计?   例如:下面是我写的枚举,我现在要存储Ctrl+shift+V     那我是要存储4+3+13 (这样如何解析噢?)还是存储20? 如果存储20,会不会响应的是X?

     [Flags]
            public enum Keys
            {
                None = 1,
                Enter = 2,
                ShiftKey = 3,         //     Shift 键。
                ControlKey = 4,    //     CTRL 键。
                Menu = 5,            //     Alt 键。    
                Escape=6,            //ESC
                PageUp=7,
                PageDown=8,
                Left=9,
                Up=10,
                Right=11,

               Down=12,

               V=13,     

               X=20

            }

    2012年3月27日 2:12
  • 你没看懂我提的问题么?
    2012年3月27日 3:03
  • dear

    要用快捷键,button要有focus


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    dear

    你可以记key的状态,Keys.ControlKey.ToString()存挡,读挡时再把string反射为Enum

    当然,组合键要存放的是集合List<Keys>,你可以參考以下的範例

            private void Form1_Load(object sender, EventArgs e)
            {
                this.KeyPreview = true;
            }
     
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                Keys key = e.KeyData;
                Keys key1 = Keys.Control | Keys.ControlKey;
                Keys key2 = Keys.D1;
     
                Keys key3 = key1 | key2;
                if (key == key3)
                {
                    MessageBox.Show("Ctr1+1");
                }
                
                string keyData = e.KeyData.ToString();
                string keyCode = e.KeyCode.ToString();
                this.label1.Text = keyData;
                this.label2.Text = keyCode;
            }

    或是使用Win32API

    http://yerik.blog.51cto.com/1662422/487570

    http://www.pin5i.com/showtopic-22435.html

    WndProc的用法

    http://www.dotblogs.com.tw/yc421206/archive/2011/01/24/20971.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/



    2012年3月27日 3:49