VB的文本框控件TextBox打开Office的Word文档

    有网友问我,VB的文本框控件TextBox能否打开Office的Word文档。VB的TextBox是Ansi版本的,通过open语句打开载入到TextBox中,肯定是乱码,没啥说的。但是,我们可以通过间接的方式打开Office的Word文档,通过一系列的API调用,将文档转换到TextBox中,而且保留了Word的版式(除字体变化以外)。请看下面程序:

    标准模块:

'标准模块
Option Explicit
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Const WM_GETTEXT As Long = &HD&
Public Const WM_SETTEXT As Long = &HC&
Private Const EM_GETLINECOUNT As Long = &HBA&
Private Const EM_GETLINE As Long = &HC4&
Public Const WM_CLOSE As Long = &H10& '关闭窗口消息

Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
'Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Public OfficeWordFileName As String 'Office Word File Name(DOC格式的)
Public WordPadHwnd As Long '写字板窗口句柄

Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
       Dim WindowCaption As String, LengthCaption As Long ', WindowClassName As String * 256
       LengthCaption = GetWindowTextLength(hWnd)
       WindowCaption = Space(LengthCaption)
       Call GetWindowText(hWnd, WindowCaption, LengthCaption + 1)
       If InStr(1, WindowCaption, OfficeWordFileName) > 0 Then
          EnumChildWindows hWnd, AddressOf EnumChildWindowsProc, ByVal 0&
          WordPadHwnd = hWnd '保存写字板句柄
          Debug.Print WordPadHwnd
          EnumWindowsProc = False
       End If
       EnumWindowsProc = True
End Function

Public Function EnumChildWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
       Dim WindowClassName As String * 256
       Dim txtLineCount As Long, i As Long, TextString As String, sText As String
       Call GetClassName(hWnd, WindowClassName, 256)
       If InStr(1, WindowClassName, "RICHEDIT50W") > 0 Then
          txtLineCount = SendMessage(hWnd, EM_GETLINECOUNT, 0, ByVal 0&) '取得Word文档的行数
          If txtLineCount > 0 Then
             For i = 0 To txtLineCount - 1
                 Dim strTXT(1024) As Byte
                 strTXT(1) = 1
                 SendMessage hWnd, EM_GETLINE, i, strTXT(0) '取得每一行内容
                 sText = StrConv(strTXT, vbUnicode)
                 sText = Left$(sText, InStr(1, sText, Chr(0)) - 1) & vbCrLf
                 TextString = TextString & sText '连接每一行
             Next
             Form1.Text1.Text = TextString
          Else
             Form1.Text1.Text = "Word文件无内容"
          End If
          EnumChildWindowsProc = False
       End If
       EnumChildWindowsProc = True
End Function



Form1窗体模块:

'窗体上放1个文本框控件Text1、1个命令按钮Command1、1个通用对话框控件CommonDialog1
Option Explicit

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE As Long = &H100000

Private Sub Command1_Click()
    Dim Fname() As String, PIDshell As Long, hProcess As Long
    ' 设置“CancelError”为 True
    CommonDialog1.CancelError = True
    On Error GoTo ErrHandler
    ' 设置标志
    CommonDialog1.Flags = cdlOFNHideReadOnly
    ' 设置过滤器
    CommonDialog1.Filter = "Office Word Files(*.doc)|*.doc|All Files(*.*)|*.*"
    ' 指定缺省的过滤器
    CommonDialog1.FilterIndex = 1
    ' 显示“打开”对话框
    CommonDialog1.ShowOpen
    '取得选定文件的名字
    OfficeWordFileName = CommonDialog1.FileName
    PIDshell = Shell("C:\Program Files\Windows NT\Accessories\wordpad.exe " & OfficeWordFileName, vbHide)
    
    hProcess = OpenProcess(SYNCHRONIZE, 0, PIDshell)
    Debug.Print "PID:"; hProcess
    If hProcess <> 0 Then
       WaitForSingleObject hProcess, 1000& '等待1秒,让shell执行完毕
       CloseHandle hProcess
    End If
    
    Fname = Split(OfficeWordFileName, "\")
    OfficeWordFileName = Fname(UBound(Fname))

    'Sleep (1000) '等待1秒,让shell执行完毕

    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
    
    Exit Sub
    
ErrHandler:
    ' 用户按了“取消”按钮
    Exit Sub
End Sub


Private Sub Form_Load()
    Command1.Caption = "打开 Office Word 文档"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    SendMessage WordPadHwnd, WM_CLOSE, 0&, ByVal 0& '关闭写字板程序
End Sub

你可能感兴趣的:(API,textbox,office,vb,function,string,文档)