setforegroundwindow(setforegroundwindow作用)

http://www.itjxue.com  2023-01-29 09:05  来源:未知  点击次数: 

setForegroundWindow 的使用方法

setForegroundWindow 的使用方法如下:

SetForegroundWindow函数将创建指定的窗口,并激活到前台窗口的线程 。键盘输入窗口,并为用户更改不同的视觉线索。该系统分配一个优先略高前景的窗口,比它其他线程创建的线程。 语法

BOOL SetForegroundWindow( HWND HWND ); 参数 HWND

[in]应该被激活,并带到前景的窗口句柄。 返回值

如果窗口被带到前台,返回值为非零。 如果窗口不带到前景,返回值是零。 备注

Windows 98/Me的系统限制哪些进程可以设置前台窗口。一个进程可以设置前台窗口,仅当下列条件之一为真 :

这个过程是前台进程。

这个过程是由前台进程的开始。

过程中收到的最后一个输入事件。

没有前台进程。

前台进程正在被调试。

前景不被锁定(见LockSetForegroundWindow)。 前景锁定超时已过期(看到

SPI_GETFOREGROUNDLOCKTIMEOUTSystemParametersInfo)。 Windows 2000/XP的:没有菜单处于活动状态。

这一变化,应用程序不能强制一个窗口到前台,而用户是另一个窗口的工作。相反,前台和后台的Windows激活窗口(见 SetActiveWindow)和调用函数通知用户 。然而,在Microsoft Windows 98和Windows Millennium Edition(Windows Me)中,如果一个nonforeground线程调用SetForegroundWindow,并通过一个没有被调用线程创建的窗口的句柄,窗口不闪现在任务栏上。SetForegroundWindow行为相同的,因为它没有在Windows 95和Microsoft Windows NT 4.0,安装应用程序时,更改前景色锁超时值 。这可以从下面的函数调用设置或安装应用程序:

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);

这种方法允许在Windows 98/Windows Me和Windows 2000/Windows

XPSetForegroundWindow行为作为Windows 95和Windows NT 4.0相同,分别为所有应用程序,。安装应用程序,这样做是使用户是不会改变的行为感到惊讶的用户发出警告。在Windows上的Windows 2000和Windows XP,调用失败,除非调用线程可以改变前台窗口,因此必须从一个安装或修补应用程序调用。欲了解更多信息,请参阅前景和背景窗口。

一个过程,可以设置前台窗口可以使另一个进程通过调用前台窗口

AllowSetForegroundWindow功能。dwProcessId和所指定的过程中失去了到前台窗口设置下一次输入用户生成的能力,除非输入是在这个过程中,或在下一次进程调用AllowSetForegroundWindow,除非指定过程。

前台进程可以禁用调用SetForegroundWindow调用的LockSetForegroundWindow函数。

保证SetForegroundWindow成功

在SetForegroundWindow之前比较早的时候(比如main函数里)调用一下以下代码:

DWORD dwTimeout = -1;

SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)dwTimeout, 0);

if (dwTimeout = 100) {

SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); }

HWND hForeWnd = NULL;

HWND hWnd= FindWindow(NULL, ""); 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 ); SetWindowPos( hWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); SetForegroundWindow( hWnd );

AttachThreadInput( dwCurID, dwForeID, FALSE);

第一段代码:

后果是如果执行到if里面的语句,会因为user profile的更改回写和WM_SETTINGCHANGE的广播而导致这个API调用本身卡两三秒。 第二段代码:

设置当前某窗口为当前窗口,有几个步骤要做: 1.得到窗口句柄FindWindow

2.切换键盘输入焦点AttachThreadInput

3.显示窗口ShowWindow(有些窗口被最小化/隐藏了)

4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原

5.最后SetForegroundWindow

SetForegroundWindow失效的问题

试验出来的SetForegroundWindow失效的情况之一,是窗口被最小化了。解决的方法是

网上的万金油做法是

感觉SetWindowPos也不是必须的

SetForegroundWindow在64位Windows怎么用

SetForegroundWindow函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。

关于 VB 中使用 SetForeGroundWindow API 函数的问题

1.autoredraw=true当然是可以的

只是每次绘制以后(绘制完成后)都要refresh一下才能显示内容。

2.可以bitblt到一个memdc,然后统一把memdc

bitblt

到图片框dc上;

form_paint中也要把memdc

bitblt

到窗体dc上

这个是双缓存

其实就是(1).

WinAPI的SetForegroundWindow和SwitchToThisWindow有什么区别?

SwitchToThisWindow这个是遗留函数,也就是微软为了和以前版本windows兼容而留下来的,以后的版本可能会被移除。

SetForegroundWindow就是推荐的函数。

SetActiveWindow这三者有什么区别和联系 SetActiveWindow不能激活后台程序,也就是窗口被隐藏了,不能用它激活。

(责任编辑:IT教学网)

更多

推荐Frontpage教程文章