有一个扭按Button1,单击它,我要实现的功能是获取当前活动窗口的句柄,如果窗口都被最小化了,则获取到最后一个被最小化的窗体句柄。问题的核心是:如何获取到最后一个被小最化的窗体?我首先想到了用钩子,用SetwindowsHookEx(WH_CALLWNDPROC , HookProc, HInstance, 0)。
直接截获所有窗口的最小化事件,只要有窗口被最小化,就把这个窗口的句柄记下来。那么,最后记录的句柄就是我要的句柄。可是钩子我总是写不好,执行时出错,把Explorer.exe都搞崩溃了好多次。求这段钩子的完整写法。最好是不用要DLL的。如果不用钩子,有其它方法达到我要实现的功能,也可以。小发现:其实FindWindow就可以实现我要的效果,该函数可以获取到最后一个被最小化的窗体句柄,但我要控制所有窗体,类名不同,所以无法使用该函数。

解决方案 »

  1.   

    EnumWindows
    IsIconic
    GetLastActivePopup
      

  2.   

    EnumWindows 
    IsIconic 
    GetLastActivePopup
      

  3.   

    我记得Zswang有一篇文章的,终于给找到了:http://blog.sina.com.cn/s/blog_589d32f501000b7u.html楼主先自己研究一下。Delphi的代码在C#代码后面。
      

  4.   

    EnumWindows 
    IsIconic 
    GetLastActivePopup
      

  5.   

    遍历窗口我有最好的方法,Zswang的方法我看了,他想实现什么?读取任务栏上的所有标题吗?不是我需要的。用EnumWindows可以,不过还需要用IsWindowVisible(hwnd)来过滤掉不可视的窗口。其实遍历窗口可以直接用IShellWindows类,非常简单的。不过这并不是我的核心问题。
    看了一下GetLastActivePopup函数的帮助,楼上的几位朋友是不是让先遍历窗口,然后根据得到的句柄逐个 if GetLastActivePopup(hwnd)=hwnd then 吗?