要做一个自动按键的小程序,,,,功能是在多个程序窗口中轮流输入指定内容,
现在遇到问题了,求高手帮忙一下:
程序代码: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
现在遇到问题了,求高手帮忙一下:
程序代码: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
DoEvents '加这个试试'
又:MyKeyDown、MyKeyUp 呢?
是用来按键的呀
DoEvents 有没有用?
最好将 SetForegroundWindow 和 MyKeyDown、MyKeyUp 在两个 Timer 事件中执行。
第二个延时器里延时执行MyKeyDown、MyKeyUp,后将自己停止,再次触发第一个延时器.这样也还是不行
我要操作的窗口不支持 PostMessage 方法,所以只能用winio来硬件模拟
另外,如果只是单窗口,那么程序也能正常执行
这样键盘消息被你自己的程序收到了。
就是执行MyKeyDown、MyKeyUp 的时候直接不弹,
但是会让任务栏上的程序按钮在那边闪