VB.Net:向远程桌面应用程序发送虚拟击键

VB.Net:向远程桌面应用程序发送虚拟击键,vb.net,Vb.net,我正在尝试使用VB.net和MS Visual Studio构建一个屏幕数字键盘。我有一个工作原型,它在我的本地机器上工作得很好,除了在Windows RDC应用程序中将击键发送到活动窗体时。我尝试过使用SendKeys()和keybd_事件的解决方案,这两种方法都遇到了相同的障碍。到目前为止,我的研究表明,虽然SendKeys有一些限制,但SendMessage和SendInput API在与正确的键盘扫描代码一起使用时,都应该与Windows RDP应用程序配合使用;然而,我在代码中实现这些

我正在尝试使用VB.net和MS Visual Studio构建一个屏幕数字键盘。我有一个工作原型,它在我的本地机器上工作得很好,除了在Windows RDC应用程序中将击键发送到活动窗体时。我尝试过使用SendKeys()和keybd_事件的解决方案,这两种方法都遇到了相同的障碍。到目前为止,我的研究表明,虽然SendKeys有一些限制,但SendMessage和SendInput API在与正确的键盘扫描代码一起使用时,都应该与Windows RDP应用程序配合使用;然而,我在代码中实现这些API时失败了,我已经搜索了很多工作示例代码,但到目前为止都没有成功

请提供一些示例代码,概述如何在VB.Net/Visual Studio中实现这些API函数

下面我提供了一些示例代码,这些代码适用于主机PC上的大多数应用程序,但不适用于Windows RDC软件

声明十六进制变量

防止屏幕键盘窃取焦点

从“user32”导入keybd_事件函数

单击标签时向窗口/窗体发送关键事件


我最近有一个项目需要做同样的事情,并且在图书馆取得了成功。简单到包含它并使用如下方法:
Keyboard.KeyPress(Keys.C)
。在其他方法失败的情况下,通过RDP似乎可以正常工作。@如果项目不是绝密应用程序,您是否可以共享该项目的代码?
Private Const WM_NCLBUTTONDOWN As Int32 = &HA1
Private Const WM_NCMOUSEMOVE As Int32 = &HA0
Private Const WS_EX_NOACTIVATE As Int32 = &H8000000
Private Const KEYEVENTF_KEYDOWN As Integer = &H0
Private Const KEYEVENTF_KEYUP As Integer = &H2 
Private Const VK_SPACE As Integer = &H20
Private Const WM_KEYDOWN As Int32 = &H100
Private Const WM_KEYUP As Int32 = &H101
Private Const WM_CHAR = &H102
Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or CInt(Fix(WS_EX_NOACTIVATE))
        Return cp
    End Get
End Property

Dim previousForegroundWindow As IntPtr
Protected Overrides Sub WndProc(ByRef m As Message)

    Dim foregroundWindow As IntPtr
    Select Case m.Msg
        Case WM_NCLBUTTONDOWN

            foregroundWindow = GetForegroundWindow()

            If foregroundWindow = Me.Handle Then
                SetForegroundWindow(Me.Handle)

                If foregroundWindow = IntPtr.Zero Then
                    previousForegroundWindow = foregroundWindow
                End If
            End If

        Case WM_NCMOUSEMOVE

            If IsWindow(previousForegroundWindow) Then
                SetForegroundWindow(previousForegroundWindow)
            End If

        Case Else
    End Select

    MyBase.WndProc(m)
End Sub
Declare Function keybd_event Lib "user32" Alias "keybd_event" _
    (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer,
     ByVal dwExtraInfo As Integer) As Integer 
Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As   System.EventArgs) Handles Label1.Click
    ''Key 7
    keybd_event(Keys.D7, 0, KEYEVENTF_KEYDOWN, 0)
    keybd_event(Keys.D7, 0, KEYEVENTF_KEYUP, 0)