设置前台(前景)窗口
来源:互联网 发布:js正则表达式手机号码 编辑:程序博客网 时间:2024/05/15 15:32
更新日期:2010-12-30
━━━━━━━━━━━━━━━━━━━━━━━━
一、当需要激活的窗口是其他程序的窗口时,很简单,如下:
HWND hWnd=::FindWindow("Notepad",NULL);
::ShowWindow(hWnd,SW_RESTORE);
::SetForegroundWindow(hWnd);
二、当需要设置的窗口是自己程序的窗口。上面的代码就无效了。原因如下:
Windows 9x/2000中SetForegroundWindow函数当用户正在操作其他窗口
时是不能强制某个窗口为前景窗口的,而是激活窗口并调用FlashWindowEx函数来通知用户。
三、解决方法:
方法一、(最理想的)
/****************************************************************************
将窗口设置为前景窗口。
关键API的使用::AttachThreadInput,这个API是连接两个线程的,使其共享输入焦点,键盘状态等等。
通常,系统内的每个线程都有自己的输入队列。本函数(既“连接线程输入函数”)允许线程和进程共享
输入队列。连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态
调用这个函数时,会重设键盘状态。参数类型前的IN表示这个参数是输入参数,可以当它没有。
****************************************************************************/
void MySetForegroundWnd(HWND hWnd)
{
HWND hCurWnd = NULL;
DWORD dwMyID;
DWORD dwCurID;
hCurWnd = ::GetForegroundWindow();
dwMyID = ::GetCurrentThreadId();
dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
::AttachThreadInput(dwCurID, dwMyID, TRUE);
::SetForegroundWindow(hWnd);
::AttachThreadInput(dwCurID, dwMyID, FALSE);
if (IsIconic(hWnd)) //最小化时还原它
::ShowWindow(hWnd,SW_RESTORE);
}
方法二、(不是很理想)
/****************************************************************************
如何激活指定的窗口事件
我们知道,Windows 9x/2000中SetForegroundWindow函数当用户正在操作其他窗口
时是不能强制某个窗口为前景窗口的,而是激活窗口并调用FlashWindowEx函数来通知用户。
但是很多实际情况要求将激活窗口的同时将创建这个窗口的线程置为前景状态。碰到这种
情况我们可以使用USER32.DLL中的几个未公开API函数。
void SwitchToThisWindow (
HWND hWnd, // 被激活的窗口句柄
BOOL bRestore // 如果被极小化,则恢复窗口
);
****************************************************************************/
void MySetForegroundWnd2(HWND hWnd)
{
//必须动态加载这个函数
HMODULE hUser32=GetModuleHandle("user32");
if (hUser32)
{
void (WINAPI*SwitchToThisWindow)(HWND,BOOL)=
(void(WINAPI*)(HWND,BOOL))GetProcAddress(hUser32,"SwitchToThisWindow");
if (SwitchToThisWindow)
{
::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SwitchToThisWindow(hWnd,true);
::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
FreeLibrary(hUser32); //释放调模块句柄
}
}
}
━━━━━━━━━━━━━━━━━━━━━━━━
推荐:
谈老师的BLOG (佛教大德)
狮姐的博客(狮子窝,学佛与灵魂之探究)
大方广(学习传统文化)
慈善点击(轻松一点,行善积德,何乐不为)
电影《地球公民》(揭示不为人知的一面)
心向光明 远离邪淫(现世警钟,不可不看)
戒淫(上篇)(正淫节欲,戒除邪淫)
戒淫(中篇)(纵欲之乐,忧患随之)
公民教育——命由我造
- 设置前台(前景)窗口
- windows判断窗口是否置顶、设置取消置顶、设置前景
- OSG 设置背景,前景
- OSG 设置背景,前景
- OSG 设置背景,前景
- 将某个窗口置为前景窗口
- 理解焦点窗口,活动窗口与前景窗口
- QT设置前景图位置
- 设置导航栏前景颜色
- 使当前窗口为前台窗口
- 设置窗口大小(包括设置Dialog的窗口)
- 窗口设置(流布局)
- 前景
- 前景
- windows程序窗口层次Z-order,顶层窗口,前台窗口,后台窗口,兄弟窗口,活动窗口
- Windows程序窗口层次Z-order,顶层窗口,前台窗口,后台窗口,兄弟窗口,活动窗口
- windows程序窗口层次Z-order,顶层窗口,前台窗口,后台窗口,兄弟窗口,活动窗口
- 前景图片alpha通道值的设置
- 测试
- jWebSocket for Android
- 我心中的linux,和我如何用GNU linux工作!【强帖,精彩,真精彩】
- 10.Composite(结构型模式)
- ZFS的调优的文章
- 设置前台(前景)窗口
- 类与对象总结
- 产品经理都是大情圣
- 关于remotes/origin/HEAD -> origin/master
- Oracle与SQL Server事务处理的比较
- 隐藏,引用父类的虚函数
- 腾讯系统工程师面试题 解答
- poj 2387 Til the Cows Come Home(最短路水题 = =)
- Eclipse与jetty插件(Jetty Launcher插件)的安装和使用(一)