You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.Net如何使用SendMessage而非SendKeys向其他应用发送按键消息

问题修复说明
  • 错误1:SendMessage声明冲突。定义了两个重载的SendMessage,其中带String类型lParam的重载多余,且UInt32类型重载错误指定了SendMessageA别名,和Auto修饰符冲突,会导致调用时重载匹配错误、编码不匹配。
  • 错误2:混淆虚拟键码与扫描码。代码中直接把S键的虚拟键码&H53填入lParam的扫描码位,实际上扫描码需要通过MapVirtualKey接口从虚拟键码转换得到,这是代码不生效的核心原因。
  • 错误3:缺少子控件句柄校验。仅判断了记事本进程是否存在,没有校验FindWindowEx拿到的Edit编辑区句柄是否有效,若获取子句柄失败,发消息自然无响应。

修正后完整代码

Public Class Form2
    ' 修正API声明,移除冲突重载,新增扫描码转换函数声明
    Declare Auto Function FindWindowEx Lib "user32" (ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As UInt32) As Integer
    Declare Auto Function MapVirtualKey Lib "user32.dll" (ByVal uCode As UInteger, ByVal uMapType As UInteger) As UInteger

    Private Sub SendMessageToNotepad()
        Dim lParamDown1, lParamUp1 As UInt32
        Dim repeatCount As UInt32 = 1, scanCode As UInt32 = 0, extended As UInt32 = 0, context As UInt32 = 0,
            previousState As UInt32 = 0, transition As UInt32 = 0
        Const VK_S As UInteger = &H53
        ' 转换虚拟键码为对应扫描码
        scanCode = MapVirtualKey(VK_S, 0)

        ' 构造按键按下lParam参数
        lParamDown1 = repeatCount Or (scanCode << 16) Or (extended << 24) Or (context << 29) Or (previousState << 30) Or (transition << 31)
        ' 构造按键抬起lParam参数
        transition = 1
        previousState = 1
        lParamUp1 = repeatCount Or (scanCode << 16) Or (extended << 24) Or (context << 29) Or (previousState << 30) Or (transition << 31)

        Dim notepads() As Process = Process.GetProcessesByName("notepad")
        If notepads.Length = 0 Then
            Return
        End If
        Dim child As IntPtr = FindWindowEx(notepads(0).MainWindowHandle, New IntPtr(0), "Edit", Nothing)
        ' 新增编辑区句柄有效性校验
        If child <> IntPtr.Zero Then
            ' 发送按键按下消息 WM_KEYDOWN = 0x100
            SendMessage(child, &H100, VK_S, lParamDown1)
            ' 发送按键抬起消息 WM_KEYUP = 0x101
            SendMessage(child, &H101, VK_S, lParamUp1)
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SendMessageToNotepad()
    End Sub
End Class

内容的提问来源于stack exchange,提问作者user1482264

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:09:03