我试图发送期间"。"使用SendKeys.Send和SendKeys.SendWait方法的字符(以及"。"和" {。}"表单),它似乎不起作用(即应用程序挂起)
我在使用" dot"时遇到了麻烦。字符,因为其他符号没有问题发送。
我也尝试传递Keys.OemPeriod枚举值,但我得到的是发送其字符串表示" OemPeriod"或者数值188,取决于我使用的方法(强制转换或ToString),因为Send / SendWait只接受一个字符串值。
PS如果您想知道,我正在实现类似Excel的行为,即使用IMessageFilter对象将Keys.Decimal(小键盘句点)值转换为当前小数点分隔符。
修改 经过一些测试后,我发现如果在" Del"上使用逗号的键盘布局,它会起作用。小键盘的按钮设置。 发送"。"时似乎发生了冲突。它既是Keys.OemPeriod又是Keys.Decimal,但我需要区分它们以实现一致的行为。
EDIT2
以下是我的过滤器原型的一些示例代码
Public Class DecimalKeyFilter
Implements IMessageFilter
Private Const WM_KEYDOWN As Integer = &H100
Public Function PreFilterMessage(ByRef m As Message) As Boolean _
Implements IMessageFilter.PreFilterMessage
If (m.Msg <> WM_KEYDOWN) Then Return False
Dim key As Keys = DirectCast(m.WParam.ToInt32() And Keys.KeyCode, Keys)
If (key <> Keys.Decimal) Then Return False
Dim separator As String = CurrentCulture.NumberFormat.NumberDecimalSeparator
SendKeys.Send(separator)
Return True
End Function
End Class
EDIT3
为了完整起见,我通过调用本地SendInput
函数解决了这个问题,该函数似乎是SendKeys
底层Win32 API,并且直接在{{1}接受虚拟密钥代码格式。
当我发送映射到多个虚拟密钥的字符串表示时,我发现冲突正在发生,这会使SendKeys成为一个非常糟糕的API。
无论如何,这只是我的假设,所以对此行为的任何进一步解释都是受欢迎的