如何在程序中将一个被其它程序遮住的窗口激活并弹出到所有窗口的最前面?
用setforwindows吗,那窗口句柄怎么获得啊????用什么函数啊?/????

解决方案 »

  1.   

    一个完整的将某个窗口置前的过程(例如QQ用户登录窗口):
            HWND   hForeWnd   =   NULL;   
            HWND hWnd=::FindWindow(NULL,"QQ用户登录");  
            DWORD   dwForeID;   
            DWORD   dwCurID;     
            hForeWnd   =   ::GetForegroundWindow();   
            dwCurID   =   ::GetCurrentThreadId();   
            dwForeID   =   ::GetWindowThreadProcessId(   hForeWnd,   NULL   );   
            ::AttachThreadInput(   dwCurID,   dwForeID,   TRUE);  //获取输入焦点
            ::ShowWindow(   hWnd,   SW_SHOWNORMAL   );   //显示隐藏窗口
            ::SetWindowPos(   hWnd,   HWND_TOPMOST,   0,0,0,0,   SWP_NOSIZE|SWP_NOMOVE   );   //设置Z-Order
            ::SetWindowPos(   hWnd,   HWND_NOTOPMOST,   0,0,0,0,   SWP_NOSIZE|SWP_NOMOVE   );   //还原Z-Order
            ::SetForegroundWindow(   hWnd   );   
            ::AttachThreadInput(   dwCurID,   dwForeID,   FALSE);
      

  2.   

    CString winTitle;
    winTitle.LoadString(IDR_MAINFRAME);
    CWnd* pWnd = CWnd::FindWindow(NULL, winTitle);
    if (pWnd)
    {
            pWnd->SetForegroundWindow();
    if (pWnd->IsIconic())
             {
    pWnd->ShowWindow(SW_RESTORE);
    pWnd->UpdateWindow();
    }
    }
      

  3.   

    窗口句柄的获得 
    关键字     win32 API窗口句柄 HWND
    初次写文档,文笔不通畅的地方,以及理解错误之处望各位朋友多多指正.这篇文章是关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!可适用于vc、bcb(其他的我没有试,估计可以),本人在bcb环境下试验。首先我会罗列出一些获取句柄的win32 api 函数,然后简单说说他们的用途!最后说说我是怎么理解和应用的。见笑了!可用的win32 api函数:1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)    HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2.HWND WindowFromPoint(POINT& Point)3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)   BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)   BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)   BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)一般用途:       对于第一种,大家都很熟悉,是捕捉句柄的常规武器,FindWindow这两兄弟,可以接受捕捉对象的类名或者窗口标题之一,作为参数,返回一个HWND。可是对于一般群众,不一定知道所有的窗口(包括标题栏、按钮等等)的类名啊!棗可以简单举例,请问你知道桌面图标的窗口的类名吗?而对于窗口标题,有可能会出现相同的标题,有两个窗口棗指一个程序的两个进程,这又是个麻烦吧!好了,这个问题先放放,继续下一组。       第二组,通过win32定义的POINT结构(typedef struct tagPOINT {   LONG x;  LONG y;} POINT),来获得当前鼠标光标位置的窗口HWND,这是最直观的武器!常规操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函数),再用WindowFromPoint。这样,我们几乎可以获得任何打开的有窗口的函数的HWND了!然后通过获取类名的win32 api函数(int GetClassName(  HWND hWnd,   LPTSTR lpClassName,   int nMaxCount ))得到类名棗这里的lpClassName最好用字符数组地址,nMaxCount就是数组的size了,同时,这种方法解决了第一个问题的麻烦!棗我可以把鼠标放在任何地方!*^_^*       第三组,这些是用来列举和处理任何窗口的超级武器!通过组合运用EnumWindows和EnumWindowsProc,EnumChildWindows与EnumChildProc,可以扫描桌面所有窗口并对之处理!我的理解:(这部分用任务驱动式教学方法棗谁让小弟是老师呢!)任务:得到所有的窗口的类名。解决办法1:我们会先想到第三组,可以自桌面窗口开始(它是所有窗口的祖先),依次扫描,获取类名并存之。有点儿像Visual Stdio的Spy++,或者Borland 的WinSight32,具体办法如下:(bcb中)在主程序中,调用EnumWindows,传入YouEnumProc的函数地址作第一个参数,别忘了转换成WNDENUMPROC类型。第二参可NULL。::EnumWindows(reinterpret_cast YouEnumProc,NULL);在YouEnumProc函数中,如果第一参HWND = = NULL,就跳离(return FALSE;),可以结束啦!然后,把类名数组准备好,得到类名,存之。返回真值,继续下一次扫描。看起来并不复杂,是一种函数递归。但是我可会解释!面啊!: p第二种解决方法:简单、直观棗自己想出来的,颇得意首先准备一个时钟,一种存类名方法(我用TMemo)在定时器处理函数中:1、得到当前cursor的点位置2、再用WindowFromPoint,3、然后得到类名,放到TMemo里这样可以用鼠标获得你想要的窗口(包括按钮等),只要鼠标在窗口放一会儿哈哈第三种方法:其实利用FindWindow和循环结构也应该可以总结:其实得到HWND的方法很多,比如知道了窗口层次,依次向下扫在说第三种呢!但我觉得,我的方法最直接有效,你说呢?欢迎大家与我联系,并讨论这个问题!有关这个问题我还有许多疑问,比如HWND与ID的转换,在如IE页面中的表单控件的HWND或ID,还是其他的东东,总之是能识别他的东西这个我很困惑,没办法!不清楚地方,大家要参照MSDN啊!(好东西呀!)
    下面是来自微软的例子,这个枚举所有的窗口,然后向窗口发送关闭的消息。    #include  
         
         BOOL CALLBACK EnumWindowsProc( 
         HWND hwnd, 
         DWORD lParam 
         ); 
         
         // 
         // EnumWindowsProc must be called from a Windows      // application on Windows 95. 
         // 
         int WINAPI WinMain( 
         HINSTANCE hInstance, 
         HINSTANCE hPrevInstance, 
         LPSTR lpCmdLine, 
         int nCmdShow 
         ) 
         { 
         // 
         // Close all open applications. 
         // 
         EnumWindows(EnumWindowsProc, 0); 
         
         // Now do a regular logoff. 
         ExitWindowsEx(EWX_LOGOFF , 0); 
         
         } 
         
         BOOL CALLBACK EnumWindowsProc( 
         HWND hwnd, 
         DWORD lParam 
         )      { 
         DWORD pid = 0; 
         LRESULT lResult; 
         HANDLE hProcess; 
         DWORD dwResult; 
         
         lResult = SendMessageTimeout( 
         hwnd, 
         WM_QUERYENDSESSION, 
         0, 
         ENDSESSION_LOGOFF, 
         SMTO_ABORTIFHUNG, 
         2000, 
         &dwResult); 
         
         if( lResult ) 
         { 
         // 
         // Application will terminate nicely, so let it. 
         // 
         lResult = SendMessageTimeout(
         hwnd, 
         WM_ENDSESSION,
         TRUE,      ENDSESSION_LOGOFF, 
         SMTO_ABORTIFHUNG, 
         2000, 
         &dwResult); 
         
         } 
         else // You have to take more forceful measures. 
         { 
         // 
         // Get the ProcessId for this window. 
         // 
         GetWindowThreadProcessId( hwnd, &pid );
         // 
         // Open the process with all access. 
         // 
         hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
         // 
         // Terminate the process. 
         // 
         TerminateProcess(hProcess, 0); 
         } 
         // 
         // Continue the enumeration. 
         // 
         return TRUE; 
         }