永发信息网

setForegroundWindow 的使用方法

答案:5  悬赏:0  手机版
解决时间 2021-04-05 07:15
setForegroundWindow 的使用方法
最佳答案
SetForegroundWindow函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
全部回答

函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
函数原型:BOOL SetForegroundWindow()。
返回值:如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。
备注:前台窗口是z序顶部的窗口,是用户的工作窗口。在一个多任务优先抢占环境中,应让用户控制前台窗口。
先打开一个记事本,让他不是当前窗口(无焦点)。程序里建一个Command1,单击按钮看看效果。
代码如下。
=================
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
Dim h As Long
h = FindWindow("notepad", vbNullString)
SetForegroundWindow h
End Sub
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
家鸽的呼吸中对飞翔有重要意义的结构是(  
逆变电焊机哪个牌子好,电焊机哪个品牌好
一密度计分别放入甲、乙两种液体中时的情况如
单选题中国古代的海外移民是侨居性的移民。华
在PHP中函数bcpow 是什么意思
用红酒来比喻友情的句子
怎么炖鹅
把老师讲课扩到二十字以上的句子
修改病句 (1分)宽带网不仅能浏览信息、收发电
杭州好还是广州好呢
刚入手小米5X屏幕是EGGB是什么牌子
请问每天晚上吃火锅会发胖吗
柚子和什么一起榨好喝,柚子和什么一起榨汁好
灯泡上1702代表什么?
迅云服务器防御如何
推荐资讯
那些话说到心坎里诗句,他很少说话.他的话句句
—CouldyoutellJerrythemanageriswantinghimw
想知道: 邵阳市 从隆回县到五峰铺镇中心中学
怎么识别iPad是几代??
崇明哪里可以处理电子警察违章
为什么我下的PHOTOSHOP字体都添加到电脑字体
7.8, (),5.6 ,4.5,找规律急!!!
可视门铃在德国一般叫什么?用德语回答
二手房乔迁有什么讲究,迁入新宅和搬家有什么
有个电视节目主持人:只管大胆胡说,绝不真实
我想做ppt有什么好的建议?
丧尸是怎样炼成的最新章节,文轩宇,丧尸是怎
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?