各位好:
小弟在循环程序中,设两个循环,第一个循环打出3个A后,继续打B跟C各一次,(以上为第二个循环)接着跳回第一个循环打3个A,然后再B跟C共循环10次。因为我想在TEXT中输入A的次数,以及第二个循环次数,才会如此设定,现在问题发生在VB6的环境中执行,第一次执行完毕准备跳第二个循环时,组件会反白(类似当机),但是全部执行完毕后,第二次就可正常运行,但是组件会跟记事本一起自动最小化。接着在档案功能中→选择制成EXE檔执行,一样会发生以上事件,而且A只出现一次,B则都未出现,结果如下:
acccccccccc
aaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabc 此为在VB6下正常执行结果。
请问小弟该如何做,才能解决以上问题,以下是小弟的程序代码
烦请各位帮小弟解答
谢谢大家Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Integer
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 Integer
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Dim lhwnd, ledit As Integer
Private Sub Form_Load()
Timer1.Enabled = True
Timer1.Interval = Text1
End Sub
Private Sub Timer1_Timer()
lhwnd = FindWindow(vbNullString, "未命名 - 記事本")
hedit = FindWindowEx(lhwnd, 0, "edit", vbNullString)
If hedit <> 0 Then
Timer1.Enabled = False
End If
End Sub
Private Sub Command1_Click()
Dim x As Integer, y As Integer
    Const WM_KEYDOWN = &H100
    Const WM_KEYUP = &H101
    Const WM_CLOSE = &H10
    Const VK_A = &H41
    Const VK_B = &H42
    Const VK_C = &H43
For y = 1 To 10
For x = 1 To 3
PostMessage ledit, WM_KEYDOWN, VK_A, 0
Sleep 1000
If x = 3 Then
 PostMessage ledit, WM_KEYDOWN, VK_B, 0
 Sleep 1000
 PostMessage ledit, WM_KEYDOWN, VK_C, 0
 Sleep 1000
End If
Next x
Next y
End Sub

解决方案 »

  1.   

    Private Sub Timer1_Timer()
      lhwnd = FindWindow(vbNullString, "未命名 - 记事本")
      ledit = FindWindowEx(lhwnd, 0, "Edit", vbNullString)
    ' ↑原式错误名称(hedit),不知道你为什麽认为可以正确执行?
      
      If ledit <> 0 Then '←原式错误名称(hedit)
         Timer1.Enabled = False
      End If
    End Sub
    '===============================================================
    aaabc '第一个循环打出3个A後,继续打B跟C各一次,(以上为第二个循环)'接着跳回第一个循环打3个A,然後再B跟C共循环10次
    aaabc + aaabc + aaabc + aaabc + aaabc + aaabc + aaabc + aaabc + aaabc + aaabc 'aaabc(3个A,然後再B跟C共循环10次)aaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabc '结果是这样吧?
    aaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabc '←实际执行的结果(没错)'↓你怎麽会测出这样结果(第1行acccccccccc是什麽?)
    acccccccccc
    aaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabcaaabc 此为在VB6下正常执行结果。
     到底有什麽问题?
    另,
    组件反白这些情况建议你在每个Sleep後加入DoEvents试试
      

  2.   

    這樣呢?
    Private Sub Command1_Click()
      Dim X As Integer, Y As Integer
      Const WM_KEYDOWN = &H100
      Const WM_KEYUP = &H101
      Const WM_CLOSE = &H10
      Const VK_A = &H41
      Const VK_B = &H42
      Const VK_C = &H43
      
      For Y = 1 To 10
          For X = 1 To 3
              PostMessage lEdit, WM_KEYDOWN, VK_A, 0
              PostMessage lEdit, WM_KEYUP, VK_A, 0
              Sleep 1000
              DoEvents
              If X = 3 Then
                 PostMessage lEdit, WM_KEYDOWN, VK_B, 0
                 PostMessage lEdit, WM_KEYUP, VK_B, 0
                 Sleep 1000
                 PostMessage lEdit, WM_KEYDOWN, VK_C, 0
                 PostMessage lEdit, WM_KEYUP, VK_C, 0
                 Sleep 1000
              End If
          Next 'X
      Next 'Y
    End Sub
      

  3.   

    感谢vrgame大大你的回复
    加上doevents果然改变了,运行上反白的问题,至于vrgame大大你所指出的错误第一个是小弟在发文前修改文章时所发生的错误原本全部都是hedit,第二个acccccccccc是原先小弟将程序代码制成EXE檔执行后,实测时产生的情况。
    小弟现在引用你所发的程序代码,在VB6上实行,得到的结果是aaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbccaaaaaabbcc 
    但是在制成EXE檔,实测后aaacaacaacaacaacaacaacaacaacaac 但是我已修改好了。那现在的问题是,同样的程序代码,为何在VB6跟EXE檔上执行,会得到不同的结果?
      

  4.   

    Dim lhwnd, ledit As Integer '←#﹖*★※○!♀&♂...
    Dim lhwnd, ledit As Long '←改为Long,这样就好啦!!!
     什麼Sleep、DoEvents可以通通拿掉啦~~
      

  5.   

    vrgame大哥
    感謝你的回覆
    ^^