这几天我在写一个关于VBA代码编辑框的扩展功能。我使用鼠标钩子获取到VBE中的代码提示框的hwnd,如图:就是上面淡黄色的那个窗口,得知是RichEdit20A,我使用如下代码修改其里面的内容:
SendMessage(pShare^.MouseInfoStruct.hwnd,WM_SETTEXT,0,LongInt(PChar(Utf8ToAnsi('OnKey(Key As String, [Procedure]) Key 测试用测试用'))));                    
运行后的效果如下:如上图所示不能完全显示出来,之后我又用鼠标单击了一下OnKey这个方法又全部显示出来了。如下图所示:请问前辈这是什么问题呢?谢谢!

解决方案 »

  1.   

    不是的,我是用delphi写一个外挂程序对Excel的vba环境进行一些修改。上面的图就是我运行我这个外挂后的效果。
      

  2.   

    可能是显示不下,自动换行了, 你修改了字体大小? 
    用 movewindow 在你修改文本的时候,同时把那个提示框加大加宽试试效果怎么样
      

  3.   

    dim rct as rect
    getwindowrect 提示窗口句柄, rct
    movewindow 提示窗口句柄, rct.left, rct.top, 这里修改宽度,这里是高度 ,1高度,宽度,你自己酌情修改,不过一般都是计算要显示的文本总长度,宽度再设置,这一步又麻烦了
    你先按照这个修改下试试看,可行不
      

  4.   

    谢谢!
    我如下修改了:
    GetWindowRect(pShare^.MouseInfoStruct.hwnd,lbRect); 
    MoveWindow(pShare^.MouseInfoStruct.hwnd,lbRect.Left,lbRect.Top,200,500,True);
    但仍然不行。
      

  5.   

    sendmessage 句柄,wm_lbuttondown,1,1
    sendmessage 句柄,wm_lbuttonup,1,1
      

  6.   

    我如下解决了问题,原来加一个换行符就行了。
    SendMessage(pShare^.MouseInfoStruct.hwnd,WM_SETTEXT,0,
                   LongInt(Utf8ToAnsi(pchar('OnKey(Key As String, [Procedure])'+#13+
                                            'Key   String 类型,必需。用于表示要按的键的字符串。'
                                            +#13+'Procedure   Variant 类型,可选。表示要运行的过程名称的字符串。'
                                            )))); 
    但还存在一个问题就是要鼠标滑轮滑一下才能显示出来,如下图所示:鼠标要在上面这张图滑动一下才能显示出下面的效果请问前辈这是为什么呢?
    也麻烦前辈帮我看看这帖子,万分感激:
    http://topic.csdn.net/u/20100717/13/d3763cbd-d87d-437f-a28f-9e0d0dc3c6e4.html
      

  7.   

    另一个贴子我就不去凑热闹了。用工具软件看了一下,确实是 ListBox 。
    很奇怪的是它怎么把图片加上去的…………
      

  8.   

    对,这个自画很常见的,你在VB中按F2出现的对象浏览器中那两个带图片的列表框就是ListBox楼主你说的钩子是不是钩鼠标所在位置的窗口的信息,是用的什么代码呢?Re:
    版主的怎么把我的帖子移到vb版块?请问版主你有仔细看过我的问题吗?哈哈,不管怎么样,就算你在delphi版问,那里很多人也是只会拖放控件和访问数据库啥的,你发到VB或VC的API版说不定知道的人还更多^-^
      

  9.   

    我可以确定获取的窗口绝对是ListBox。我是用鼠标钩钩到的,后来我又用了几个办法去验证,确认了是ListBox。
    PS:
    呵呵兄台误会了,一是因为我是用Delphi写的钩子,遇到问题了只好到Delphi那里问问,到别的版块只怕又会给一些SBBS,二是我不满Delphi版块的版主对我帖子的胡乱移动。小生也是用VB的,现在学习Windows编程,用Palcal方便些。
      

  10.   

    是listbox,因为不太好测试,我就没试到底能不能获取文本,如果那样真取不了,
    可能说明他没有将文本发到控件里面,而是自己存在数组里面,绘图时自己画上去的
      

  11.   

    肯定是在 paint 的过程画的,不过没有画文本的独立消息,如果普通方法获取不到,还是想得到文本,那就得用hook了,hook绘图api,然后激活重画过程,在这个过程中你会接收到hook事件,从而得到文本,这样的话,还值得做吗这要做起来是个大工程了
      

  12.   

    呵呵值得的,怎么样hook绘图api呢?前辈能举个例子说明白下不?
      

  13.   

    问题解决了。
    解决如下:
    使用Spy++监视这个窗口的消息,消息如下:    WM_SETTEXT
        WM_GETTEXTLENGTH
        WM_GETTEXTLENGTH    Return value
        WM_SETTEXT    Return value
        //以上四行其实就是对这个文本框设置文字,下面的差不多都是绘画窗口这个窗口的消息。
        //以前我是在这个窗口绘画完了才对其进行写入自己定义的文字内容的,从而产生了这个问题。
        //我现在的解决方法是在绘画这个窗口之前以及对这个窗口设置文字之后进行自己的SETTEXT。
        WM_WINDOWPOSCHANGING
        WM_WINDOWPOSCHANGING    Return value
        WM_NCCALCSIZE
        WM_NCCALCSIZE    Return value
        WM_WINDOWPOSCHANGED
        WM_SIZE
        WM_SIZE    Return value
        WM_WINDOWPOSCHANGED    Return value
        WM_WINDOWPOSCHANGING
        WM_WINDOWPOSCHANGING    Return value
        WM_NCCALCSIZE
        WM_NCCALCSIZE    Return value
        WM_WINDOWPOSCHANGED
        WM_SIZE
        WM_SIZE    Return value
        WM_WINDOWPOSCHANGED    Return value
        WM_WINDOWPOSCHANGING
        WM_WINDOWPOSCHANGING    Return value
        WM_NCCALCSIZE
        WM_NCCALCSIZE    Return value
        WM_WINDOWPOSCHANGED
        WM_SIZE
        WM_SIZE    Return value
        WM_WINDOWPOSCHANGED    Return value
        WM_PAINT
        WM_PAINT
        WM_PAINT
        WM_PAINT
        WM_NCPAINT
        WM_NCPAINT    Return value
        WM_ERASEBKGND
        WM_ERASEBKGND    Return value