http://www.csdn.net/expert/topic/566/566738.xml

解决方案 »

  1.   

    你试一下这个:
    Option ExplicitPrivate Const pcWarning As String = _
      "    这个例子是在2000下试用的,使用前将" & _
      "System32下的Cmd.exe拷为D:\MyCMD.exe" & _
      "即可。如果是在NT下使用,方法同2000;如" & _
      "果是Win9X,请先将Windows目录下的" & _
      "Command.com拷为D:\MyCMD.com,然后将" & _
      "winName定义由D:\MyCMD.exe改为D:\MyCMD.com!"'=======================================
    '发送消息的主函数
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    '用于得到进程的句柄
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    '======================================='=======================================
    '消息常量定义
    Private Const WM_QUIT = &H12 '退出
    Private Const WM_CLOSE = &H10 '退出
    Private Const WM_SETTEXT = &HC '字串发送, 主要用于32位进程,例如可对Notepad.exe发送字符串
    Private Const WM_CHAR = &H102 '单键发送,模拟Keyboard
    '======================================='DOS进程执行字串定义,当然也可动态生成
    Private Const MyCmd As String = "D:" & vbCrLf & "cd\" & vbCrLf
    'DOS进程的类名
    Private Const clsName As String = "ConsoleWindowClass"
    'DOS进程的窗口名,为了防止取得错误的进程句柄,强烈建议COPY出
    '操作系统的CMD.exe(Win2000),COMMAND(Other OS)到一个专用目录
    '例:D:\MyCMD.exe
    Private Const winName As String = "D:\MyCMD.exe"
    'DOS进程专用,临时量
    Private pc_MyCMD(100) As Byte'DOS进程的窗口句柄
    Dim g_hWnd As LongPrivate Sub cmdOpen_Click()
      
      Dim strComm As String
      
      g_hWnd = 0
      strComm = winName
      
      'Shell方法的返回值为进程ID,实际意义不大
      '另外,为了演示,我将DOS进程显示出来(vbMaximizedFocus)
      If Shell(strComm, vbMaximizedFocus) = 0 Then
        MsgBox "Run shell " & strComm & "error!"
      End If
      
    End SubPrivate Sub cmdSend_Click()
      
      '得到窗口句柄
      If g_hWnd = 0 Then
        g_hWnd = FindWindow(clsName, winName)
      End If
        
      '如果窗口句柄有效,发送键盘消息
      If g_hWnd <> 0 Then
        Dim I As Integer
        For I = 0 To UBound(pc_MyCMD)
          If pc_MyCMD(I) <> 0 Then
            SendMessage g_hWnd, WM_CHAR, pc_MyCMD(I), 0
          End If
        Next
      End If
      
    End SubPrivate Sub cmdClose_Click()
      
      '得到窗口句柄
      If g_hWnd = 0 Then
        g_hWnd = FindWindow(clsName, winName)
      End If
      
      '如果窗口句柄有效,发送退出消息
      If g_hWnd <> 0 Then
        SendMessage g_hWnd, WM_CLOSE, 0, 0
      End If
      
    End SubPrivate Sub Form_Load()
      
      '窗口句柄初始化
      g_hWnd = 0
      
      lblWarning.Caption = pcWarning
      
      Dim I As Long
      For I = 0 To Len(MyCmd) - 1
        pc_MyCMD(I) = Asc(Mid(MyCmd, I + 1, 1))
      Next
      
    End Sub