Const  SYNCHRONIZE  =  &  H100000
  Const  INFINITE  =  &  HFFFFFFFF
  
  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  CloseHandle  Lib  "kernel32"  (ByVal  hObject  As  Long)  As  Long
  Private  Declare  Function  WaitForSingleObject  Lib  "kernel32"  (ByVal  hHandle  As  Long,  ByVal  dwMilliseconds  As  Long)  As  Long
  Private  Declare  Function  TerminateProcess  Lib  "kernel32"  (ByVal  hProcess  As  Long,  ByVal  uExitCode  As  Long)  As  Long
  
  '  分别声明  Process  ID  及  Process  Handle  变数
  Dim  pId  As  Long,  pHnd  As  Long
  Dim  Flag  As  Boolean
  
  Private  Sub  Command1_Click()
  If  Flag  =  True  Then
  '  TerminateProcess  所传入的是  Process  Handle
  Call  TerminateProcess(pHnd,  0)
  Call  CloseHandle(pHnd)
  Flag  =  False
  Else
  Flag  =  True
  End  If
  '  Shell传回Process  ID,运行的程序是CALC.EXE
  pId  =  Shell("CALC.EXE",  1)
  '  取得  Process  Handle
  pHnd  =  OpenProcess(SYNCHRONIZE,  0,  pId)
  End  Sub

解决方案 »

  1.   

    把pId = Shell("CALC.EXE", 1) 
    改为pId = Shell("ARJ.exe", 1) 
      

  2.   

    http://www.csdn.net/expert/topic/543/543717.xml?temp=.830517
    主  题:  用ShellExecute调用计算器程序,如何只让它启动一次? 是不是要达到这个要求??
      

  3.   

    这个例子没用。calc时GUI程序。他说的这种情况只发生在调用DOS程序时。
    用Shell "Command.com arj.exe"行不行?
      

  4.   

    shell "Command.com /c arj.exe"/c的作用就是执行命令后自动退出command.com
      

  5.   

    我刚刚试过了,用xxlroad(土八路)的代码和我的一样,同样不能自动关闭DOS窗口,我想问问fuxc,你说的那个command.com/c arj.exe在shell中怎么加入,因为我在shell中是要加参数的,比如:
    Shell(Parameter(0) & "Command.com /c arj.exe  x  -y  " & Parameter(1) & "*.arj" & "  " & Parameter(2), 1)
    这样是对的吗?但是如果这样的话,程序会报错啊!提示File not found!
     
      

  6.   

    是压缩打包的程序,和WINZIP一样,但是是很老的工具了,是以前在DOS下用的!
      

  7.   

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
    Private Const WM_CLOSE = &H10
    Dim hArjWnd as longhArjWnd=FindWindow(vbNullString,"Arj.exe")
    Do While hArjWnd
      SendMessage hArjWnd,WM_CLOSE,0,Byval 0&
      hArjWnd=FindWindow(vbNullString,"Arj.exe")
    Loop
      

  8.   

    不行啊,你写的代码,我刚刚测试了,hAajWnd返回的值是0啊!不能找到ARJ的窗口!
      

  9.   

    试一试:hArjWnd=FindWindow(vbNullString,"ARJ")
      

  10.   

    To yell(飞空草):总共有四贴!
      

  11.   

    找到句柄后
    Call SetForegroundWindow(hwnd)
    Call PostMessage(hwnd, WM_CLOSE, 0, 1)
    SendKeys "Y"
      

  12.   

    你的Shell(Parameter(0))是什么?
    command.com在windows安装目录下,本来可以直接运行,你在前面加东西,当然提示File not found!
      

  13.   

    dos窗口用findwindow是不可能找到的
    你可以去msdn看看一篇文章,好像VB中无法解决这个问题
      

  14.   

    这个问题太简单了,根本不用在程序中添加代码。
    解决方法如下:
    右击打开arj.exe的属性窗口-->点击程序-->选中“退出时关闭”-->确定
    按以上操作后,执行完arj.exe程序后Dos窗口就会自动关闭。
      

  15.   

    絕對正確的代碼:(給點分吧)
    Shell "Command.com /c a:\arj.exe a c:\aa.arj c:\abc.txt"