1。先做lpoldwndproc=SetWindowLong(hwnd,GWL_WNDPROC,lpnewwndproc)后
再做lpwndproc=GetWindowLong(hwnd,GWL_WNDPROC)得到的应该是lpnewwndproc
还是lpoldwndproc呀?并讲明原因。
其实我主要是用上面的方法做Subclassing。
对于这种方法WIN95 A DEVELOPER'S GUIDE 里面说:
“因為現今市場㆖㆒些工具程式已經subclassing 各式各樣的視窗,造成系統㆗
可能有些視窗被subclassed 許多次-- Windows 並不阻止這樣的事情發生。但如果任
何subclass 視窗函式都使用這種技術的話,後來添加的subclass 視窗函式就沒有機會處理訊息了(侯俊傑註:也就是說,不能夠形成㆒個subclass 串鏈)。”
不大懂,为什么会是后面添加的"視窗函式就沒有機會"?我觉得后面的窗体最后使用SetWindowLong()应该回使訊息送至自己的wndproc,所以会使前面subclass的窗体的wndproc得不到訊息才对呀?
2。号称GetWindowText()函数对于另一个进程空间里面的窗体是直接调用DefWindowProc()得到Caption的,而对于本进程的窗体是通过发送WM_GETTEXT
得到Caption的。请问所谓“直接调用DefWindowProc()得到Caption”是怎么通过DefWindowProc()得到的?
而且MSDN里面还说
To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText
为什么应该用send WM_GETTEXT而不用GetWindowText呢?

解决方案 »

  1.   

    ft,csdn怎么修改帖子呀?
    做了一点修改:)1。先做lpoldwndproc=SetWindowLong(hwnd,GWL_WNDPROC,lpnewwndproc)后  
    再做lpwndproc=GetWindowLong(hwnd,GWL_WNDPROC)得到的应该是lpnewwndproc  
    还是lpoldwndproc呀?并讲明原因。  
    其实我主要是用上面的方法做Subclassing。  
    对于这种方法WIN95  A  DEVELOPER'S  GUIDE  里面说:  
    “因為現今市場上的一些工具程式已經subclassing了各式各樣的視窗,造成系統中
    可能有些視窗被subclassed許多次--Windows並不阻止這樣的事情發生。但如果任  
    何subclass  視窗函式都使用這種技術的話,後來添加的subclass  視窗函式就沒有機會處理訊息了(侯俊傑註:也就是說,不能夠形成一個subclass串鏈)。”  
    不大懂,为什么会是后面添加的"視窗函式就沒有機會"?我觉得后面的窗体最后使用SetWindowLong()应该回使訊息送至自己的wndproc,所以会使前面subclass的窗体的wndproc得不到訊息才对呀?  
     
     
    2。号称GetWindowText()函数对于另一个进程空间里面的窗体是直接调用DefWindowProc()得到Caption的,而对于本进程的窗体是通过发送WM_GETTEXT  
    得到Caption的。请问所谓“直接调用DefWindowProc()得到Caption”是怎么通过DefWindowProc()得到的?  
    而且MSDN里面还说  
    To  retrieve  the  text  of  a  control  in  another  process,  send  a  WM_GETTEXT  message  directly  instead  of  calling  GetWindowText  
    为什么应该用send  WM_GETTEXT而不用GetWindowText呢?  
      

  2.   

    嗯?对于1、2我怎么都是觉得说反了。
    1、肯定的到新的。
    2、我不知道GetWindowText具体如何实现的,但是对其他进程的使用WM_GETTEXT,对本进程的调用DefWindowProc(hWnd,WM_GETTEXT,...)得到的说法才是合理的吧。
      

  3.   

    还没有回答为什么
    To  retrieve  the  text  of  a  control  in  another  process,  send  a  WM_GETTEXT  message  directly  instead  of  calling  GetWindowText 
    呢?
      

  4.   

    不好说。
    不知道API GetWindowText是如何实现的,按MSDN的说法,应该是没有问题。也许你说的第二条是对的,如果是这样,假如目标窗口重载了WM_GETTEXT消息返回其他字符串的话,用发WM_GETTEXT消息比用GetWindowText可靠,因为后者调用DefWindowProc,返回的总是窗口标题。在子类化的情况,如果每一个subclass的代码都把它不处理的消息(或不用立即返回的消息)发给保存的oldwindowproc,这样相当于是subclass链吧。
      

  5.   

    关于GetWindowText()和WM_GETTEXT:
    如果窗口属于本进程,GetWindowText()向此窗口发送WM_GETTEXT,
      

  6.   

    关于GetWindowText()和WM_GETTEXT:
    如果窗口属于本进程,GetWindowText()向此窗口发送WM_GETTEXT,如果窗口有CAPTION,则返回CAPTION,如果窗口是一个控件(control),则返回控件的文本. 如果窗口不属于本进程,GetWindowText()仍向此窗口发送WM_GETTEXT,如果窗口有CAPTION则返回CAPTION,如果没有(如控件)则返回NULL,MS这样设计的原因是防止被叫的进程如果挂住了,GetWindowText()仍能返回.
      

  7.   

    1.得到的是lpnewwndproc,因为setwindowlong中的参数是新的取代的值,它的返回值是原来的值。用了这个函数后,新值取代了旧值。
      用getwindowlong时,得到的是当前值,即已经改变的值lpnewwndproc。2。::defwindowproc(hwnd,wm_gettext,buflen,(LPARAM)buf)其中hwnd是要获得的窗口句柄,buf是一个字符串,用来保存要获取的窗口标题,buflen是最大接受字符的长度。
       至于是用getwindowtext还是wm_gettext,我认为两者都是一样的,因为用getwindowtext时,隐含的向目标窗口发送了wm_gettext这个消息了。