如题。我想得到如打开"我的电脑->C:"这个Explorer.exe进程窗口地址栏内容也(就是"C:\"),和这个窗口客户区域显示的文件内容(也就是C:\下所有文件夹或文件名字)
现在我通过hook程序获得了窗口的句柄HWND,但是不知道如何获得窗口地址栏内容。困扰我几天了,期待大家解答

解决方案 »

  1.   

    1、先得到窗口文本的大小
    int iLength= (int)SendMessage(Hwnd,WM_GETTEXTLENGTH,0,0);
    2、给szText分配内存
    3、取得窗口文本内容
    SendMessage(Hwnd,WM_GETTEXT,iLength+1,(LPARAM)szText);
      

  2.   

    感谢大家回复
    1楼和2楼我都有试,但是获得的都是caption(窗口标题)。我需要获得窗口显示的当前文件夹下的内容,或者获得地址栏的内容我可以顺着路径找。总之是要得到窗口显示的全部文件夹名字和文件名字
    如图
      

  3.   

    用FindWindowEx取窗口句柄之后再枚举到子窗口句柄,然后再用GetWindowText
      

  4.   

    有点进展了。
    使用鼠标hook函数,当鼠标悬停在地址栏时GetWindowText能得到地址栏内容,悬停在客户区域时GetWindowText得到FolderView。这样是通过鼠标悬停得到这2个子窗口的句柄。
    我最终希望能通过父窗口句柄得到地址栏和客户区域这2个窗口句柄。7楼说枚举到子窗口句柄,是用EnumChildWindows函数么?那么枚举到的窗口句柄我如何分辨哪个是地址栏的和客户区域的?
      

  5.   

    先WindowFromPoint,然后再循环调用RealChildWindowFromPoint,这个方法我以前用过,可以获得地址栏窗口文本
      

  6.   

    感谢9楼
    看了MSDN,这2个函数都需要提供Point,这个Point我恐怕不能提供。
    我目前能得到窗口的父窗口句柄(HWND),我想通过这个句柄得到地址栏和客户区域
      

  7.   

    顶层窗口句柄 + FindWindowExclass = ReBarWindow32
      class = ComboBoxEx32
        class = ComboBox
          class = Edit
            GetWindowText
      

  8.   

    自己用spy++看一下shell窗口的层次结构就清楚了。
    注意:不同OS版本的层次可能不一样。刚才上面发的xp的
      

  9.   

    11楼我用了你的方法,但是FindWindowEx找不到指定子窗口,返回NULL
    我首先枚举出所以子窗口,用GetClassName得到每个子窗口类名,打印出来
    显示出地址栏内容有2个类名:ComboBoxEx32和Edit
    显示客户区域(FolderView)类名:SysListView32
    然后使用FindWindowEx(父窗口HWND, NULL, 子窗口类名, NULL)
    我2次调用FindWindowEx 分别传入Edit和SysListView32返回的HWND都是NULL
    郁闷
      

  10.   

    原来子窗口也是分层的
    看了Spy++发现一个父窗口中也有许多子的父窗口,而不是全部子窗口平级。一些子窗口分别属于不同子父窗口。
    如果要找到Edit子窗口句柄,需要顶层父窗口->WorkerW->ReBarWindow32->ComboBoxEx32->ComboBox->Edit
    汗这么晚了下班先
      

  11.   

    用SPY++去看一下就知道这个程序的子控件是如何分布的了。