SetForegroundWindow

SetForegroundWindow  函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
  函数原型:BOOL SetForegroundWindow()
  SetForegroundWindow()函数本身是不带参数的,具体激活某个窗口的方法可以用:
  pWnd->SetForegroundWindow();//这里的pWnd即所要激活窗口的句柄。
  返回值:如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。
  备注:前台窗口是z序顶部的窗口,是用户的工作窗口。在一个多任务优先抢占环境中,应让用户控制前台窗口。
  Windows NT 5.0:当用户在另一个窗口中工作时,应用程序不能强行设置一个窗口到前台。相反,SetForeground函数将会激活窗口并且调用FlashWindowEx函数通知用户。
  Windows CE:拥有窗口的线程不具有优先启动权。

  速查:Windows NT;3.1以上版本;Windows;95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib。

SetWindowPlacement  函数功能:该函数设置指定窗口的显示状态和恢复,最大化,最小化位置。
  函及原型;BOOL SetWindowPlacement(HWND hWnd,CONST WINDOWPLACEMENT★lpwndpl);
  参数:
  hWnd:窗口句柄。
  lpwndpl:指向一个WINDOWPLACEMWNT结构的指针,该结构给出了新的显示状态和窗口位置。
  在调用函数SetWindowPlacement之前,将WINDOWPLACEMWNT结构的长度单元置为sizeof(WINDOWPLACEMENT)。如果lpwndpl->length设置不正确,函数SetWindowPlacement将失败。
  返回值:如果函数成功,返回值为非零。如果函数失败,返回值为零。若想获得更多错误信息,请调用callGetLastErro函数。
  备注:如果在WIDNOWPLACEMENT中指定的信息使窗口完全显示在屏幕之外,系统自动调整坐标以使窗口可见,兼顾屏幕设置和多种监视器配置。
  WINDOWPLACEMENT的长度成员信息设置为sizeof(WINDOWPLACEMENT),如果设置不正确,函数将返回FLASE。查看窗口位置坐标的信息,参看WINDOWPLACEMENT。

  速查:Windows NT:3.1以上版本;Windows;95以上版本;Windows CE:不支持;头文件;winuser.h;库文件:user32.lib。

SetForegroundWindow()

SetActiveWindow()

SetFocus()

自己的理解:每个gui线程都有自己的活动窗口,而目前被用户点中那个线程活动窗口叫前台窗口(或叫前景窗口)。而创建前台窗口的线程叫做前台线程(或叫前景线程),前台线程拥有比其它非前景线程更高的优先级,会被windows操作系统优先处理。而所谓的焦点窗口,可以是前台窗口或者是前台窗口的子窗口(控件),如果用户按下键盘按键,windows操作系统会将键盘按键消息发送到当前的焦点窗口。

-------------------------------------

如何将一个某个窗口提到最顶层?网上搜索了一些文章大致有以下几种方法,做个备忘.

问题:有个界面,想定期让其提前(**并显示在用户面前),但又不想用TOPMOST那种置顶方法.我用了SetForegroundWindow,SetActiveWindow,SHOW_WINDOW都不行:程序运行后再打开记事本,时间到我的程序只会在任务栏上闪几下,界面根本出不来怎么办!!(不用顶极窗口,不用鼠标模拟点击)

方法一:
使用定时器,然后在定时器响应函数中定时调用,SetWindowPos()函数,第一个参数写HWND_TOPMOST

方法二:
因为2000/XP改变了SetForegroundWindow的执行方式,不允许随便把窗口提前,打扰用户的工作。可以用附加本线程到最前面窗口的线程,从而欺骗windows。

AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), GetCurrentThreadId(),TRUE); 
SetForegroundWindow(); 
SetFocus(); 
AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), GetCurrentThreadId(),FALSE);

方法三:

如何激活指定的窗口事件    ●    
           我们知道,Windows    9x/2000中SetForegroundWindow函数当用户正在操作其他窗口时是不能强制某个窗口为前景窗口的,而是激活窗口并调用FlashWindowEx函数来通知用户。但是很多实际情况要求将激活窗口的同时将创建这个窗口的线程置为前景状态。碰到这种情况我们可以使用USER32.DLL中的几个未公开API函数。    
   void    SwitchToThisWindow    (    
   HWND    hWnd,        //    被激活的窗口句柄    
   BOOL    bRestore    //    如果被极小化,则恢复窗口    
   );    
   必须动态加载这个函数。    
   typedef    void    (WINAPI    *PROCSWITCHTOTHISWINDOW)    (HWND,    BOOL);    
   PROCSWITCHTOTHISWINDOW    SwitchToThisWindow;    
   HMODULE    hUser32    =    GetModuleHandle("user32");    
   SwitchToThisWindow    =    (    PROCSWITCHTOTHISWINDOW)    
   GetProcAddress(hUser32,    "SwitchToThisWindow");        
   接下来只要用任何现存窗口的句柄调用这个函数即可,第二个参数指定如果窗口极小化,是否恢复其原状态。    
   SwitchToThisWindow(hWnd,    TRUE);

时间: 2024-11-02 21:27:55

SetForegroundWindow的相关文章

SetForegroundWindow的正确用法

在SetForegroundWindow之前比较早的时候(比如main函数里)调用一下以下代码: DWORD dwTimeout = -1; SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)&dwTimeout, 0); if (dwTimeout >= 100) { SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDC

一些窗口API函数,比如SetForegroundWindow,SwitchToThisWindow

SetForegroundWindowSwitchToThisWindow procedure TApplication.BringToFront;varTopWindow: HWnd;beginif Handle <> 0 thenbeginTopWindow := GetLastActivePopup(Handle);if (TopWindow <> 0) and (TopWindow <> Handle) andIsWindowVisible(TopWindow)

将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)

下面这种方法是我见到的最理想的,还有一些其他的方法,像通过SetWindowsPos这个API设置窗口的Z-oder到最顶层,再设置回去.还有通过把当前窗口设置到底层,然后激活目标窗口等等方法. HWND hCurWnd = NULL; DWORD dwMyID; DWORD   dwCurID; hCurWnd = ::GetForegroundWindow(); dwMyID = ::GetCurrentThreadId(); dwCurID = ::GetWindowThreadProce

BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()

1. SetActiveWindow() 原型: <span style="font-size:14px;">CWnd* SetActiveWindow(); HWND SetActiveWindow(hWnd);</span> 功能:该函数激活一个窗口,hWnd:将被激活的最顶层窗口. 返回值:若函数调用成功,则返回原先活动窗口的句柄.若函数调用失败,则返回值为NULL 备注:SetActiveWindow函数激活一个窗口,但当应用程序处于后台时,将不激活指定

猎豹MFC--只运行一个实例CreateMutex() SetForegroundWindow()

在头文件中声明变量,来保存互斥对象,互斥对象是windows的一个内核对象. 在初始化实例中创建互斥对象并进行检查: 在创建窗口的时候: 添加窗口属性标记: 关闭窗口时把属性删除: 当有一个实例在运行时,要找到该实例,把其置为前端:修改之前实例初始化代码的测试代码 来自为知笔记(Wiz)

outdated: 27.Shadows

这次的代码没有按照辅导代码中的来. VK_LEFT/VK_RIGHT/VK_UP/VK_DOWN控制长方体旋转,W/S/A/D/Q/E控制球移动,小键盘的8/5/4/6/7/9控制长方体移动,I/K/J/L/U/O控制光源移动. 在InitGLObject()函数中使用到的readObject()函数.setConnectivity()函数和calculatePlane()函数在3object.h中所写. readObject()函数在.txt文件中读取物体顶点数.顶点坐标.平面数.vertex

python实现自动找茬游戏

http://blog.csdn.net/pipisorry/article/details/46564967 找茬游戏地址[美女大家来找茬] 游戏窗口探查 下载安装PyWin32库(对windows接口的Python封装)http://sourceforge.net/projects/pywin32/,但不能直接点Download图标,不然下下来是一个Readme.txt,点"Browse All Files"寻找需要的版本. 使用spy++找到窗口句柄(或者找到窗口类名lpClas

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实