本帖最后由 Topc008 于 2010-11-14 23:11:55 编辑

解决方案 »

  1.   

    能/能/能
    首先要得到其句柄
    需要一堆API
      

  2.   

    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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
      

  3.   

    我现在并不能确定那个窗口是什么类型,只知道是一个可以输入内容的窗口,而且可以得到其窗口hwnd,能不能用类似objectfromhwnd来实例化那个窗口,让其变的可以像textbox一样动态跟踪?
      

  4.   

    最好是来源于标准Edit或RichEdit的窗口,或按兼容的消息定义设计的编辑控件,这样才可用4楼的代码.
      

  5.   

    下图是 第一个 程序FindWindow去调取 第二个 不同程序的窗口里面的 TextBox我只帮你做第一部分获取光标位置 其它你自己再花时间继续搞吧,获取TextBox文字内容也已替你写好了.需要代码的话上QQ我发给你,(两个程序的代码 在此不好贴)
      

  6.   


    大侠,您说对了,这个问题其实挺复杂的,呵呵而且我还不知道我要监控的窗口到底是一种什么类型的窗口,我只知道能在里面输入内容,至于窗口的hwnd,大家就不要费心了,这个已经解决了
      

  7.   

    至 4# 的mokton
     
    您的代码只能在自身进程内使用!我无法获取进程外其它进程中的输入框的光标位置和字符串谢谢您的回复。
      

  8.   

    同步的解决, 先决条件是 你要指定的那个窗口类是 Edit 等可写入的才能同步更新'********获取该窗口的内容贴到本地的 Text1
    Private Sub Command1_Click()
       Phwnd = FindWindow(vbNullString, "隔岸观火")
       If Phwnd <> 0 Then
          ChildHwnd = FindWindowEx(Phwnd, 0, "ThunderTextBox", vbNullString)
          If ChildHwnd > 0 Then
             Text1.Text = GetText(ChildHwnd)
             Call GetLine(ChildHwnd)
          End If
       End If
    End SubFunction GetText(THwnd As Long) As String
       TextLen = SendMessage(THwnd, WM_GETTEXTLENGTH, 0, 0)
       If TextLen = 0 Then GetText = "": Exit Function
       TextLen = TextLen + 1
       TmpStr = Space(TextLen)
       TextLen = SendMessage(THwnd, WM_GETTEXT, TextLen, ByVal TmpStr)
       GetText = Left(TmpStr, TextLen)
    End Function
    '****************本地的 Text1 Change事件或点击按钮一次刷新指定窗口Private Sub Command2_Click()
       SendMessage ChildHwnd, WM_SETTEXT, 0, ByVal Text1.Text
    End Sub
      

  9.   

    哪个没看你的问题?
    类型不知道你可以用工具看看,比如Spy++
    类型你都不知道还指望别人给出完整的代码?
      

  10.   

    如果单独跨进程去操作的话,LZ你可以看看下面的代码行不行,这个可以取得记事本编辑框的内容
    Private Declare Function GetForegroundWindow& Lib "user32" ()
    Private Declare Function GetCaretPos& Lib "user32" (ByVal XY As Long)
    Private Declare Function ClientToScreen& Lib "user32" (ByVal Hwnd As Long, ByVal XY As Long)
    Private Declare Function WindowFromPoint& Lib "user32" (ByVal X As Long, ByVal Y As Long)
    Private Declare Function GetClassName& Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long)
    Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal Buffer As String, ByVal Size As Long)
    Private Declare Function SendMessageAny& Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal Msg As Long, ByVal WParam As Long, LParam As Any)Private Sub Timer1_Timer() 'Timer周期100
    Dim Hwnd&, XY&(1), Buffer As String * 260
    Hwnd = GetForegroundWindow
    GetCaretPos VarPtr(XY(0))
    ClientToScreen Hwnd, VarPtr(XY(0))
    Hwnd = WindowFromPoint(XY(0), XY(1))
    GetClassName Hwnd, Buffer, 260
    Me.Caption = XY(0) & "," & XY(1) & "|" & Replace(Buffer, vbNullChar, vbNullString)
    End Sub
    而如果想真正完美的SubClass的话,LZ可以开一个SetWindowsHookEx的全局钩子,注入DLL到那个进程中,然后枚举到那个文本框直接子类就行了,然后开一个内存文件或者油槽啥的和主进程通讯就行了
      

  11.   

    终于可以发帖了,呵呵!!!!进一步研究如下:1、用spy++发现其并不是标准Edit或RichEdit的窗口;
    2、GetWindowText和SendMessage均以失败告终;
    3、在输入内容时,GetForegroundWindow获得值与其窗口的hwnd值并不相符
    4、GetCaretPos可以获取光标的位置
    5、WindowFromPoint可以使用
    6、金山词霸可以取到其中的内容第一个目标已经实现了!!!!!获取光标的位置,它只是相对窗口的像素值,这个已经解决。下一个问题是:怎么得到那个窗口的的内容???????????????????我用GetWindowText和SendMessage都没有取到结果(这个有点类似屏幕取词的功能,哈哈。可是在网上搜索了一下,发现要用屏幕取词来实现,看来还是很麻烦的,而且,我也不会!)
    各位大侠,还有什么方法可以获取某个窗口的(标准Edit或RichEdit的窗口)的内容?
      

  12.   

    GetCaretPos获取光标的位置
    WindowFromPoint得到句柄
    SendMessage得到内容
      

  13.   

    你这个比较麻烦,要做跨进程子类化.
    记得有一个免费的DLL将这个过程封装了,不过很多年没用过,忘了
    给你提个醒,第一个看清楚你题意的人会做这个,贿赂他吧
      

  14.   

    老马,我从头到尾看了N遍,您说的是不是  PctGL 大侠?????? 
    PctGL大侠,好眼熟啊。不过这里的大侠,人品都很好的,有问必答啊,难道还需要贿赂吗?再说,我也不知道用什么去贿赂啊,请给点提示吧!!!!
    另外:跨进程子类化,偶已经搞掂了(根据网上搜来的结果),我现在不知道怎么去获得那个窗口中的内容?????很着急!!!!!!!难道是监视那个窗口中输入的任何字符吗(通过跟踪发现这个过程很复杂!)???????
      

  15.   

    纠正。应该是
    ReadProcessMemory
      

  16.   

    楼上大侠,ReadProcessMemory需要传递内存地址,但是这个地址怎么找,一个个搜索然后比对吗?这样显然是行不通的,我用其它内存搜索工具做过实验:进入编辑模式,输入一串字符串,用工具找到刚刚输入的字符串的地址(花了很长时间),退出编辑模式,然后重新进入编辑模式,再输入另外一个字符串,找到地址,发现前后2个地址不相同!!!有2个问题再问一下:1、子窗口在内存中的地址范围是不是一定在其父窗口内存地址的范围内?2、能不能根据某个窗口的句柄(hwnd)来确定这个窗口的内存地址在其父窗口(或进程)的内存中偏移量地址范围?如果能得到这个偏移量和地址范围,搜索起来应该非常快了(应为这个地址范围不会太大!)
      

  17.   

    你把那个类名发上来看看.另外,你使用SPY++挂它的消息,再看看内容改变时,消息里会不会有需要的东西.如果有,则就可以使用跨进程子类化搞定.如果没有,那真的就比较麻烦了.
      

  18.   

    其实我就是想动态获取excel中编辑框的内容。窗口类名是EXCEL6。 写个com组件就可以子类化那个excel6窗口,但是会产生一些其它问题:1、无法输入汉字了。用微软的输入法倒是可以输入汉字,用搜狗就不可以了。2、excel在编辑单元格内容时,可以点击其它单元格并将其地址输入到编辑框中,但是此时子类技术无法监测到输入动作。。等等。。
      

  19.   

    ......EXCEL啊,貌似可直接获得当前对象,并取得里面内容.....dim oXls as objectset oxls=getobject(,"Excel.Appliction")好象这样就行了.然后想要哪个单元格的内容都行......
      

  20.   

    大侠,我问的是 当excel处于编辑状态时,其编辑框中的内容,并不是指某个单元格的内容。
      

  21.   

    看了一下,貌似没有直接的简单方法......事件里也没有KeyPress一样的事件,而Changed事件是要在编辑完成后才产生.正在编辑时,那个框貌似没有单独的句柄.难度高啊.....再帮你顶顶吧.
      

  22.   


    那个窗口可以找到固定的句柄,是一个名为Excel6的类名,但是我得到句柄后,不知怎么得到其中的内容,用sendmessage和getwindowtext都取不到内容(在DLL内,与excel属同一个进程)不知大侠有什么方法可以取到Excel6窗口的内容??
      

  23.   

    我得到的难道不是编辑框的句柄???可是我对那个编辑框(Excel6)进行子类化以后,可以监控编辑框窗口的键盘和鼠标动作!!!但是子类化以后会带来其它问题:1、搜狗输入法无法输入汉字了;2、无法监控鼠标选择的单元格地址的输入(输入公式时,点击其它单元格会自动在编辑框中插入单元格地址)... ...层看到过一个牛人的一个片段:他说EXCEL用2套DC重绘字符串!! 这是什么意思???(曾问过那个牛人,但没有答案)
      

  24.   

    这个我就没研究过了.专门攻EXCEL的,有个MSMVP在搞,地址是www.excelhome.net,他们那里一直研究EXCEL,也许有啃过这块硬骨头的人.....