模拟按键时必须为 keycode 和 keychar 指定什么vb.net 或 c# with dotnetbrowser

问题描述

(我问的是 vb 示例,但同样适用于 c#,答案是相同的。)

我正在尝试使用 dotnetbrowser 填写表单,但在我想“按下”特殊键(如“向下箭头”、“tab”、“进入”。例如,“KeyCode Enumeration”表列出了“tab (9)”、“return (13)”、“向下箭头 (40)”、“A (65)”。因此,要键入 AI 需要执行以下操作:

SimulateKey(keyboard,65,"A")

或者,只是写得不同,

SimulateKey(keyboard,chr(65))

这适用于“A”,并且

SimulateKey(keyboard,97,chr(97))

适用于“a”,虽然我不明白为什么,因为 97 是“Numpad1”的键码。

但是当我想键入 tab-return-down-A 时,我应该为特殊字符指定 keychar 什么?

SimulateKey(keyboard,9,chr(9))
SimulateKey(keyboard,13,chr(13))
SimulateKey(keyboard,40,chr(40))   'where chr(40) is actually an opening parantheses "("
SimulateKey(keyboard,chr(65))

或者是 keychar 为空或空格用于特殊字符,例如

SimulateKey(keyboard,"") 'nothing between the qoutes
SimulateKey(keyboard," ") 'space-character (asc 32) between the quotes

当我真的想输入一个开放的括号“(”,它是 asc 40 - 因此具有与 down 相同的代码时,我需要指定什么?我希望对 keycode 和 keychar 值进行全面解释。

为了完整起见,这是我用于 SimulateKey 的代码(来自 vb dotnetbrowser examplehere for c#

Private Shared Sub SimulateKey(keyboard As IKeyboard,key As KeyCode,keyChar As String,Optional ByVal modifiers As KeyModifiers = nothing)
    modifiers = If(modifiers,New KeyModifiers())
    Dim keypressedEventArgs = New KeypressedEventArgs With {
            .KeyChar = keyChar,.VirtualKey = key,.Modifiers = modifiers
            }

    Dim keyTypedEventArgs = New KeyTypedEventArgs With {
            .KeyChar = keyChar,.Modifiers = modifiers
            }
    Dim keyreleasedEventArgs = New keyreleasedEventArgs With {
            .VirtualKey = key,.Modifiers = modifiers
            }

    keyboard.Keypressed.Raise(keypressedEventArgs)
    keyboard.KeyTyped.Raise(keyTypedEventArgs)
    keyboard.keyreleased.Raise(keyreleasedEventArgs)
End Sub

解决方法

键码为 Windows 虚拟键码,列于 here

这些代码代表键盘上的物理键,而不是字符。区分使用相同密钥的两个字符(例如 Aa,或 9) ,您将需要其他信息,例如按下该键时是否按下了 shift 键和/或大写锁定。事实上,这就是 KeyChar 是如何从键代码计算出的键盘事件。另一方面,KeyChar 无法区分普通数字键和小键盘数字键,并且某些键(如功能键)没有任何关联字符,因此检测这些键的唯一方法是通过关键代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...