setForegroundWindow 的使用方法

有没有实例.vb的。窗口置前... 有没有实例. vb的。 窗口置前 展开
 我来答
故事还长ms
高粉答主

推荐于2016-08-17 · 每个回答都超有意思的
知道大有可为答主
回答量:8021
采纳率:61%
帮助的人:1662万
展开全部
  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
死神涅天
2015-07-15 · TA获得超过1372个赞
知道小有建树答主
回答量:647
采纳率:0%
帮助的人:182万
展开全部
 MSDN:http://msdn.microsoft.com/en-us/library/ms633539(v=VS.85).aspx 下面是谷歌翻译,有些语句不是很流畅。
  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
  想必看到上述代码就明白了这个函数失败的原因了吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ARTERIOSCLEROS
推荐于2016-08-27 · TA获得超过4184个赞
知道大有可为答主
回答量:1672
采纳率:0%
帮助的人:2443万
展开全部
先打开一个记事本,让他不是当前窗口(无焦点)。程序里建一个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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暗影之王01
2015-07-05 · TA获得超过5.6万个赞
知道大有可为答主
回答量:2万
采纳率:29%
帮助的人:4653万
展开全部
  1. 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。

  2. 函数原型:BOOL SetForegroundWindow()。

  3. 返回值:如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。

  4. 备注:前台窗口是z序顶部的窗口,是用户的工作窗口。在一个多任务优先抢占环境中,应让用户控制前台窗口。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
安徽电信网上营业厅
2018-08-02 · 查话费、办靓号、装宽带,尽在中国电信!
安徽电信网上营业厅
中国电信网上营业厅一直坚持以满足客户需求和全方位提升客户服务为根本,不断追求产品的完善与创新,向您提供费用查询、充值交费、买手机、办靓号、装宽带、积分兑换等差异化服务。
向TA提问
展开全部
SetForegroundWindow函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
本回答被网友采纳
详情
  • 在线客服
  • 官方服务
    • 官方网站
    • 费用查询
    • 充值交费
    • 业务办理
    • 宽带提速
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式