博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SetForegroundWindow
阅读量:5126 次
发布时间:2019-06-13

本文共 3147 字,大约阅读时间需要 10 分钟。

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);   

 

 

.net程序调用API的时候,经常会遇到关于GetActiveWindow和GetForegroundWindow的使用,但是二者的区别到底是什么?什么时候该用GetActiveWindow?什么时候该用GetForegroundWindow呢?

其实从二者的字面意思就可以看到区别:GetActiveWindow:获取系统当前激活的窗口,也可以理解为获取焦点的窗口;GetForegroundWindow:获取系统当前最顶层窗口。

最前的窗口不一定是激活的窗口。比如说qq的主窗口,只要不靠到屏幕边上,就是总在最前的,你拖放一个ie过去是挡不住的,这时候,你用GetActiveWindow得到的是有焦点的ie窗口,用GetForegroundWindow得到的是qq的窗口。这个例子很直观。

需要验证的朋友可以自己动手试试看,就能体会到GetActiveWindow和GetForegroundWindow二者的区别了。

转载于:https://www.cnblogs.com/dengpeng1004/p/5049280.html

你可能感兴趣的文章
物联网通讯与普通短信通讯的区别和要注意的地方
查看>>
MySQL table_id原理及风险分析
查看>>
Clone Graph
查看>>
人生最值得你去做的30件事
查看>>
Asp.Net Core中利用Seq组件展示结构化日志功能
查看>>
动态SQL现实一个表中求多列的和
查看>>
android编译openssl静态库.a
查看>>
maven依赖非maven库中jar的两种方法
查看>>
前端开发工程师面试题之综合篇
查看>>
fastjson 的使用
查看>>
UIScrollview使用
查看>>
CAniamtion 基本使用
查看>>
新型的Hbb项目目录结构
查看>>
Spring容器使用中出现 Access denied for user 'Administrator'@'localhost' (using password: YES)
查看>>
阅读思考作业2
查看>>
项目:jSon和Ajax登录功能
查看>>
最值得阅读学习的 10 个 C 语言开源项目代码
查看>>
基于Go语言构建区块链:part4
查看>>
iOS编程之UIPickerView
查看>>
akoj-1272-字母统计
查看>>