可以啊,用子类化,捕捉WM_NCLBUTTONCLICK

解决方案 »

  1.   

    文档中心有这方面的文章,API的
      

  2.   

    猛然看见楼上说什么“子类”,竟愣了半天没想起来是个什么玩意,好象似相识,翻出笔记,才找到这么一小段,可能说的不对,也请高手指正。
    1、一般情况下,你的程序要建一个模块(具体原因下面讲),里面粘上如下代码,这一部分是所谓子类所必须的,一般不用去变。
    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 LongDeclare Function SetWindowLong Lib "user32" Alias _
    "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = -4
    Global lpPrevWndProc As Long
    Global gHW As Long
    Public Sub Hook()
       lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
       AddressOf WindowProc)
    End SubPublic Sub Unhook()
       Dim temp As Long
       temp = SetWindowLong(gHW, GWL_WNDPROC, _
       lpPrevWndProc)
    End SubFunction WindowProc(ByVal hw As Long, ByVal uMsg As _
    Long, ByVal wParam As Long, ByVal lParam As Long) As _
    Long
        '等会要加代码的地方
    End Function
    可能比较长,直接粘上就可以了。
    2、那个gHW是指窗体的句柄(HWnd),请在窗体的LOAD的事件中加上如下语句:
         gHW=Me.HWnd
    3、里面的过程HOOK由你的程序在开始时调用,UNHOOK在程序结束时调用,用来释放前面的HOOK。
      HOOK加在刚才gHW=Me.HWnd的后面,而UNHOOK加在窗体的UNLOAD事件里。
    4、在模块里的WindowProc是用来处理窗体上所发生的消息的。里面的参数含义是和SENDMESSAGE里的参数应该是对应一样的。特别是uMsg正是我们要捕获的“消息”。
    5、如你的要求要捕获点击标题栏的消息,这个消息对应的值是WM_NCLBUTTONDOWN = &HA1
    所以只要在WindowProc过程里加上这样的代码即可:
    IF uMsg=&HA1 THEN DEBUG.PRINT "标题栏单击"
    当然也可以在THEN的后面加上你想触发的过程.(窗体上的单击对应的值是WM_LBUTTONDOWN = &H201)注:说了一通,其实就是高手们常说的什么“钩子”,不仅可以捕获本程序的消息,还可以捕获一切WINDOWS消息,但前者只要讲HOOK的过程做在程序的模块里就行了(就是前面所讲的),而后者一定要把消息捕获放在DLL里,这对VB有些困难,不在话下。最后提醒,用完后一定要释放“钩子”(UNHOOK)。