金满电器吧 关注:45贴子:1,872

如何用SendMessage发送消息

只看楼主收藏回复

如何用SendMessage发送消息


IP属地:浙江1楼2019-10-01 15:14回复
    ''以下在各种窗口操作表格里
    Function 调试(调试文本 As Variant) As Long
    On Error Resume Next
    '忽略错误继续执行VBA代码
    调试 = 其他资料.调试(调试文本)
    End Function
    Private Sub 试验_Click()
    On Error Resume Next
    '忽略错误继续执行VBA代码
    Dim 接口 As String
    Dim 命令行 As String
    Dim 类名 As String
    Dim 标题 As String
    Dim a As Long
    a = 0
    类名 = "MSO_BORDEREFFECT_WINDOW_CLASS"
    标题 = ""
    接口 = vbNullString
    调试文本 = "j级间距"
    '调试文本 = CVar(调试文本)
    a = 调试(调试文本)
    Debug.Print a
    End Sub


    IP属地:浙江2楼2019-10-01 15:15
    回复
      ''以下在''其他资料表格里
      '前期处理如下,以2013版本为例
      '先点击菜单"文件">"选项"
      '弹出"excel选项"对话框
      '点击"自定义功能区"
      '在新界面找到"自定义功能区"下的下拉框选择"所有选项卡"
      '在"主选项卡"区域里选择"开发工具"和"公式"然后点击"确定"按钮
      '创建两个表格并重命名表格一个 "其他资料"一个"用户资料"
      '注意:重命名后一定要一定要点击选项卡>"开发工具">"属性"按钮
      '在弹出"属性"对话框里将两个表格的"名称"属性分别改为 "其他资料"和"用户资料"
      '否则 过程"向区域单元格赋值"以及所有引用该过程的 以及向相应表格赋值取值的所有函数过程都会发生错误
      '定义区域名如下操作
      '首先在表格上选择相应区域
      '点击选项卡>"公式">"定义名称"按钮
      '在弹出 "新建名称"对话框里的名称后的文本框里输入相应名称
      '也可点击选项卡>"公式">"名称管理器"按钮
      '在弹出 "名称管理器"对话框里的里点击"新建"按钮即可弹出"新建名称"对话框
      '本文档定义的名称如下
      '名称"ID"引用位置是"用户资料!$A:$A"
      '即如下
      'ID=用户资料!$A:$A
      '本文件夹路径=其他资料!$5:$5
      '本文件名=其他资料!$4:$4
      '本文件盘符=其他资料!$3:$3
      '本文件完整路径=其他资料!$6:$6
      '窗口标题=其他资料!$1:$1
      '窗口类名=其他资料!$2:$2
      '用户密码=用户资料!$C:$C
      '用户名=用户资料!$B:$B
      'Dim 调试 As Object


      IP属地:浙江3楼2019-10-01 15:16
      回复
        Private Type PROCESS_INFORMATION
        hProcess As Long
        '返回新进程的句柄
        hThread As Long
        '返回主线程的句柄。
        dwProcessId As Long
        '返回一个全局进程标识符?该标识符用于标识一个进程?从进程被
        '创建到终止,该值始终有效。
        dwThreadId As Long
        '返回一个全局线程标识符?该标识符用于标识一个线程?从线程被创
        '建到终止,该值始终有效。
        End Type
        Private Type STARTUPINFO
        cb As Long
        '此类型总长度
        lpReserved As String
        '保留。必须初始化为NULL
        lpDesktop As String
        '指定桌面名字,null是与当前桌面相关联
        lpTitle As String
        '控制台窗口名称,null是可执行文件的名字将用作窗口名
        dwX As Long
        dwY As Long
        '用于设定应用程序窗口在屏幕上应该放置的位置的x和y坐标(以像素为单位)。只有当子进程用CW_USEDEFAULT作为CreateWindow的x参数来创建它的第一个重叠窗口时,
        '才使用这两个坐标。若是创建控制台窗口的应用程序,这些成员用于指明控制台窗口的左上角
        dwXSize As Long
        dwYSize As Long
        '用于设定应用程序窗口的宽度和长度(以像素为单位)
        '当子进程将CW_USEDEFAULT用作CreateWindow的nWidth参数来创建它的第一个重叠窗口时,才使用这些值。
        dwXCountChars As Long
        dwYCountChars As Long
        '用于设定子应用程序的控制台窗口的宽度和高度(以字符为单位)
        dwFillAttribute As Long
        ''用于设定子应用程序的控制台窗口使用的文本和背景颜色
        dwFlags As Long
        '使用标志及含义
        wShowWindow As Integer
        '用于设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。
        cbReserved2 As Integer
        '保留。必须被初始化为0
        lpReserved2 As Long
        '保留。必须被初始化为NULL
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
        '用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,hStdInput用于标识键盘缓存,hStdOutput和hStdError用于标识控制台窗口的缓存
        End Type
        Private Type SECURITY_ATTRIBUTES
        nLength As Long
        '本类型长度
        lpSecurityDescriptor As Long
        '指向控制其共享的对象的安全描述符的指针,0为默认
        bInheritHandle As Long
        '1进程属性可以被以后线程进程继承,0不能
        End Type
        Private Const STARTF_USESTDHANDLES As Long = &H100&
        Private Const STARTF_USESHOWWINDOW As Long = &H1&
        Private Const INFINITE As Long = &HFFFF&
        Enum enPriority_Class
        NORMAL_PRIORITY_CLASS = &H20
        IDLE_PRIORITY_CLASS = &H40
        HIGH_PRIORITY_CLASS = &H80
        End Enum
        Enum enSW
        SW_HIDE = 0
        SW_NORMAL = 1
        SW_MAXIMIZE = 3
        SW_MINIMIZE = 6
        End Enum
        '以上是进程函数变量


        IP属地:浙江4楼2019-10-01 15:17
        回复
          Dim 主线程句柄 As Long
          Dim 主线程ID As Long
          Dim 进程句柄 As Long
          Dim 进程ID As Long
          '以上是进程变量


          IP属地:浙江5楼2019-10-01 15:17
          回复
            Dim 调试命令 As String
            '以上是调试用变量
            Dim EXCEL运行状态 As String
            Dim EXCEL运行状态值 As String
            Dim EXCEL进程数 As String
            '以上是EXCEL 多进程专用变量


            IP属地:浙江6楼2019-10-01 15:18
            回复
              Dim 桌面句柄 As Long
              Dim 主窗口句柄 As Long
              Dim 主操作窗口句柄 As Long
              Dim ie父窗口句柄, ie子窗口句柄, ie实际窗口句柄 As Long
              Dim 窗口标题 As String
              Dim 窗口类名 As String
              Dim 用户名 As String
              Dim 用户密码 As String
              '以上是句柄所用变量


              IP属地:浙江7楼2019-10-01 15:18
              回复
                Dim ie As Object
                Dim 操作对象 As Object
                Dim 网址 As String
                '以上是浏览器所用变量


                IP属地:浙江8楼2019-10-01 15:18
                回复
                  Dim 操作Excel As Object
                  Dim excel文件名 As String
                  '以上是Excel所用变量


                  IP属地:浙江9楼2019-10-01 15:19
                  回复
                    Const WM_SETTEXT As Long = &HC
                    '以上为创建进程的变量


                    IP属地:浙江10楼2019-10-01 15:19
                    回复
                      #If Win64 Then
                      '这是64位的API声明
                      Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
                      '查找窗口并返回窗口句柄
                      Private Declare PtrSafe Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
                      '创建新进程
                      Private Declare PtrSafe Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
                      '创建匿名读写管道句柄Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
                      Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
                      '查找子窗口
                      Public Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long
                      '桌面句柄
                      Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
                      '获得进程线程ID
                      Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Variant) As Long
                      #Else
                      '这是32位的API声明
                      Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
                      '查找窗口并返回窗口句柄
                      Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
                      '创建新进程
                      Private Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
                      '创建匿名读写管道句柄
                      Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
                      '查找子窗口
                      Private Declare Function GetDesktopWindow Lib "user32" () As Long
                      '桌面句柄
                      Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
                      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Variant) As Long
                      #End If


                      IP属地:浙江11楼2019-10-01 15:20
                      回复
                        Function 调试(调试文本 As Variant) As Long
                        On Error Resume Next
                        '忽略错误继续执行VBA代码
                        '调试窗口.显示网页元素.GoHome
                        '创建进程并绑定主窗口句柄
                        Dim 类名 As String
                        Dim 标题 As String
                        Dim 命令 As String
                        命令 = "Notepad"
                        类名 = "Notepad"
                        标题 = vbNullString
                        调试 = 创建进程并绑定主窗口句柄(命令, 类名, 标题)
                        类名 = "Edit"
                        主操作窗口句柄 = FindWindowEx(主窗口句柄, 0, 类名, 标题)
                        Debug.Print "桌面句柄=" & 桌面句柄
                        Debug.Print "主窗口句柄=" & 主窗口句柄
                        Debug.Print "主操作窗口句柄=" & 主操作窗口句柄
                        调试 = 主操作窗口句柄
                        调试 = SendMessage(主操作窗口句柄, WM_SETTEXT, 0&, 调试文本)
                        End Function


                        IP属地:浙江12楼2019-10-01 15:20
                        回复
                          Function 创建进程并绑定主窗口句柄(命令 As Variant, Optional 窗口类名 As String, Optional 窗口标题 As String, Optional 延时 As String) As Long
                          Dim 执行模块 As String
                          执行模块 = vbNullString
                          Dim 局部主窗口句柄 As Long
                          Dim 判断窗口 As Long
                          Dim 查找次数 As Long
                          If 延时 = "" Then
                          延时 = "0:00:01"
                          延时 = TimeValue(延时)
                          '默认为一秒
                          Else
                          延时 = TimeValue(TimeValue("0:00:00") + TimeValue(延时))
                          End If
                          重新建立新进程:
                          进程句柄局部 = 创建进程并返回进程句柄公共接口(执行模块, 命令)
                          查找次数 = 0
                          桌面句柄 = GetDesktopWindow()
                          Debug.Print "桌面句柄 = " & 桌面句柄
                          '暂停
                          局部主窗口句柄 = 0
                          Application.Wait (Now + TimeValue(延时))
                          重新查找主窗口句柄创建进程并绑定主窗口句柄:
                          '暂停1秒
                          Application.Wait (Now + TimeValue("0:00:01"))
                          局部主窗口句柄 = FindWindowEx(桌面句柄, 局部主窗口句柄, 窗口类名, 窗口标题)
                          Debug.Print 局部主窗口句柄
                          If (局部主窗口句柄 = 0) And (查找次数 < 5) Then
                          '如果找不到
                          If 进程句柄 <> 0 Then
                          查找次数 = 查找次数 + 1
                          GoTo 重新查找主窗口句柄创建进程并绑定主窗口句柄
                          '跳到开头重新查找
                          Else
                          GoTo 退出创建进程并绑定主窗口句柄
                          End If
                          GoTo 退出创建进程并绑定主窗口句柄
                          '这其实不需要,但避免意外也放进去
                          Else
                          查找次数 = 查找次数 + 1
                          '此处重点
                          判断窗口句柄 = GetWindowThreadProcessId(局部主窗口句柄, 返回)
                          Debug.Print "局部主窗口句柄=" & 局部主窗口句柄 & "他的进程ID=" & 返回
                          Debug.Print "新进程ID=" & 进程ID
                          If 返回 <> 进程ID Then
                          Debug.Print "没找到,重来"
                          If (局部主窗口句柄 = 0) And (查找次数 <> 0) Then
                          GoTo 重新建立新进程
                          Else
                          End If
                          GoTo 重新查找主窗口句柄创建进程并绑定主窗口句柄
                          End If
                          End If
                          创建进程并绑定主窗口句柄 = 局部主窗口句柄
                          GoTo 创建进程并绑定主窗口句柄最后
                          退出创建进程并绑定主窗口句柄:
                          创建进程并绑定主窗口句柄 = 0
                          Debug.Print "找不到"
                          Exit Function
                          '退出这个函数
                          创建进程并绑定主窗口句柄最后:
                          创建进程并绑定主窗口句柄 = 局部主窗口句柄
                          主窗口句柄 = 创建进程并绑定主窗口句柄
                          Debug.Print "局部主窗口句柄 =" & 主窗口句柄
                          主操作窗口句柄 = 主窗口句柄
                          Debug.Print "主操作窗口句柄 =" & 主操作窗口句柄
                          End Function


                          IP属地:浙江13楼2019-10-01 15:20
                          回复
                            Function 创建进程并返回进程句柄公共接口(ByVal 执行模块 As String, ByVal 命令 As String) As Long
                            On Error Resume Next
                            ''忽略错误继续执行VBA代码
                            Dim 进程属性 As SECURITY_ATTRIBUTES
                            Dim 线程属性 As SECURITY_ATTRIBUTES
                            Dim 成功否 As Long
                            Dim 进程读句柄 As Long
                            Dim 进程写句柄 As Long
                            Dim 线程读句柄 As Long
                            Dim 线程写句柄 As Long
                            Dim 新进程是否继承句柄 As Long
                            Dim 进程附加标志 As Long
                            Dim 进程环境设置 As Variant
                            Dim 工作绝对路径 As String
                            Dim 主窗口特性 As STARTUPINFO
                            Dim 返回进程信息 As PROCESS_INFORMATION
                            With 进程属性
                            .bInheritHandle = 1
                            '1进程属性可以被以后进程继承,0不能
                            .lpSecurityDescriptor = 0
                            '指向控制其共享的对象的安全描述符的指针,0为默认
                            .nLength = Len(进程属性)
                            '本类型长度
                            End With
                            '以上是进程属性
                            成功否 = CreatePipe(进程读句柄, 进程写句柄, 进程属性, 0&)
                            If 成功否 = 0 Then
                            Debug.Print "创建匿名管道失败"
                            创建进程并返回进程句柄公共接口 = 0&
                            Exit Function
                            End If
                            With 线程属性
                            .bInheritHandle = 1
                            '1线程属性可以被以后线程继承,0不能
                            .lpSecurityDescriptor = 0
                            '指向控制其共享的对象的安全描述符的指针,0为默认
                            .nLength = Len(线程属性)
                            '本类型长度
                            End With
                            '以上是线程属性
                            成功否 = CreatePipe(线程读句柄, 线程写句柄, 进程属性, 0&)
                            If 成功否 = 0 Then
                            Debug.Print "创建匿名管道失败"
                            创建进程并返回进程句柄公共接口 = 0&
                            Exit Function
                            End If
                            新进程是否继承句柄 = 0&
                            '1为继承句柄,0不能
                            '进程优先级:这个进程没有特殊的任务调度要求
                            进程环境设置 = 0&
                            '新进程使用调用进程的环境
                            With 主窗口特性
                            .cb = 68
                            .dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
                            'Or 256
                            '使用标志及含义
                            .wShowWindow = 1
                            '用于设定如果子应用程序初次调用的ShowWindow将SW_SHOWDEFAULT作为nCmdShow参数传递时,该应用程序的第一个重叠窗口应该如何出现。
                            '.hStdInput = 进程读句柄
                            .hStdOutput = 进程写句柄
                            '用于设定供控制台输入和输出用的缓存的句柄。按照默认设置,hStdInput用于标识键盘缓存,hStdOutput和hStdError用于标识控制台窗口的缓存
                            End With
                            进程附加标志 = 32&
                            'Or CREATE_DEFAULT_ERROR_MODE
                            工作绝对路径 = vbNullString
                            '新进程将使用与调用进程相同的驱动器和目录
                            创建进程并返回进程句柄公共接口 = 创建进程并返回进程句柄完整(执行模块, 命令, 进程属性, 线程属性, 新进程是否继承句柄, 进程附加标志, 进程环境设置, 工作绝对路径, 主窗口特性, 返回进程信息)
                            Debug.Print " 创建进程并返回进程句柄= " & 创建进程并返回进程句柄公共接口
                            End Function


                            IP属地:浙江14楼2019-10-01 15:21
                            回复
                              Private Function 创建进程并返回进程句柄完整(ByVal 执行模块 As String, ByVal 命令 As String, 进程属性 As SECURITY_ATTRIBUTES, 线程属性 As SECURITY_ATTRIBUTES, ByVal 新进程是否继承句柄 As Long, ByVal 进程附加标志 As Long, 进程环境设置 As Variant, ByVal 工作绝对路径 As String, 主窗口特性 As STARTUPINFO, 返回进程信息 As PROCESS_INFORMATION) As Long
                              On Error Resume Next
                              '忽略错误继续执行VBA代码
                              命令 = 命令 & vbNullChar
                              '在字符串后面加NULL
                              创建进程并返回进程句柄完整 = CreateProcess(执行模块, 命令, 进程属性, 线程属性, 1&, 进程附加标志, ByVal 0&, 工作绝对路径, 主窗口特性, 返回进程信息)
                              进程句柄 = 返回进程信息.hProcess
                              Debug.Print "进程句柄 = " & 进程句柄
                              进程ID = 返回进程信息.dwProcessId
                              Debug.Print "进程ID = " & 进程ID
                              主线程句柄 = 返回进程信息.hThread
                              Debug.Print "主线程句柄 = " & 主线程句柄
                              主线程ID = 返回进程信息.dwThreadId
                              Debug.Print "主线程ID = " & 主线程ID
                              创建进程并返回进程句柄完整 = 进程句柄
                              Debug.Print " 创建进程并返回句柄= " & 创建进程并返回进程句柄完整
                              End Function


                              IP属地:浙江15楼2019-10-01 15:21
                              回复