3

我正在执行必须检查菜单项内容的操作。菜单项包含标题+快捷键(帮助F1)

屏幕1

但是我遇到了检查菜单中是否有快捷键(F1)的问题。AutomationElement 不包含有关此键的任何信息。AccessKey 和 AcceleratorKey 为空。

在此处输入图像描述

如何通过 UI 自动化访问 accessKey?谢谢。

4

1 回答 1

1

ToolStrip 类菜单的默认实现只支持助记符。因此,例如,如果您将菜单声明为"&help"而不是"help",则 UI 自动化应该将此菜单项显示"Alt+h"为访问键。此实现不适用于其他类型的快捷方式,例如 Fx、CTRL 等。

如果您拥有经过检查的应用程序,则可以提供自定义访问密钥字符串。例如,这里是一个派生自 ToolStripMenuItem 并返回已设置的示例类ShortcutKeyDisplayString(注意默认情况下它为 null,即使已ShortcutKeys定义)。

这是您可以使用它的方式:

MyItem item = new MyItem("Help");
item.ShortcutKeys = Keys.F1;
item.ShortcutKeyDisplayString = "F1";
fileToolStripMenuItem.DropDownItems.Add(item);

这是示例类:

public class MyItem : ToolStripMenuItem
{
    public MyItem(string text)
        : base(text)
    {
    }

    protected override AccessibleObject CreateAccessibilityInstance()
    {
        return new MyAccessibleItem(this);
    }

    // unfortunately we can't just derive from ToolStripMenuItemAccessibleObject
    // which is stupidly marked as internal...
    private class MyAccessibleItem : ToolStripDropDownItemAccessibleObject
    {
        public MyAccessibleItem(ToolStripMenuItem owner)
            :base(owner)
        {
            Owner = owner;
        }

        public ToolStripMenuItem Owner { get; private set; } 

        public override AccessibleStates State
        {
            get
            {
                if (!Owner.Enabled)
                    return base.State;

                AccessibleStates state = base.State;
                if ((state & AccessibleStates.Pressed) == AccessibleStates.Pressed)
                {
                    state &= ~AccessibleStates.Pressed;
                }

                if (Owner.Checked)
                {
                    state |= AccessibleStates.Checked;
                }
                return state;
            }
        }

        public override string KeyboardShortcut
        {
            get
            {
                return Owner.ShortcutKeyDisplayString;
            }
        }
    }
}
于 2013-10-10T14:56:08.683 回答