怎么抢模式对话框的焦点

问题描述

程序有个定时锁屏功能,锁屏对话框是全屏置顶的,锁屏后程序的很多线程可能会showdialog模式对话框出来,这样此时锁屏对话框就没法获取焦点去输入密码了,焦点就在后面的模式对话框上,那么就一直没法进入程序了。想请教一下各位大牛,能不能让锁屏对话框永远保有输入焦点,即使后面有模式对话框出来?急等各位大牛解答,多谢了!

解决方案

解决方案二:
定时器判断getforegroundwindow,如果不是自己,就把弹出的对话框发wm_close关闭。
解决方案三:
参考:KeepwindowontopandstealfocusinWinForms第一个回答是说用钩子什么的。后面的应该都是用定时器。
解决方案四:
c#对模态窗口的约定就是后弹出的先关闭,无法改变但你提到有多线程,线程间是没这个限制的,你只需要让那个锁屏窗口定时把自己Active就行了,甚至可以把锁屏窗口直接在新线程里打开Task.Run(()=>newLockForm1().ShowDialog());
解决方案五:
自动弹出的对话框应该是主线程根据条件产生的;能把锁屏放在工作线程吗?工作线程好像一般不能显示模态对话框,即使能用,能抢占主线程模态对话框的焦点吗?引用3楼phommy的回复:

c#对模态窗口的约定就是后弹出的先关闭,无法改变但你提到有多线程,线程间是没这个限制的,你只需要让那个锁屏窗口定时把自己Active就行了,甚至可以把锁屏窗口直接在新线程里打开Task.Run(()=>newLockForm1().ShowDialog());

解决方案六:
定时器还是无法抢占模态对话框的焦点;钩子到时可以考虑,只是用户体验差点,也只能这样了。引用2楼findcaiyzh的回复:

参考:KeepwindowontopandstealfocusinWinForms第一个回答是说用钩子什么的。后面的应该都是用定时器。

时间: 2024-10-23 10:23:04

怎么抢模式对话框的焦点的相关文章

关于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式对话框 非模式对话框

总结OnOK().OnCancel().OnClose().OnDestroy()之间的区别(转) 2009年09月22日 下午 08:33 第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数.从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的"确定"."取消"按钮则对应了CDialog. 第二,OnClose()和OnDestr

MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,                    然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.O

IE的模式对话框设计

对话框|设计 在开发 Intranet Web Mis 的过程中,大家发现如果运用模式对话框,程序的流程将更为清楚.在某些情况,用户必须进行某些操作之后,才能继续后面的事情.比如:某些安全性要求比较高的操作,需要操作者输入口令以确认.如果实现了模式对话框,那么一个WEB程序看上去更象一个VB 或 DELPHI 开发的应用程序.结合运用 ASP 和 DHTML ,可以实现模式对话框. 本文以 msgbox 的实现为例.客户端 VBScript 有一个函数 Msgbox() (以及衍生出来的Aler

IE中非模式对话框(showModelessDialog)应用

model|对话框 非模式对话框是IE的一种窗口形式,打开非模式对话框后,在其被关闭之前,主调窗口不会继续解析其后的htm代码,同时主调窗口也不会被选中.主调窗口与非模式窗口的信息传递1.函数调用传递方式vReturnValue = window.showModelessDialog ( sURL [, vArguments] [, sFeatures] ) 主调窗口通过showModelessDialog方法的第二个参数 vArguments 向非模式窗口传递参数,该参数可以是数组,也可以是D

将模式对话框的返回值回送(PostBack)到服务端

对话框 在一些应用中,希望将模式对话框的值回送(PostBack)到服务端,也就是执行一个服务端操作,从而刷新页面. 举个例子:比方说新建一个订单,此时希望能在模式对话框中选择产品,并将产品的ID返回,同时刷新订单中的产品项,解决的方法有多种,这里只介绍执行服务器操作的方法. 要将客户端数据回送(PostBack)到服务端并执行相应操作,显然必须提交form并设置隐藏域__EVENTTARGET的值,好在asp.net已为我们完成了这些,只要以合适的参数调用__doPostBack就可以了. 另

无模式对话框的创建与使用

在编程过程中,对话框经常用到,但对无模式和模式对话框的创建和销毁过程,经常有误解,下面提供一个无模式对话框的例子来剖析无模式对话框的形成: 无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口.创建无模式对话框需要调用BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用BOOL CDialog::ShowWindow( SW_SHOW);进行显示

Windows SDK笔记(五):非模式对话框

一.概述 使用DialgBox建立的对话框是"模式对话框",只有关闭对话框后,程序的其他窗口才能进行操作. 与此相对应,存在"非模式对话框",对话框建立后,并不强制要求用户立即反应,而是与其他窗口同时接受用户操作. 二.建立 非模式对话框使用CreateDialg建立. 可以在WinMain中建立主窗口后建立,对话框句柄保存备用. hDlgModeless = CreateDialog ( hInstance, TEXT ("ColorScrDlg&quo

qt-Qt相关问题,非模式对话框的销毁

问题描述 Qt相关问题,非模式对话框的销毁 Qt中我在主窗体(show函数)调用一个非模式对话框,在非模式对话框使用完后,我想返回那个主窗体,我要怎么销毁当前这个非模式对话框? 解决方案 如果想用主窗口去銷毀的話可以讓對話框發個信號給主窗口 然後在主窗口的槽函數里銷毀. 解决方案二: 非模式对话框上没有什么按钮么,比如说关闭按钮

c++问题-vc++无模式对话框显示问题

问题描述 vc++无模式对话框显示问题 对话框架构下,在CWinApp派生类的InitInstance函数中,启动对话框之前,构造了另一个只含有进度条和文本框的对话框,用来显示加载数据的进度.此对话框为无模式对话框,初始显示正常,但一旦最小化,再还原后,进度条和文本框均无法显示,背景也变为白色.对话框架构下,再使用一个无模式对话框确实比较另类,所以遍查不到解决方法,恳请哪位高手帮忙! 解决方案 http://blog.163.com/guo_ahui/blog/static/4465088320