attachthreadinput setForegroundWindow 的使用方法
其实attachthreadinput的问题并不复杂,但是又很多的朋友都不太了解setForegroundWindow 的使用方法,因此呢,今天小编就来为大家分享attachthreadinput的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
SetActiveWindow为什么不能激活最小化的程序窗口
函数功能:该函数激活一个窗口。该窗口必须与调用线程的消息队列相接洽关系。//细心看看这句大大另一方闷匠,SetForegroundWindow窗口函数激活一个窗口并将其强迫为前台的。当应用法度榜样要显示关键缺点或须要用户急速留意的信息时,应只能调用SetForegroundWindow函数。函数原型:HWND SetActiveWindow(HWND hWnd);参数: hWnd:将被激活的最顶层窗口。返回值:若函数调用成功,则返回本来晃荡窗口的句柄。若函数调用掉败,则返回值为NULL。若要获得更多缺点信息,可声调用GetLastError函数。备注:SetActiveWindow函数激活一个窗口,但当应用法度榜样处于后台时,将不激活指定窗口。当应用法度榜样激活窗口时处于前台,则窗口将被放到前台。若hWnd参数指定的窗口是被调用线程创建的,调用线程的晃荡窗口的状况将被设置到hWnd中。不然,调用线程的晃荡窗口的状况被设为NULL。应用AttachThreadInput函数可将一个线程的输人处理连接到其他线程。这使得调用SetActiveWindow函数的线程可以激活与其他线程的消息队列相干的窗口。
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
OK,本文到此结束,希望对大家有所帮助。