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