我试过这段代码:
Imports System.Windows.Forms
Public Class Form1
Private Sub TextBox2_KeyDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
If (e.KeyCode = System.Windows.Forms.Keys.Down) Then
SendKeys("{tab}")
End If
End Sub
End Class
它表示“未声明SendKeys”。
我尝试添加Imports System.Windows.Forms.SendKeys
,但它说无法找到。
当我在互联网上搜索时,每个人都建议这样做。那么为什么它对我不起作用呢?我在Windows 7 Professional上使用.NET 3.5 Compact Framework,目标平台是Windows Mobile 6 Professional SDK。
答案 0 :(得分:3)
你的代码不正确,正如阿巴斯在答案中已经指出的那样。您必须调用SendKeys
类的共享Send
method,如下所示:
Imports System.Windows.Forms
Public Class Form1
Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles TextBox2.KeyDown
If (e.KeyCode = System.Windows.Forms.Keys.Down) Then
SendKeys.Send("{tab}")
End If
End Sub
End Class
但这仍然无法解决您的问题,因为Compact Framework中没有SendKeys
。如果你真的需要这个功能(根据我的经验,合法用途非常罕见),那么你需要手动编写代码来完成繁重的工作。
您有几个选择:
您可以P / Invoke SendInput
function以及所需的数据结构,然后从您的代码中调用它。此函数将指定的输入(在这种情况下,您需要键盘输入)注入系统的输入流。毫无价值,这正是SendKeys.Send
方法在框架的现代版本中使用的。
如何声明和调用此函数的示例遍布整个Web。一个简单的搜索应该提供你需要的一切,我不需要在这里重现它。 pinvoke.net是一个很好的起点 - 有时候他们更加模糊的声明是错误的,但这种情况不太可能像SendInput
这样普遍。 This answer已经为您完成了复制和粘贴,您只需要将其转换为VB.NET即可。很简单,或者有free automatic translators available。
使用该示例代码时,只需确保将DllImport
位置从user32.dll
(该功能位于桌面版Windows上)更改为coredll.dll
(其中代码为位于移动版本上。)
在Windows CE中,您还可以以类似的方式使用P / Invoked PostKeybdMessage
function。这可能比SendInput
更容易申报和使用,但它可以做的更有限。它将键盘消息直接发布到指定的窗口,而不是将它们添加到系统输入流。但是,在大多数情况下,这正是您想要的。
<DllImport("coredll.dll", SetLastError := True)> _
Shared Function PostKeybdMessage(ByVal hWnd As IntPtr, _
ByVal vKey As UInteger, _
ByVal flags As UInteger, _
ByVal cCharacters As UInteger, _
ByVal pShiftStateBuffer As UInteger(), _
ByVal pCharacterBuffer As UInteger()) As Boolean
End Function
您还可以在P / Invoke various places online找到建议keybd_event
function。
抵制诱惑 - 正如链接的官方文件所示,它已经过时并已被SendInput
取代。 keybd_event
的简单性看起来很吸引人,但它会让你陷入困境。无法测试错误是一个主要缺点。任何人必须使用keybd_event
的最后一次是在Windows 95上。
答案 1 :(得分:1)
下面是一些调用keybd_event的代码:
Imports System.Runtime.InteropServices
...
Public Class SystemCalls
' See more at http://msdn2.microsoft.com/en-us/library/ms927178.aspx
Public Const VK_NONAME As Byte = &HFC ' Do nothing
Public Const VK_ESC As Byte = &H1B ' Smartphone back-button
Public Const VK_F4 As Byte = &H73 ' Home Screen
Public Const VK_APP6 As Byte = &HC6 ' Lock the keys on Smartphone
Public Const VK_F22 As Byte = &H85 ' Lock the keys on PocketPC (VK_KEYLOCK)
Public Const VK_F16 As Byte = &H7F ' Toggle Speakerphone
Public Const VK_OFF As Byte = &HDF ' Power button
''' <summary>
''' Puts `key` into to global keyboard buffer
''' </summary>
''' <param name="key"></param>
Public Sub SendKey(ByVal key As Byte)
Const KEYEVENTF_KEYUP As Integer = &H2
Const KEYEVENTF_KEYDOWN As Integer = &H0
keybd_event(key, 0, KEYEVENTF_KEYDOWN, 0)
keybd_event(key, 0, KEYEVENTF_KEYUP, 0)
End Sub
<DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, _
CharSet:=CharSet.Unicode, EntryPoint:="keybd_event", _
ExactSpelling:=True, SetLastError:=True)>
Private Shared Function keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
End Function
答案 2 :(得分:0)
如果我没弄错,你应该使用SendKeys.Send方法。示例(来自MSDN):
Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.DoubleClick
' Send the enter key; since the tab stop of Button1 is 0, this
' will trigger the click event.
SendKeys.Send("{ENTER}")
End Sub