【问题标题】:Get Keys from a ShortCut从快捷方式获取密钥
【发布时间】:2019-06-06 21:13:22
【问题描述】:

除此之外,还有其他方法可以从快捷方式中获取密钥

sc 的类型为System.Windows.Forms.Shortcut

var k = (Keys)sc;

我需要为每个键使用单独的字符串,因为我使用的是 Progress ABL .NET 桥接器(不要问),所以上述方法不起作用。

我认为sc 应该是一个整数,但显然在 .NET 中这行代码可以正常工作。

【问题讨论】:

  • 我对实际问题有点不清楚。 Keys 是一个枚举 (msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx)
  • 确实,我也不太确定。 sc 是 ShortCut 的一个实例,显然您可以按照描述的方式从中获取 Keys(枚举)。
  • 原来是一个Enum被转换成另一个Enum了……很奇怪。

标签: c# winforms


【解决方案1】:

ShortCut 枚举值已经经过仔细选择,以与快捷方式的 Keys 枚举完全匹配。例如,ShortCut.CtrlShiftF1 是 0x30070,它匹配 (Keys.Control | Keys.Shift | Keys.F1): 0x20000 | 0x10000 | 0x00070 = 0x30070。这不是意外。

已经提供了将ShortCut转换为字符串,如果将其ShowShortcut属性设置为True,MenuStrip中的菜单项可以自动显示MenuItem.Shortcut的字符串。您可以在自己的代码中使用相同的技术,使用 KeysConverter 类:

    var sc = Shortcut.CtrlShiftF1;
    var txt = new KeysConverter().ConvertToString((Keys)sc);
    Console.WriteLine(txt);

输出:

Ctrl+Shift+F1 .

【讨论】:

    【解决方案2】:

    ABL 中的示例:

    USING Progress.Util.TypeHelper FROM ASSEMBLY.
    USING System.Enum FROM ASSEMBLY.
    USING System.Windows.Forms.Keys FROM ASSEMBLY.
    USING System.Windows.Forms.Shortcut FROM ASSEMBLY.
    
    DEFINE VARIABLE ShortCut AS ShortCut NO-UNDO.
    DEFINE VARIABLE Keys_ AS Keys NO-UNDO.
    
    ShortCut = System.Windows.Forms.Shortcut:CtrlShiftF1.
    Keys_ = CAST(Enum:ToObject(TypeHelper:GetType("System.Windows.Forms.Keys"), ShortCut:value__), Keys).
    
    MESSAGE Keys_
        VIEW-AS ALERT-BOX.
    

    【讨论】:

      【解决方案3】:

      我通过将 System.Windows.Forms.Shortcut 的值 GetHashValue() 的结果与 KeyDown 事件处理程序中的 e:KeyData:GetHGashValue() 进行比较,使用 ABL .NET 桥解决了这个问题。

      【讨论】:

      • 嗨,迈克,这对我来说还不够。不知何故,对于 Culture nl-BE,Shift 显示为 MAJ(Windows 或 Infragistics 错误)。所以我需要单独的键来查看是否有需要用 SHIFT 替换的 MAJ。
      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 2014-08-10
      • 2017-10-22
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2021-06-11
      相关资源
      最近更新 更多