我写了一个自动写字的程序,如下
Private Sub Form_Load()
ReturnValue2 = Shell("C:\WINDOWS\NOTEPAD.exe", 1)
AppActivate ReturnValue2, True
End Sub Private Sub Timer1_Timer()
SendKeys "{A}", True
End Sub 可以一切换到别的记事本,原先那个记事本就不行了,而新的记事本又开始自动写了./ 有没有办法让这个程序只能在原先的记事本上写啊,不管怎么切换,缩小,都一直在写,帮帮忙啊!
Private Sub Form_Load()
ReturnValue2 = Shell("C:\WINDOWS\NOTEPAD.exe", 1)
AppActivate ReturnValue2, True
End Sub Private Sub Timer1_Timer()
SendKeys "{A}", True
End Sub 可以一切换到别的记事本,原先那个记事本就不行了,而新的记事本又开始自动写了./ 有没有办法让这个程序只能在原先的记事本上写啊,不管怎么切换,缩小,都一直在写,帮帮忙啊!
Private Sub Form_Load()
ReturnValue2 = Shell("C:\WINDOWS\NOTEPAD.exe", 1)
End Sub Private Sub Timer1_Timer()
AppActivate ReturnValue2, True
SendKeys "{A}", True
End Sub
*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码)
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
'void __fastcall TForm1::Timer1Timer(TObject *Sender)
'{
' TPoint Pos;
' HWND Handle;
' Handle = FindWindow(NULL, "1.txt - 记事本");
' if ( Handle == NULL ) return;
'
'
' Sleep(5); //5ms,应该够了吧?
' PostMessage(Handle,WM_KEYUP, VK_F5, 0L);
'
'}
Dim mHWnd As Long
mHWnd = FindWindow(vbNullString, "1.txt - 记事本")
PostMessage mHWnd,? , 0, 0
'? 代表消息
End Sub
SendKeys是模拟键盘操作,所以对输入焦点敏感。如果要锁定输入,就要用Api取得当前要输入文本的控件句柄,然后用TextOut才行。
Dim nTargetProcID As Long
Command1.Enabled = False
nTargetProcID = Shell("C:\WINDOWS\NOTEPAD.exe", 1)
Timer1.Tag = nTargetProcID
Timer1.Enabled = True
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False
Timer1.Tag = ""
Command1.Enabled = True
End SubPrivate Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 2000
End SubPrivate Sub Timer1_Timer()
Dim hwnd As Long hwnd = GetWindowHandle(Val(Timer1.Tag))
If Not hwnd = 0 Then
SetForegroundWindow hwnd
SendKeys "{A}", True
End If
End SubPrivate Function GetWindowHandle(ByVal nTargetProcID As Long) As Long
Dim hWndDesktop As Long
Dim hwnd As Long
Dim hWndNext As Long
Dim nProcID As Long
Dim sTitle As String
GetWindowHandle = 0
hWndDesktop = GetDesktopWindow
hwnd = GetTopWindow(hWndDesktop)
Do
GetWindowThreadProcessId hwnd, nProcID
If nProcID = nTargetProcID Then
sTitle = String(512, vbNullChar)
GetWindowText hwnd, sTitle, 1024
sTitle = Left(sTitle, InStr(sTitle, vbNullChar) - 1)
If Right(sTitle, 3) = "记事本" Then
GetWindowHandle = GetTopWindow(hwnd)
Exit Function
End If
End If
hWndNext = GetNextWindow(hwnd, GW_HWNDNEXT)
If hWndNext = 0 Then Exit Do
hwnd = hWndNext
Loop
End Function比较丑陋,勉强可用,调试过了WinXP SP2
建议:
准备工作:获取记事本内TEXTBOX的类名
1、SHELL打开记事本,将得到的PID保存
2、历遍所有类名为上面提到的类名的控件(FINDWINDOWEX),获取其所在进程PID,取与1中PID相等的HWND保存之
3、用PostMessage这个API象该HWND发送按键信息,这个API使用起来比SENDMESSAGE稍容易:Sub mSendKey(ByVal VB_Key As Long)
PostMessage pHwnd, WM_KEYDOWN, VB_Key, 0&
PostMessage pHwnd, WM_KEYUP, VB_Key, 0&
End Sub我觉得这样思路就应该比较明朗了。楼主自己写吧,最近几天见API有点恶心
其实,获取类名的时候,可以获取编辑框的,也可以获取记事本的,虽然最终发送按键的目标不同了,但是结果应该是相同的,想来如果直接查找记事本窗口可能比较容易,因为如果楼主知道窗口名用FINDWINDOW直接就得到了。
Notepad程序窗口类名Notepad,其编辑框类名:Edit
另外,发送按键的时间间隔,是可以被控制的,如果闲用TIMER控件慢,可以换做LOOP循环+DOEVENTS或者使用API函数(比较多,不列举了)
还有一个小问题,就是楼主不断输入的目的,如果是添满文本框,根本不用发送按键这种方法,完全可以用SETWINDOWTEXT直接设置编辑框内容或者投递消息改变它。