如何获得应用程序得到或失去焦点事件.

hyz_cs 2014-08-28 03:33:52
是整个应用程序,并不是某一个窗体,因为整个程序有多个窗体,在这几个窗体内切换焦点都还是在这个应用程序中的.
...全文
556 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝龙哥 2014-09-01
  • 打赏
  • 举报
回复
可以在空闲时遍历所有自己程序的窗口,检查自己的窗口是否有焦点,但这坡费时间。还是从每个窗体自身出发比较的理想
hyz_cs 2014-09-01
  • 打赏
  • 举报
回复
引用 16 楼 ccrun 的回复:
楼主的三个窗口都是模态显示出来的? 你能不能搞一个简单的示例代码,发我信箱我帮你看看,注明你的开发工具版本和操作系统版本。
不是,那三个窗口都是普通的窗口,只不过设置为fsStayOnTop.现在要做到的效果是,用户如果切换到别的软件的时候,这三个窗口就不能是fsStayOnTop了,因为这样会挡住别的软件,所以想在用户切换软件的时候动态设置fsStayOnTop和fsNormal.
ccrun.com 2014-09-01
  • 打赏
  • 举报
回复
楼主的三个窗口都是模态显示出来的? 你能不能搞一个简单的示例代码,发我信箱我帮你看看,注明你的开发工具版本和操作系统版本。
  • 打赏
  • 举报
回复
不是说了吗,写Application->OnActivate和Application->OnDeactivate事件处理。 简单说,要点在于你不能在事件处理中直接设置FormStyle属性,这会导致反复激活窗口,要用SetWindowPos去设置Application->Handle或者某个窗体的Handle,根据不同的情况(激活或者不激活)把hWndInsertAfter设置为HWND_TOPMOST或者HWND_NOTOPMOST /HWND_BOTTOM。VCL窗体的FormStyle一直保持fsStayOnTop就可以。
hyz_cs 2014-08-31
  • 打赏
  • 举报
回复
引用 14 楼 kfrght 的回复:
我额代码放在FormActivate事件里可能会更好一些
这个只是保证窗口永远在最上面而已,比如用户切换到其它软件,那这个软件就把别的软件挡住了,还是回到这个帖子的主题上面.
宝龙哥 2014-08-31
  • 打赏
  • 举报
回复
我额代码放在FormActivate事件里可能会更好一些
宝龙哥 2014-08-31
  • 打赏
  • 举报
回复
引用 12 楼 hyz_cs 的回复:
[quote=引用 10 楼 kfrght 的回复:] 若果窗体本身是fsStayOnTop,那么Application->BringToFront(); // 将应用程序置于激活状态并且拥有焦点
并不是所有窗口都是fsStayOnTop,只是部分窗口是这样.[/quote] 所以我的代码里面记录了窗体原始的状态,完成后还原: TFormStyle tFormStyle=FormStyle; // 开始之前记住原始设置 FormStyle=fsStayOnTop; // 让窗口总是在最前面 FormStyle=tFormStyle; // 恢复原始设置
hyz_cs 2014-08-31
  • 打赏
  • 举报
回复
引用 10 楼 kfrght 的回复:
若果窗体本身是fsStayOnTop,那么Application->BringToFront(); // 将应用程序置于激活状态并且拥有焦点
并不是所有窗口都是fsStayOnTop,只是部分窗口是这样.
  • 打赏
  • 举报
回复
写Application->OnActivate和Application->OnDeactivate事件处理。
宝龙哥 2014-08-30
  • 打赏
  • 举报
回复
若果窗体本身是fsStayOnTop,那么Application->BringToFront(); // 将应用程序置于激活状态并且拥有焦点

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    if ( FormStyle != fsStayOnTop )
    {
      TFormStyle tFormStyle=FormStyle; // 开始之前记住原始设置
      FormStyle=fsStayOnTop; // 让窗口总是在最前面(调到最前面,会一直有效,可能造成模式窗体弹出后界面疑似锁定的情况)
      FormStyle=tFormStyle; // 恢复原始设置
    }else{
Application->BringToFront(); // 将应用程序置于激活状态并且拥有焦点
}
}
完整代码,你测试一下看好不好用 这个关键点是让最后一共窗口显示在最前面,同时不影响其它后来窗口的显示
宝龙哥 2014-08-30
  • 打赏
  • 举报
回复
这个问题我在一个项目中遇到过,当时使用了这样的代码:

// 将窗体临时调到最前面的用法:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    if ( FormStyle != fsStayOnTop )
    {
      TFormStyle tFormStyle=FormStyle; // 开始之前记住原始设置
      FormStyle=fsStayOnTop; // 让窗口总是在最前面(调到最前面,会一直有效,可能造成模式窗体弹出后界面疑似锁定的情况)
      FormStyle=tFormStyle; // 恢复原始设置
    }
}
hyz_cs 2014-08-30
  • 打赏
  • 举报
回复
引用 7 楼 zzbinfo 的回复:
在你的应用中不要把窗口置顶,你可以采用模式窗口来实现你要的效果。
要置顶的并不是一个窗口,像那图中就有3个,视频一个,图片一个,天气一个(实际情况可能是任意个,所以你说的方法没法解决这个问题).这3个窗口底下那个窗口就是模式窗口显示的.
hyz_cs 2014-08-30
  • 打赏
  • 举报
回复
自己顶一下.
zzbinfo 2014-08-30
  • 打赏
  • 举报
回复
在你的应用中不要把窗口置顶,你可以采用模式窗口来实现你要的效果。
hyz_cs 2014-08-28
  • 打赏
  • 举报
回复
大致的效果

hyz_cs 2014-08-28
  • 打赏
  • 举报
回复
引用 3 楼 kfrght 的回复:
[quote=引用 2 楼 hyz_cs 的回复:] [quote=引用 1 楼 ccrun 的回复:] 应用程序何来焦点一说?焦点是针对窗口而言的。你到底想实现啥?
我为了保证程序的某些窗体的前后顺序,所以程序有些窗体是fsStayOnTop的,但是必须在焦点切换到其它应用程序的时候改为fsNormal,不然会挡住其它应用程序,当切换到本应用程序时再设置回来. [/quote] 这个需求的话,将窗体调到顶层后立即取消fsStayOnTop属性,是不是可以?[/quote] 应该不可以吧,因为有多个窗口需要设置fsStayOnTop,他们之间有可能互相切换的.而且还有更严重的问题,比如从其它应用程序上切换过来的时候,也要有获取焦点事件,重新设回fsStayOnTop.
宝龙哥 2014-08-28
  • 打赏
  • 举报
回复
引用 2 楼 hyz_cs 的回复:
[quote=引用 1 楼 ccrun 的回复:] 应用程序何来焦点一说?焦点是针对窗口而言的。你到底想实现啥?
我为了保证程序的某些窗体的前后顺序,所以程序有些窗体是fsStayOnTop的,但是必须在焦点切换到其它应用程序的时候改为fsNormal,不然会挡住其它应用程序,当切换到本应用程序时再设置回来. [/quote] 这个需求的话,将窗体调到顶层后立即取消fsStayOnTop属性,是不是可以?
hyz_cs 2014-08-28
  • 打赏
  • 举报
回复
引用 1 楼 ccrun 的回复:
应用程序何来焦点一说?焦点是针对窗口而言的。你到底想实现啥?
我为了保证程序的某些窗体的前后顺序,所以程序有些窗体是fsStayOnTop的,但是必须在焦点切换到其它应用程序的时候改为fsNormal,不然会挡住其它应用程序,当切换到本应用程序时再设置回来.
ccrun.com 2014-08-28
  • 打赏
  • 举报
回复
应用程序何来焦点一说?焦点是针对窗口而言的。你到底想实现啥?

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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