C# WINFORM 强制让窗体获得焦点(可实现单次置顶或持续置顶)
2014-03-01 01:10
567 查看
这个是从这个前辈那里转载来的传送门:点击打开链接
//首先要说明的是与TopMost的效果不同,TopMost是属性定义,而且设置True后,如果不设为Flase则一直置顶,效果很差,
//以下方法解决了TopMost使用上的不足
//调用API
[System.Runtime.InteropServices.DllImport("user32.dll",CharSet=System.Runtime.InteropServices.CharSet.Auto,ExactSpelling=true)]
publicstaticexternIntPtrGetForegroundWindow();//获得本窗体的句柄
[System.Runtime.InteropServices.DllImport("user32.dll",EntryPoint="SetForegroundWindow")]
publicstaticexternboolSetForegroundWindow(IntPtrhWnd);//设置此窗体为活动窗体
//定义变量,句柄类型
publicIntPtrHandle1;
//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量
voidForm1_Load(objectsender,EventArgse)
{
Handle1=this.Handle;
timer2.Enabled=true;
}
//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体
privatevoidtimer2_Tick(objectsender,EventArgse)
{
if(Handle1!=GetForegroundWindow())//持续使该窗体置为最前,屏蔽该行则单次置顶
{
SetForegroundWindow(Handle1);
//timer2.Stop();//此处可以关掉定时器,则实现单次置顶
}
}
示例代码:
//首先要说明的是与TopMost的效果不同,TopMost是属性定义,而且设置True后,如果不设为Flase则一直置顶,效果很差,
//以下方法解决了TopMost使用上的不足
//调用API
[System.Runtime.InteropServices.DllImport("user32.dll",CharSet=System.Runtime.InteropServices.CharSet.Auto,ExactSpelling=true)]
publicstaticexternIntPtrGetForegroundWindow();//获得本窗体的句柄
[System.Runtime.InteropServices.DllImport("user32.dll",EntryPoint="SetForegroundWindow")]
publicstaticexternboolSetForegroundWindow(IntPtrhWnd);//设置此窗体为活动窗体
//定义变量,句柄类型
publicIntPtrHandle1;
//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量
voidForm1_Load(objectsender,EventArgse)
{
Handle1=this.Handle;
timer2.Enabled=true;
}
//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体
privatevoidtimer2_Tick(objectsender,EventArgse)
{
if(Handle1!=GetForegroundWindow())//持续使该窗体置为最前,屏蔽该行则单次置顶
{
SetForegroundWindow(Handle1);
//timer2.Stop();//此处可以关掉定时器,则实现单次置顶
}
}
示例代码:
namespaceWinFormsApp_GetForegroundWindowTest
{
publicpartialclassForm1:Form
{
//调用API
[System.Runtime.InteropServices.DllImport("user32.dll",CharSet=System.Runtime.InteropServices.CharSet.Auto,ExactSpelling=true)]
publicstaticexternIntPtrGetForegroundWindow();//获得本窗体的句柄
[System.Runtime.InteropServices.DllImport("user32.dll",EntryPoint="SetForegroundWindow")]
publicstaticexternboolSetForegroundWindow(IntPtrhWnd);//设置此窗体为活动窗体
//定义变量,句柄类型
publicIntPtrHandle1;
Timertimer2=newTimer();
publicForm1()
{
InitializeComponent();
}
FormForm2;
//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量
voidForm1_Load(objectsender,EventArgse)
{
Handle1=this.Handle;
timer2.Tick+=newEventHandler(timer2_Tick);
timer2.Interval=1000;
}
//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体
privatevoidtimer2_Tick(objectsender,EventArgse)
{
//if(Handle1!=GetForegroundWindow())//持续使该窗体置为最前,屏蔽该行则单次置顶
//{
SetForegroundWindow(Handle1);
timer2.Stop();//此处可以关掉定时器,则实现单次置顶
//}
}
privatevoidbtnSetForm2ToTop_Click(objectsender,EventArgse)
{
if(Form2==null)return;
timer2.Enabled=true;
Handle1=Form2.Handle;
}
privatevoidbtn_OpenForm2_Click(objectsender,EventArgse)
{
Form2=newForm();
Form2.Text="Form2";
Form2.Show();
}
}
}
相关文章推荐
- C# 操作IIS方法集合
- c#之委托总结
- [c#基础]泛型集合的自定义类型排序
- c# 输入多个数字,当输入不是数字时显示出刚输入的所有数并按降序
- c#开发中遇到System.AccessViolationException
- 再谈C#委托与事件
- C#中Graphics的画图代码【转】
- C#串口操作系列
- c#桌面小软件
- C# 自定义控件的设计时鼠标响应事件
- C#委托和事件例析
- C#正则表达式大全
- 尝鲜C#
- C#结构体和字节数组的转换
- C#笔记之 函数可变参数
- 用System.Attribute扩展元数据
- C# 时间格式
- C#MessageBox使用总结
- C#多线程学习(一) 多线程的相关概念
- C#学习笔记(5)