要做一个自动按键的小程序,,,,功能是在多个程序窗口中轮流输入指定内容,
现在遇到问题了,求高手帮忙一下:
程序代码: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 ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongDim window_stat, lHwnd_ID, lHwnd_Count, lHwnds() As Long
Private Sub Command1_Click()
    Call GetWindowHwnds("Notepad", "无标题 - 记事本")
    lHwnd_Count = UBound(lHwnds)
    If CLng(Me.txt_sleep.Text) < 5000 Then Me.txt_sleep.Text = 5000
    Me.Timer1.Interval = Me.txt_sleep.Text
    Me.Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
    Me.Timer1.Enabled = False
End SubPrivate Sub GetWindowHwnds(ByVal className As String, ByVal windowTitle As String)
    Dim i, j As Integer
    Dim lHwnd As Long
    Dim sHwnds, tmpHwnds As String
    
    If className = "" Or className = Null Then className = "Notepad"
    If windowTitle = "" Or windowTitle = Null Then className = "无标题 - 记事本"
    i = 0
    Do
        lHwnd = FindWindowEx(0, lHwnd, className, windowTitle)
        If lHwnd = 0 Then Exit Do
        tmpHwnds = tmpHwnds & "," & lHwnd
        i = i + 1
    Loop
    
    sHwnds = Split(tmpHwnds, ",")
    ReDim lHwnds(i) As Long
    For j = 1 To i
        lHwnds(j) = sHwnds(j)
    Next
End SubPrivate Sub Timer1_Timer() '切换窗口的定时器
    SetForegroundWindow = lHwnds(lHwnd_ID)
    lHwnd_ID= lHwnd_ID+1
    lHwnd_ID = lHwnd_ID + 1
    If lHwnd_ID > lHwnd_Count Then lHwnd_ID = 1
    '''''''''''''''使用winio的api执行按键方法'''''''''''就是这个有问题,不写就能正常用,写了就无法正常激活窗口了
    MyKeyDown VK_1
    MyKeyUp VK_1
End Sub

解决方案 »

  1.   

    SetForegroundWindow = lHwnds(lHwnd_ID) '调用函数不能用 ='
    DoEvents '加这个试试'
    又:MyKeyDown、MyKeyUp 呢?
      

  2.   

    MyKeyDown、MyKeyUp
    是用来按键的呀
      

  3.   

    在Timer中使用PostMessage来想指定控件发送消息(VK_1)
      

  4.   

    暂且认为 MyKeyDown、MyKeyUp 是正确的。切换窗口是需要时间的,不能马上发送按键消息。
    DoEvents 有没有用?
    最好将 SetForegroundWindow 和 MyKeyDown、MyKeyUp 在两个 Timer 事件中执行。
      

  5.   

    MyKeyDown、MyKeyUp 是  使用winio按键的时候写的方法,单独做过测试是正确的.加了DoEvents也不行....后来改过代码,将SetForegroundWindow 写在第一个延时器里,然后第一个延时器触发第二个延时器后停止,
    第二个延时器里延时执行MyKeyDown、MyKeyUp,后将自己停止,再次触发第一个延时器.这样也还是不行
      

  6.   


    我要操作的窗口不支持 PostMessage 方法,所以只能用winio来硬件模拟
      

  7.   

    现在的情况是:只要加了MyKeyDown和MyKeyUp方法,就无法正确切换窗口,如果注释掉这两行就可以正确执行.
    另外,如果只是单窗口,那么程序也能正常执行
      

  8.   

    XP 会阻止窗口非人工方式获得焦点,SetForegroundWindow 可能没有转移焦点。
    这样键盘消息被你自己的程序收到了。
      

  9.   

    还是怀疑 MyKeyDown、MyKeyUp 
      

  10.   

    断点调试过了,查不出来
    就是执行MyKeyDown、MyKeyUp 的时候直接不弹,
    但是会让任务栏上的程序按钮在那边闪