【问题标题】:Key strokes to enter chars in text boxes?在文本框中输入字符的击键?
【发布时间】:2014-08-23 01:19:04
【问题描述】:

我如何以编程方式知道是否需要在按住 Alt GrShift 的文本框中输入像 '@' 这样的字符?

这是 Alt Gr 的列表:² ³ { [ ] } \ @ € ~ | µ
还有一个更长的 Shift 列表:°!"§$%&/()=?*'>;:_、字母等等

Char.IsUpper(...) 帮我写信。但是我该如何解决这个问题呢?我希望能够正确地检查它们,如果可能的话,我想让系统为我做。

最后我将通过keybd_event 发送这些击键。
(我使用 WinForms。)

【问题讨论】:

  • @KajalSinha 我使用 WinForms。不知道为什么这可能很重要。
  • 模拟键盘输入来自动化 UI 从来都不是一个错误。如果您希望获得可靠的解决方案,请使用 UI Automation
  • 在一般情况下使用键显然不能工作,因为大多数字符甚至在大多数键盘布局上都不可用。比如遇到ü但是键盘布局是美式的怎么办?如果输入需要死键怎么办?如果你真的需要使用按键,ALT+Number 是我唯一能想到的,但我不确定是否可以在代码 >255 的情况下使用它。
  • 您的问题:“如何以编程方式在文本框中输入文本?” - 答案:“使用 UI 自动化。” - 您的回答:“答案是错误的,请支持我的问题,因为,好吧,你会看到我什么时候有时间完整地披露问题。”
  • @IInspectable “我如何以编程方式在文本框中输入文本?”不是我的问题。

标签: c# .net winapi char


【解决方案1】:

我想通了。 VkKeyScan 是关键。
VkKeyScanEx 用于键盘布局等)

一些测试代码:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern short VkKeyScan(char ch);

static void Main(string[] args)
{
    char[] chars = "²³{[]}\\@€~|µ   °!`\"§$%&/()=?*'>;:_".ToCharArray();
    Console.WriteLine("char\talt\tcontrol\tshift" + Environment.NewLine + "-----------------------------");

    for (int i = 0; i < chars.Length; i++)
    {
        char ch = chars[i];
        short vksc = VkKeyScan(ch);

        bool alt = (vksc & 1024) == 1024;
        bool control = (vksc & 512) == 512;
        bool shift = (vksc & 256) == 256;

        Console.WriteLine(ch + "\t" + alt + "\t" + control + "\t" + shift);
    }

    Console.ReadKey();
}

【讨论】:

  • 如果该字符没有密钥,则具有vksc == -1。所以它只适用于一小部分字符。
  • 这甚至不适用于键盘布局支持的所有字符。例如,我可以输入ü,方法是输入¨ 作为死键,然后输入u。亚洲键盘布局完全失败了。
  • @CodesInChaos 它可以满足我的需求。适用于我面前的键盘。当我需要弄清楚键盘布局时,我会研究它。在这一点上,我不关心键盘布局。我问的时候也没有。
  • 虽然您提出了这个问题,但它现在归 Stack Overflow 所有。这意味着,尽管您不在乎您的解决方案有多么老套,但我们却在乎。为了未来读者的利益,@CodeInChaos 正在解释此答案所支持的方法的局限性。没关系。你有你想要的,未来的读者会很清楚地判断这个答案是否对他们有用。
【解决方案2】:

您可以使用以下方法找到键修饰符

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
    //control key 
}

if ((Control.ModifierKeys & Keys.Shift) == Keys.Alt)
{
    //Alt
}

来源链接

Determine Which Modifier Key Was Pressed

Modifier Key Details

【讨论】:

  • 这两个 if 块看起来和我一模一样。我错过了什么吗?
  • -1 这不能回答问题。问题是关于如何将字符映射到键或者如何模拟字符的输入。这个答案是关于检测按键。
  • 第一个版本有两个相同的if 语句。所以你更新了代码并确保第二个if 语句的表达式永远不是true。考虑到第一个if 子句中的注释也是错误的,我们可以得出结论,现在,经过您的编辑,一切都是错误的。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多