比如:我想给每个新建的Form加上如下代码Private Sub Form_Click()
Debug.Print "Click"
End Sub请注意:以上代码不是静态添加在源码里!!!而是指,当程序运行时,某一个窗体被载入时,动态加上的,
且不影响该窗体本身的事件处理。一般来说,可以使用
Private WithEvents Form1 As Form
的办法,但问题是,不知道何时、如何捕捉,新窗体被载入事件?基本上,就像如何感应 Forms 集合添加了一个窗体?(最好能不用VB杀手——子类)

解决方案 »

  1.   

    不能实现吧?
    你这相当于让一个运行的exe重新编译自己。
      

  2.   

    模块Option ExplicitPublic hhh As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Const WM_CREATE = &H1Public Function hjj(ByVal hnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
        If Msg = WM_CREATE Then Debug.Print "haha"
        hjj = CallWindowProc(hhh, hnd, Msg, wp, lp)
    End Function窗口
    Option Explicit
    Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Const GCL_WNDPROC = (-24)Private Sub Command1_Click()
        Load Form2
        Form2.Show
        Load Form3
        Form3.Show
    End SubPrivate Sub Form_Load()
        hhh = SetClassLong(Me.hWnd, GCL_WNDPROC, AddressOf hjj)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Call SetClassLong(Me.hWnd, GCL_WNDPROC, hhh)
    End Sub
      

  3.   

    To pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) :这个子类上去了就下不来了,
    在整个工程中到时——就知道什么叫VB杀手了,
    不要告诉我你没保存代码噢,呵呵:)另外,你这样就需要更改每个窗体的静态代码,
    那那还不如直接把代码复制到窗体中呢^-^相比较而言,觉得WithEvents更合适点,
    只差不知如何感应Forms集合的变化
      

  4.   

    TO VBAHZ(凌云(E文词汇量580)) :你一定没有测试上面的代码.
      

  5.   

    Fom1自己呢?
    而且,我是想给每个新增窗体的某个事件添加一些代码
      

  6.   

    能否把一个窗体句柄,绑定到一个 WithEvents Fom1 As Form 具体对象上呢?这样的话,就可方便的随便对应哪个事件了:)
      

  7.   

    Fom1自己呢?
    而且,我是想给每个新增窗体的某个事件添加一些代码
    你可以放到sub main去.
    这本来就是给每个新增的窗口的某个事件都添加代码啊.
      

  8.   

    我还是不明白。假设我想给每个新增的窗体的MouseMove事件添加一句Debug.Print "Move" & 该窗体Name名我希望是一个通用的办法,而不管具体是哪个窗体载入,
    并且,每个窗体都可自由的载入、卸载、隐藏、显示 或模式显示。
    并不影响其它窗体的该消息处理那具体怎么做呢?
      

  9.   

    这就是 setwindowlong和setclasslong的不同。
      

  10.   

    杀手就是杀手,
    我只中断了下,在立即窗口中 Unload Form2
    结果。
    幸好,偶保存了代码:)现在,怎么解决卸载Form1后,如何继续的问题呢?
      

  11.   

    搞不懂你怎么设计的。
    如果你其他窗体都是直接或者间接通过form1启动的
    那么form1就是主窗体frmmain。 主窗体总是存在的
    他的unload表示进程的退出,  需要释放所有的资源。不知道你怎么要好好的去unload form1? 你设计一定有问题。
      

  12.   

    我是由Sub Main启动的,
    一般不需要显示界面!!!只在需要时,载入并显示相应窗体!
    所以,根本没有什么主窗体之说,
    我想要的结果也就是对所有载入的窗体增加代码,
    详见标题,就是这么设计的,呵呵:)
      

  13.   

    我说过了,是加在一个固定的事件中,并不影响原窗体的消息处理
    (主要目的就是不更改窗体源码,就可增加功能,而且可以应用到所有VB Load的窗体上)
      

  14.   

    请问mysticboy(麦壳饼):如何用外接程序,给运行时每个Load 的窗体加上以下代码:Private Sub Form_MouseMove(。)
    Debug.Print "Haha,你也不会:)"
    End Sub
      

  15.   

    请注意一个关键问题:
    如何在不改变原窗体源码的情况下,
    在运行的任何时候,能感应到VB.Forms集合有所变动?这一问题不能解决,其它的都免谈。
    pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    兄弟的办法虽然不错,但也还是要保留一个隐含窗体,
    这个窗体就是一个特例!
    要是这个窗体被其它窗体中的代码不小心卸载了,那本主题是想找一个通用的办法,不受特定窗体限制的。
    起因是因为,每次都要在每个窗体中增加相同的功能,
    但有时候又不需要加,而且那是API调用,还要回到顶部声明
    觉得烦了。
    (不放在模块里是为了和模块里的全局API声明有所区别——参数定义不同)
    而有一些窗体是公用窗体,其它工程里会用到,
    那时也许需要,也许又不需要这些代码,又要注释掉——麻烦,
    (虽然有#If功能,但那不是根本的解决办法,毕竟没有运行时动态的灵活)
    最好的办法,就是在本工程里,只在运行时,
    才为需要的窗体加上功能,这样能做到最好的兼容、封装:)所以,第一步是能感应VB.Forms集合的变化!
    第二步是能取得新窗体的对象实体,
    能把它绑定到WithEvents As Form 事件对象上?
    这样就能以VB的方式自由的编写任何功能了。
      

  16.   

    能取得新窗体的对象实体,
    能把它绑定到WithEvents As Form 事件对象上?