如何通过已知句柄,取得VB中正在运行的窗体的实体对象
谁能用VB代码实现以下内容:
把正在VB中运行的其他程序(外部程序)的某窗体,通过取到的句柄,取得这个窗体的实例化对象,并对其进行对象操作(主要是取得控件容器对象)。对象可以转化成VB.FORM类型的,或者是VBIDE.VBFORM类型的都行。
即set form1 = <根据已取得句柄的窗体转化成的实例对象>。然后使用form1.属性(或方法)进行各种操作。
[解决办法]
楼主肯定是用过VC哈哈~~觉得强制转换非常爽吧~~
你说的那个基本上不可能~~一个对象要经过初始化等一系列工作非常复杂
用个方法你倒是可以一用但是也不能保证成功你需要定位到对象
你把目标窗体进程拷贝到你的进程空间然后自己定位
用CreateRemoteThread启动什么的或者SetThreadContext
[解决办法]
VC中的CWnd类,其实里面也是封装了一些窗体API函数
你可以自己在VB中建立一个CWnd类,里面也自己封装几个窗体常用属性就得了!
下面给你提供个例子
'Class CWndOption ExplicitPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As WNDMSG, ByVal wParam As Long, lParam As Any) As LongPrivate Enum WNDMSG WM_GETICON = &H7F WM_SETICON = &H80End EnumPrivate Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Boolean) As LongPrivate Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As LongPrivate Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As LongPrivate Type RECT Left As Long Top As Long Right As Long Bottom As LongEnd TypePrivate Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As BooleanPrivate Declare Function EnableWindow Lib "user32" (ByVal hWnd As Long, ByVal fEnable As Boolean) As BooleanPrivate Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As LongPrivate m_hWnd As LongProperty Get Caption() As String Dim szBuffer As String * 255 Call GetWindowText(m_hWnd, szBuffer, 255) Caption = Left$(szBuffer, InStr(szBuffer, vbNullChar) - 1)End PropertyProperty Let Caption(ByVal szTitle As String) If szTitle <> Caption Then Call SetWindowText(m_hWnd, szTitle) End IfEnd PropertyProperty Get Enabled() As Boolean Enabled = IsWindowEnabled(m_hWnd)End PropertyProperty Let Enabled(ByVal blnEnable As Boolean) Call EnableWindow(m_hWnd, blnEnable)End PropertyProperty Get hWnd() As Long hWnd = m_hWndEnd PropertyProperty Let hWnd(ByVal NewWnd As Long) m_hWnd = NewWndEnd PropertyProperty Get Icon() As Long 'Big Icon 'Icon = SendMessage(m_hWnd, WM_GETICON, 1, ByVal 0&) Icon = SendMessage(m_hWnd, WM_GETICON, 0, ByVal 0&)End PropertyProperty Let Icon(ByVal hIcon As Long) 'Big Icon 'Call SendMessage(m_hWnd, WM_SETICON, 1, ByVal hIcon) Call SendMessage(m_hWnd, WM_SETICON, 0, ByVal hIcon)End PropertyProperty Get Left() As Long Dim Rc As RECT Call GetWindowRect(m_hWnd, Rc) Left = Rc.LeftEnd PropertyProperty Let Left(ByVal nLeft As Long) Dim Rc As RECT Call GetWindowRect(m_hWnd, Rc) Call MoveWindow(m_hWnd, nLeft, Rc.Top, Rc.Right - Rc.Left, Rc.Bottom - Rc.Top, True)End PropertyProperty Get ScaleWidth() As Long Dim Rc As RECT Call GetClientRect(m_hWnd, Rc) ScaleWidth = Rc.Right - Rc.LeftEnd PropertyProperty Get Top() As Long Dim Rc As RECT Call GetWindowRect(m_hWnd, Rc) Left = Rc.TopEnd PropertyProperty Let Top(ByVal nTop As Long) Dim Rc As RECT Call GetWindowRect(m_hWnd, Rc) Call MoveWindow(m_hWnd, Rc.Left, nTop, Rc.Right - Rc.Left, Rc.Bottom - Rc.Top, True)End Property
[解决办法]
有些糊涂.
现在还没有想明白.
IE里面,可以实现根据句柄获取对象~~
看这个显示网页密码的代码:
http://www.m5home.com/blog2/blogview.asp?logID=197&cateID=2
这个代码就是根据句柄,取到了一个访问这个对象的接口,而对象本身其实还是在IE里面.
但是,估计这是IE本身的功能之一,它提供了接口.
而你想完成的功能,是要访问并不支持这种方法的东东....
不知道有没有办法"加工"出一个接口来..
就像电路一样~~
[解决办法]