SetForegroundWindow、SetActiveWindow、SetFocus 如何将一个某个窗口提到最顶层
http://hi.baidu.com/gookings/item/2b7912ca8d5b3625a0b50aa2
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);
SetForegroundWindow、SetActiveWindow、SetFocus 如何将一个某个窗口提到最顶层的更多相关文章
- SetForegroundWindow以及 如何将一个某个窗口提到最顶层(转)
http://hi.baidu.com/gookings/item/2b7912ca8d5b3625a0b50aa2 SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到 ...
- BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()
1. SetActiveWindow() 原型: <span style="font-size:14px;">CWnd* SetActiveWindow(); HWND ...
- 2016.5.30让窗口处于最顶层的方法,比TopMost灵活
最简单的方法Form. Activate() 稍复杂的方法用API,目前没有看出比第一种方法有什么好处(可操作其它窗口,这就是好处2016.7.31) [System.Runtime.InteropS ...
- SetForegroundWindow
SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- 用C#调用Windows API向指定窗口发送按键消息 z
用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.Interop ...
- 用C#调用Windows API向指定窗口发送按键消息
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
- delphi API: SetWindowPos改变窗口的位置与状态
SetWindowPos 函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序.子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序.顶层窗口设置的级别最高,并且被设置为Z序 ...
- widnows 使用WIN32 APi 实现修改另一打开程序的窗口显示方式
1.GUI点击打开一个程序那边做一个判断. hwnd = 获取目标程序窗口句柄: if(hwnd == NULL /*不存在目标程序窗口句柄*/){ 创建进程,打开目标程序: } else{ ...
随机推荐
- SVN 如何更换IP地址
一.进去项目空白处. 二.点击右键TortoiseSVN. 三.选中Relocate. 四.弹出框如下: 把原来的IP地址更换成新的IP地址,再点击OK就可以了.
- 微信公众平台:微信JS-SDK Demo
ylbtech-微信公众平台:微信JS-SDK Demo 1. HTML返回顶部 1.demo.html <!DOCTYPE html> <html> <head> ...
- 网卡流量检测.py
network_speed网卡流量检测 #!/usr/bin/env python #coding:utf-8 import sys import os import atexit import ti ...
- jQuery.validator.addMethod方法的使用
该方法有三个api接口参数,name,method,messages addMethod(name,method,message)方法 参数 name 是添加的方法的名字. 参数 method 是一个 ...
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ...
- 【Linux学习】Linux系统管理2—作业调度
Linux系统管理2-作业调度 at: 作业仅执行一次就从系统工作队列中取消 语法 denny@ubuntu:~$ at [-m] TIME → 作业命令at ...
- C++多态性:虚函数的调用原理
多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数. 一个函数说明为虚函数,表明在继承的类中重载这个函数时 ...
- Swift3.0 轮播图
使用三个UIButton实现无限轮播:https://github.com/LXfeiYu/LXCarouselImages.git 喜欢的朋友给个星!!! 功能: 1.可以选择开启和关闭定时器 2. ...
- Linux下更改mysql版本
想要更改linux的mysql版本,并不需要重装系统重新选择mysql版本,只需要删除掉原来的mysql然后在安装新的就可以啦 (谨记:一定要做好数据库备份) 详情请参照:大牛博客 over!over ...
- 萌新java入门笔记
首先声明以下内容只是散乱笔记,如果有误还望大侠指出!不胜感激! 基本数据类型: 大体和C语言类似: boolean truth = true;//逻辑型 //文字型 char c; String st ...