我写了一个自动写字的程序,如下 
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 可以一切换到别的记事本,原先那个记事本就不行了,而新的记事本又开始自动写了./ 有没有办法让这个程序只能在原先的记事本上写啊,不管怎么切换,缩小,都一直在写,帮帮忙啊!  

解决方案 »

  1.   

    可以阿,用API,我現在忙,晚上給你源碼
      

  2.   

    dim ReturnValue2 as long
    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
      

  3.   

    用sendmessage
      
    *****************************************************************************
    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  4.   

    贴一个非VB的
    '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);
    '
    '}
      

  5.   

    Private Sub Timer1_Timer()
       Dim mHWnd As Long
       mHWnd = FindWindow(vbNullString, "1.txt - 记事本")
       PostMessage mHWnd,? , 0, 0
       '? 代表消息
    End Sub
      

  6.   

    如果要实现这样的功能,你的方法是不行的。
    SendKeys是模拟键盘操作,所以对输入焦点敏感。如果要锁定输入,就要用Api取得当前要输入文本的控件句柄,然后用TextOut才行。
      

  7.   

    Option ExplicitPrivate Const GW_HWNDNEXT = 2Private Const GW_HWNDPREV = 3Private Const WM_SETTEXT = &HCPrivate Const WM_GETTEXT = &HDPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As LongPrivate Declare Function GetDesktopWindow Lib "user32" () As LongPrivate Declare Function GetTopWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Command1_Click()
        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
      

  8.   

    其他版本窗体的树结构可能不一样,配合Spy++用同样的遍历方法也可以找出来
      

  9.   


    建议:
    准备工作:获取记事本内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有点恶心
      

  10.   

    顺便提两句
    其实,获取类名的时候,可以获取编辑框的,也可以获取记事本的,虽然最终发送按键的目标不同了,但是结果应该是相同的,想来如果直接查找记事本窗口可能比较容易,因为如果楼主知道窗口名用FINDWINDOW直接就得到了。
    Notepad程序窗口类名Notepad,其编辑框类名:Edit
    另外,发送按键的时间间隔,是可以被控制的,如果闲用TIMER控件慢,可以换做LOOP循环+DOEVENTS或者使用API函数(比较多,不列举了)
    还有一个小问题,就是楼主不断输入的目的,如果是添满文本框,根本不用发送按键这种方法,完全可以用SETWINDOWTEXT直接设置编辑框内容或者投递消息改变它。