.NET 3.5 Compact Framework无法识别SendKeys

时间:2014-05-14 08:52:28

标签: .net vb.net windows-mobile compact-framework sendkeys

我试过这段代码:

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。

3 个答案:

答案 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。如果你真的需要这个功能(根据我的经验,合法用途非常罕见),那么你需要手动编写代码来完成繁重的工作。

您有几个选择:

  1. 您可以P / Invoke SendInput function以及所需的数据结构,然后从您的代码中调用它。此函数将指定的输入(在这种情况下,您需要键盘输入)注入系统的输入流。毫无价值,这正是SendKeys.Send方法在框架的现代版本中使用的。

    如何声明和调用此函数的示例遍布整个Web。一个简单的搜索应该提供你需要的一切,我不需要在这里重现它。 pinvoke.net是一个很好的起点 - 有时候他们更加模糊的声明是错误的,但这种情况不太可能像SendInput这样普遍。 This answer已经为您完成了复制和粘贴,您只需要将其转换为VB.NET即可。很简单,或者有free automatic translators available

    使用该示例代码时,只需确保将DllImport位置从user32.dll(该功能位于桌面版Windows上)更改为coredll.dll(其中代码为位于移动版本上。)

  2. 在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
    
  3. 您还可以在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

最初来自herehere

答案 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