我能得到当前鼠标指向的窗口的句柄,但我如何确定该窗口是不是资源管理器窗口(比如:我的文档)?(不要用标题来判断。)假设我能判断出它是一个资源管理器,那么我如何得到这个资源管理器的地址?简而言之:我只想当鼠标指向一个窗口的时候就能判断是否为资源管理器,是则获得其地址。

解决方案 »

  1.   

    好象要用到SHELLWINDOWS之类的。
      

  2.   

    首先判断窗口是否是浏览器/资源管理器窗口,然后发送WM_USER+7到窗口获得浏览器/资源管理器窗口的IShellBrowser接口,并且从此获得当前文件夹的pidl或者路径
    参考http://weblogs.asp.net/oldnewthing/archive/2004/07/20/188696.aspx
      

  3.   

    呵呵,枚举这个窗口的所有控件,会有两个写着地址的控件,其中一个是地址栏,类名是EDIT的。
      

  4.   

    这有何难?用GetClassName函数获取这个HWND的类名称, 然后判断这个类名称是不是"ExploreWClass"就行了。Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPrivate Sub Form_Load()
        Dim sName As String
        sName = Space(250)
        GetClassName &H80354, sName, 250
        sName = Left(sName, InStr(sName, vbNullChar) - 1)
        If sName = "ExploreWClass" Then 
           ...
        End If
    End Sub
      

  5.   

    修正一下:
        ......
        GetClassName the_HWND_you_got, sName, 250
        ......
      

  6.   

    这个代码还是有点问题,就是如何得到MOUSE下的句柄的父窗体的句柄有问题。
    ------------------------
    FORM:
    Option ExplicitPrivate Sub Form_Load()
        Timer1.Interval = 100
    End SubPrivate Sub Timer1_Timer()
        Dim hWnd1 As Long
        Dim hWnd2
        Dim Cur As POINTAPI
        GetCursorPos Cur
        hWnd1 = WindowFromPoint(Cur.x, Cur.y)
        hWnd2 = GetParent(hWnd1)
        If hWnd2 = 0 Then hWnd2 = hWnd1    EnumChildWindows GetParent(hWnd2), AddressOf WndEnumChildProc, 0&
    End Sub
    ---------------------------
    MODULE:
    Option ExplicitPublic Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
    Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Public Declare Function EnumChildWindows Lib "user32" (ByVal hwndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Any) As Long
    Public Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPublic Const WM_GETTEXT = &HD
    Public Const WM_GETTEXTLENGTH = &HEPublic Type POINTAPI
        x As Long
        y As Long
    End TypePublic Function WndEnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
        Dim bRet As Long
        Dim myStr As String * 50
        bRet = GetClassName(hWnd, myStr, 50)
        If bRet <> 0 Then
            If UCase(Left(myStr, 4)) = "EDIT" Then Debug.Print GetText(hWnd)
        End If
        WndEnumChildProc = 1
    End FunctionFunction GetText(ByVal hWnd As Long) As String
        Dim Textlen As Long
        Dim Text As String    Textlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)
        If Textlen = 0 Then Exit Function
        Textlen = Textlen + 1
        Text = Space(Textlen)
        Textlen = SendMessage(hWnd, WM_GETTEXT, Textlen, ByVal Text)
        GetText = Left(Text, Textlen)
    End Function
      

  7.   

    如果用枚举法就不是你MOUSE下的窗口了,用上面贴的还很难找到自己父窗体的句柄。
    用API GetParent也不行。
      

  8.   

    呵呵, 这么快就回帖了。我上面的“楼上”是指jadeluo 。 dongge2000(※秋日私语※:非[版务].灌!) 谢谢你“如何得到MOUSE下的句柄的父窗体的句柄”这个我自己能够搞定!
      

  9.   

    我知道用枚举SHELLWINDOWS窗口能够得到当前的所有IE和资源管理器的窗口的标题和URL。我的最新思路是:
       首先,枚举所有的SHELLWINDOWS窗口的句柄,再得到当前鼠标指向的窗口的句柄(HWND),然后将鼠标指向的窗口的句柄与枚举的窗口的句柄进行比较,找到则说明该窗口是IE或资源管理器窗口。再用将该对象赋给临时的INTENNETEXPLORER对象,就可以对其进行操作了。比如tWindow.GOBACK(后退)。   大家觉得如何??但我觉得如果能实现的话,好象速度会很慢的,而且必须时刻枚举。另“枚举所有的SHELLWINDOWS窗口的句柄”的时候遇到了点问题,等会再说。
      

  10.   

    呵呵,我写的TIMER是一秒运行一次,就是太占系统资源了。你再加个MOUSE的操作。
    -----------------
    Option ExplicitPublic Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public Type POINTAPI
        x As Long
        y As Long
    End TypePublic Type DGfor3
        ponX As Long
        ponY As Long
        MDC As Long
    End TypePublic Function MouseDC() As DGfor3
        On Error Resume Next
        Dim Cur As POINTAPI
        GetCursorPos Cur
        MouseDC.MDC = WindowFromPoint(Cur.x, Cur.y)
        MouseDC.ponX = Cur.x
        MouseDC.ponY = Cur.y
    End Function
      

  11.   

    楼主写完贴出来,大家共享先!我还不会SHELLWINDOWS呢!
      

  12.   

    Option ExplicitPrivate Sub Command1_Click() '向上用
        Dim Arr() As String
        Dim i As Long
        Dim sRet As String
        Dim Str As String
        Str = Text1.Text
        If Right(Str, 1) = "\" Then Str = Left(Str, Len(Str) - 1)
        Arr = Split(Str, "\")
        For i = LBound(Arr) To UBound(Arr) - 1
            If Len(Arr(i)) > 0 Then
                sRet = sRet & Arr(i) & "\"
            End If
        Next
        MsgBox sRet
    End SubPrivate Sub Timer1_Timer() 'timer1.Interval=3000,后退用
        SendKeys Chr(8)
    End Sub
      

  13.   

    '一个按钮,两个LISTBOX。
    '请引用 Microsoft Internet Controls
    Private Sub Command1_Click()    Dim objIE As InternetExplorer
        Dim dWinFolder As New ShellWindows
        
        For Each objIE In dWinFolder        List1.AddItem objIE.hWnd '为什么这一句会出现“自动化错误”呢?你们测试一下会不会?        List2.AddItem objIE.LocationURL
        NextEnd Sub如果把那一句去掉就正常????为什么呢?
      

  14.   

    Option Explicit
    Dim MyWin As ShellWindowsPrivate Sub Form_Load()
        Set MyWin = New ShellWindows
        Timer1.Interval = 1000
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Set MyWin = Nothing
    End SubPrivate Sub Timer1_Timer()
        If MyWin.Count = 0 Then Exit Sub
        Dim i As Long
        For i = 0 To MyWin.Count - 1
            If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then
                Dim Str As String
                Str = Right(MyWin(i).LocationURL, Len(MyWin(i).LocationURL) - 8)
                Text1.Text = Replace(Str, "/", "\")
            End If
        Next
    End Sub
    ------------------------------
    Option Explicit
    Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Public Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public Type POINTAPI
        x As Long
        y As Long
    End TypePublic Type DGfor3
        ponX As Long
        ponY As Long
        MDC As Long
    End TypePublic Function MouseDC() As DGfor3
        On Error Resume Next
        Dim Cur As POINTAPI
        GetCursorPos Cur
        MouseDC.MDC = WindowFromPoint(Cur.x, Cur.y)
        MouseDC.ponX = Cur.x
        MouseDC.ponY = Cur.y
    End FunctionPublic Function TitleToWnd(ByVal strTitle As String, Optional strClassName As String = vbNullString) As Long
        TitleToWnd = FindWindow(strClassName, strTitle)
    End FunctionPublic Function WndToProcId(ByVal hwnd As Long) As Long
        GetWindowThreadProcessId hwnd, WndToProcId
    End Function
    ---------------
    FORM1中有一个TEXT、TIMER。
      

  15.   

    viena(维也纳nn-实心木头人石欠RUKYO) ( ) 信誉:1 靠,强
      

  16.   

    jiangsheng(蒋晟.MSMVP2004Jan)谢谢你。不过那好象是C语言写的吧?我看不懂啊。有没有关于用VB写的呢?
      

  17.   

    我的思路遇到难题了!!'一个按钮,两个LISTBOX。
    '请引用 Microsoft Internet Controls
    Private Sub Command1_Click()    Dim objIE As InternetExplorer
        Dim dWinFolder As New ShellWindows
        
        For Each objIE In dWinFolder        List1.AddItem objIE.hWnd '为什么这一句会出现“自动化错误”呢?你们测试一下会不会?        List2.AddItem objIE.LocationURL
        NextEnd Sub如果把那一句去掉就正常????为什么呢?不知道该如何解决》
      

  18.   

    For i = 0 To MyWin.Count - 1
            If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then
                Dim Str As String
                Str = Right(MyWin(i).LocationURL, Len(MyWin(i).LocationURL) - 8)
                Text1.Text = Replace(Str, "/", "\")
            End If
        Next
    --------------
    我这句怎么就行呢,楼主没有看吗?
      

  19.   

    TO:dongge2000
       非常感谢你的帮助。你的代码我也试了。但是VB老是提示错误。
    运行到“If WndToProcId(MyWin(i).hwnd) = WndToProcId(MouseDC.MDC) Then”中的“MyWin(i).hwnd”就提示:对象HWND的方法‘IWebBrowser2’失败。晕啊!还有我说的代码中出现“objIE.hWnd ”也失败啊!真是搞不懂。
    唉,结帖,另开新帖!