(C# - WinForms) 如何强制某窗体获得焦点? 我想弹出某窗体后,使该窗体顶置并且获得焦点,无论其他程序怎么样,该窗体还是拥有焦点,直到把这个窗体关闭.这该怎么实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Form2 form = new Form2(); form.ShowDialog();用showdialog就使窗体无法失去焦点 Form2 form = new Form2(); form.TopMost=true; //这个,让你永远在上面!form.ShowDialog(); 以上方法可以使窗体顶置,程序内部获得绝对焦点.但是其他Windows应用程序如果有什么动作则这个窗体(整个程序)将会失去焦点.例如QQ某个好友给你发了一个视频或者图片,则那个聊天窗口获得焦点.该窗体失去焦点!!!!!即使这个窗口是顶置的我就是想问问怎么样让这个程序绝不失去焦点. 试下在窗口的LostFocus事件里重新为自己Focus()没经过试验,要行的话记得给分啊$_$ 回5楼:不好使没有LostFocus事件 有个Deactivate窗体失去焦点时会触发此事件,但是在这里面this.Focus();根本不能再使自己获得焦点(但是如果在this.Focus()上加一断点则可以使该窗体获得焦点) 我的意思是说使一个窗体拥有绝对焦点就是说.除非关闭此窗体,否则任何其他显示的Windows应用程序窗口均无法获得焦点!不是一个简简单单的ShowDialog()的事情. Form form=new Form();......form.Show();//重载OnLostFocus事件protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); this.Focus(); }我看了一下,在属性栏里是找不到LostFocus事件,那是因为太多了,没办法一一列出,不代表没有。 做一个系统钩子,拦截WM_ACTIVE消息,然后都始终激活你的程序窗体 老兄 我不大会做钩子程序啊!你能不能帮我做一个DLL 我调用里面的方法去实现呢? 有两个API函数 [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); //获得当前活动窗体的句柄 [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")] public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体句柄的窗体为活动窗体因为每个窗体的句柄都是唯一的,所以你先保存下你窗体的句柄(this.IntPtr获得),然后用一个Timer,设置间隔为1秒或者自己定个时间。然后你用Api函数GetForegroundWindow(),此函数返回一个当前活动窗体的句柄,你和自己窗体的句柄比较,如果相同什么也不做。如果不同,则用SetForegroundWindow(this.IntPtr)设置自己为活动窗体,如果还嫌不够可以去看下SendMessage API函数发一个消息把前一个窗体最小化或者关了。活动窗体就是当前具有输入焦点,或者说用户正在使用的窗体。 this.Handle 哈哈哈哈!问题解决!感谢walkingmu 我也是遇到这个问题了我通过我打开一个窗体form2但是这时候后面的form1内的datagrid 控件内有新数据更新时,会把form1 置为活动(前台)怎么让form1的更新在后台完成呢,当我关闭form2时在显示form1. 确实解决问题 this.Handle。 VS2010窗口隐藏和弹出功能的实现 字符串转换为浮点数 关于SQL SERVER高并发访问的解决办法 求一算法,有点冷门,还有点难度 关于用vs2005编写c# winform程序时;对*.Designer.cs文件中几行初始代码的理解? 奇怪一个DLL引用的问题!为什么只出空间名? 对“门禁系统“了解的请进! C#调用COM组件,可以创建对象,但是调用函数的时候抛出异常了. 如何解决任意一点是否在由N个点组成的不规则区域内? 关于c#,out方法的问题,求帮忙 winform程序,如何控制TextBox只能输入英文或只能输入汉字? ◎讨论◎重写Textbox控件,有兴趣的进来参与一下
form.ShowDialog();
用showdialog就使窗体无法失去焦点
form.TopMost=true; //这个,让你永远在上面!
form.ShowDialog();
我就是想问问怎么样让这个程序绝不失去焦点.
没有LostFocus事件 有个Deactivate
窗体失去焦点时会触发此事件,但是在这里面this.Focus();根本不能再使自己获得焦点(但是如果在this.Focus()上加一断点则可以使该窗体获得焦点)
使一个窗体拥有绝对焦点
就是说.除非关闭此窗体,否则任何其他显示的Windows应用程序窗口均无法获得焦点!不是一个简简单单的ShowDialog()的事情.
......
form.Show();
//重载OnLostFocus事件
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
this.Focus();
}我看了一下,在属性栏里是找不到LostFocus事件,那是因为太多了,没办法一一列出,不代表没有。
老兄 我不大会做钩子程序啊!
你能不能帮我做一个DLL 我调用里面的方法去实现呢?
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow(); //获得当前活动窗体的句柄
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体句柄的窗体为活动窗体因为每个窗体的句柄都是唯一的,所以你先保存下你窗体的句柄(this.IntPtr获得),然后用一个Timer,设置间隔为1秒或者自己定个时间。
然后你用Api函数GetForegroundWindow(),此函数返回一个当前活动窗体的句柄,你和自己窗体的句柄比较,如果相同什么也不做。如果不同,则用SetForegroundWindow(this.IntPtr)设置自己为活动窗体,如果还嫌不够可以去看下SendMessage API函数发一个消息把前一个窗体最小化或者关了。活动窗体就是当前具有输入焦点,或者说用户正在使用的窗体。
感谢walkingmu
我通过我打开一个窗体form2
但是这时候后面的form1内的datagrid 控件内有新数据更新时,会把form1 置为活动(前台)怎么让form1的更新在后台完成呢,当我关闭form2时在显示form1.