vc和bcb都有这样的函数,vb怎么根据某个控件的句柄得到该控件对象呢?问题的起因是这样的,我窗口子类化combobox的窗口过程,处理某个消息(CB_SHOWDROPDOWN消息)时,需要判断combobox的locked属性,但是sdk里窗口没有locked相关的消息。所以我想根据窗口过程里的hwnd得到combobox控件对象,然后获取locked属性。各位大侠指点一下啊,谢谢!

解决方案 »

  1.   

    vc里面有CWnd::Attach、CWnd::FromHandle;bcb里面有TWinControl* __fastcall FindControl(HWND Handle);不知道vb里面怎么实现,如果没有的话,怎么根据wndproc里面的hwnd判断locked属性呢?
      

  2.   

    另一种思路:
    '可以使用CopyMemory   ,varptr,objptr来获取
        
      Private   Declare   Sub   CopyMemory   Lib   "kernel32"   Alias   "RtlMoveMemory"   (pDest   As   Any,   pSource   As   Any,   ByVal   ByteLen   As   Long)   
        
      Private   Sub   Command1_Click()   
      Dim   nObjPtr   As   Long   
      nObjPtr   =   ObjPtr(Me)             '假设nObjPtr为对象的地址   
      Dim   o   As   Object   
      CopyMemory   o,   nObjPtr,   4         '   运行这句之后,o就是指向me的对象   
        
      MsgBox   o.Name   
      CopyMemory   o,   0&,   4                   '释放内存   
      End   Sub   
      

  3.   

    既然是自己进程............那就有一个简单的思路:一,使用for each循环所有ComboBox控件的句柄;二,与你的子类化过程中的句柄相比较......三,符合的就返回........简单来说.....代码需要写在窗体里......public function getControl(byval hWnd as long)as object
        dim X as object    for each X in me.controls
            if x.hwnd=hwnd then
                set getcontrol=x
                exit for
            end if
        next
    end function
    这样的话.....调用这个getcontrol过程即可.其实别的进程也一样,但是取得对象貌似就不行了.....嘿嘿.
      

  4.   

    轻量控件,那就得在过程里加个on error resume next.............不然会出错-_-!