使用 System.Windows.Forms.SendKeys.Send() 发送插入符号将发送 &(与号)

问题描述 投票:0回答:3

使用

SendKeys.Send()
System.Windows.Forms
发送插入符号时
^

SendKeys.Send ("{^}")

它将发送一个 & 符号

&

为什么?

c# sendkeys
3个回答
1
投票

我解决了德语键盘布局的问题。

问题是有些键是硬编码的,如下所示:

static SendKeys()
{
    keywords = new KeywordVk[49]
    {
        ...
        new KeywordVk("+", 107),
        new KeywordVk("%", 65589),
        new KeywordVk("^", 65590) // this is a problem !
    }
}

所以破解方法是覆盖

new KeywordVk("^", ...)

的值
// fix caret, ^, circumflex on german keyboards
public static void FixSendKeys_Caret()
{
    // SendKeys.keywords
    var keywordsField = typeof(SendKeys)
        .GetField("keywords", BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null) as IList;

    // KeywordVk { keyword= "^", vk = xx }, should be at index 48
    var keywordVk_Obj = keywordsField[48];

    var keywordField = keywordVk_Obj.GetType().GetField("keyword", BindingFlags.NonPublic | BindingFlags.Instance);
    // KeywordVk.vk
    var vkField = keywordVk_Obj.GetType().GetField("vk", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (keywordField.GetValue(keywordVk_Obj).ToString() != "^")
        throw new Exception("wrong KeywordVk");

    // SendKeys.keywords[48].vk = (int)Keys.Oem5;
    // For german keyboards "^" = Keys.Oem5
    vkField.SetValue(keywordVk_Obj, (int)Keys.Oem5);
    // check if its correct
    var getVal = vkField.GetValue(keywordVk_Obj); 
}

在您的 SendKeys 代码之前调用一次


0
投票

我通过使用剪贴板的解决方法解决了这个问题。

Clipboard.SetText("^");
SendKeys.SendWait("^{v}");

您将丢失剪贴板中的所有内容。通常这不是问题。

(我还发送了 & 而不是 ^)


-1
投票

根据

https://www.experts-exchange.com/questions/28994144/SendKeys-caret-sends-ampersand.html

这是本地化问题。

将键盘布局从德语布局更改为英语布局应该会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.