我要实现以下功能:当双击某程序或文件时,在memo中将标题显示出来,如:  新建Microsoft Word文档.doc - Microsoft Word
  try.txt - 记事本
  CSDN 社区中心 - Microsoft Internet Explprer 尝试用钩子实现,捕捉HSHELL_WINDOWCREATED消息,然后用GetWindowText获取标题,并不能如愿。得到的只是Microsoft Word、Microsoft Internet Explprer等,并不能得到完整的标题名。我理解是HSHELL_WINDOWCREATED捕捉的只是窗口创建的时刻,其内容还未来得及加载,所以得不到全名。  不知道哪位大侠做过类似的工作,能否告知一二?多谢了!

解决方案 »

  1.   

    这个很简单啊,双击文件打开,主程序是在窗口创建后再加载的,这是一个REDRAW过程,所以你要在HSHELL_REDRAW下面去获取。
      

  2.   

    谢谢Forever_Young。我尝试了一下,打开一个名为“新建 Microsoft Word 文档 (2).doc”的文档,结果获得四个窗口标题,分别如下所示,最后一个才是对的。而最后一个才是我想要的结果,这是为什么呢?请问该怎么做?
    2011-01-24   00:16:39
    Microsoft Word
    C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE
    2011-01-24   00:16:39
    Microsoft Word
    C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE
    2011-01-24   00:16:39
    Microsoft Word
    C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE
    2011-01-24   00:16:39
    新建 Microsoft Word 文档 (2).doc - Microsoft Word
    C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE
      

  3.   


    OFFICE根据不同版本也不一样的,如果对结果的要求很严格,想办法做个判断看行不,也可以在HSHELL_WINDOWCREATED下做个sleep(500)的延时,但是这个延时的准确性受制于机器性能,不过一般也没问题,我想的话最好还是在REDRAW下面获取。
      

  4.   


    如果你只想捕获CREATE和REDRAW那就在消息处理的前面加上  If (Msg.wParam <> HSHELL_WINDOWCREATED) and
         (Msg.wParam <> HSHELL_REDRAW) Then Exit;这样就只捕获CREATE和REDRAW了
      

  5.   

    感谢Forever_Young的回答。不过还是有问题:
    1、通过延时的方法大概不是很好的办法,因为有的程序打开比较慢。比如记事本打开很快,而word打开则比较慢,有时候要好几秒才能打开,所以如何设置一个合适的延时时间是个问题。
    2、利用HSHELL_REDRAW捕捉标题,当关闭窗口时不知道怎么也能捕捉到标题,不过是乱码。我理解是因为只要窗口刷新,就会激活HSHELL_REDRAW消息,而一个窗口从启动到关闭,会有很多次刷新。所以这也是一个麻烦的事情。
      

  6.   

    更正一下你的说法,HSHELL_REDRAW只有在图标和标题发生变化时才传递的,一个程序在关闭之前除非特殊情况应该不可能多次更改标题和图标,比如一个音乐播放器,在转换歌曲时标题发生变化,消息才会捕获到。WORD加载文件确实是个例外,可能跟它是DDE关联打开方式有关系。
      

  7.   

    嗯,现在主要问题是在启动程序后,HSHELL_REDRAW消息捕获了好几次。我希望启动程序后,能像windows任务管理器一样,显示程序的完整标题。任务管理器中的应用程序应该是用EnumWindows枚举实现的,但是如何捕捉新启动的窗口,然后像任务管理器一样显示标题呢?
      

  8.   

    还有个思路提供给你,应该可以完美解决,结合listview编写代码,把数据放入items.data,然后把REDRAW当数据更新用,这时候对比句柄存在的数据就被替换成最后一次REDRAW获取的数据显示出来了,而且这样代码简洁,也不用采取延时的做法了。