讨论一下,如何确保SetForegroundWindow()成功???????

jun_01 2006-07-29 11:26:09
使用中,发现SetForegroundWindow()经常会失败,并且返回FALSE的时候,GetLastError()返回为0.

其实微软也说了,SetForegroundWindow()并不能确保窗体跑到前台.

那现在的问题是:
1,什么情况下,这个函数会失效??
2,怎么能让它不失效? 失败后,又如何处理让它成功呢??

我现在的问题是,第一次调用,一般都会成功,但以后经常失败,为什么呢?
...全文
2732 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
折腾_苏州 2006-07-29
  • 打赏
  • 举报
回复
设置当前某窗口为当前窗口,有几个步骤要做:
1.得到窗口句柄FindWindow
2.切换键盘输入焦点AttachThreadInput
3.显示窗口ShowWindow(有些窗口被最小化/隐藏了)
4.更改窗口的Zorder,SetWindowPos使之最上,为了不影响后续窗口的Zorder,改完之后,再还原
5.最后SetForegroundWindow
这样应该可以保窗体跑到前台吧??
jun_01 2006-07-29
  • 打赏
  • 举报
回复
1楼的,我曾经在一个微软的例子里,这个例子是一段vb代码,用来确保这个函数成功,也用了和你类似的函数,能解释一下吗?
pomelowu 2006-07-29
  • 打赏
  • 举报
回复
曾经用过很傻的办法,根据返回值,循环个30次。。。不过还是有可能30次都失败。。。结合SetActiveWindow 可能效果会改善。不过不确定
折腾_苏州 2006-07-29
  • 打赏
  • 举报
回复
加点修饰呢??
例如
HWND hForeWnd = NULL;
HWND hWnd=::FindWindow(NULL,"QQ用户登录");
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);
jun_01 2006-07-29
  • 打赏
  • 举报
回复
回:
1,我的窗口是自己,所以句柄已经有了
2&3,我的窗口是隐藏的,之所以要用这个函数,是为了托盘图标.
如果SetForegroundWindow返回失败,那我的托盘菜单就不能自动消失了,除非选中一个选项....
4,还没注意...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧