<div><p>//首先要说明的是与TopMost的效果不同,TopMost是属性定义,而且设置True后,如果不设为Flase则一直置顶,效果很差,</p><p>//以下方法解决了TopMost使用上的不足</p><p>//调用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);//设置此窗体为活动窗体
//定义变量,句柄类型
public IntPtr Handle1;</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量</p><p>void Form1_Load(object sender, EventArgs e)
{
Handle1 = this.Handle;
timer2.Enabled = true;
}</p><p>//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体</p><p>private void timer2_Tick(object sender, EventArgs e)
{
if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶
{
SetForegroundWindow(Handle1);</p><p>//timer2.Stop();//此处可以关掉定时器,则实现单次置顶
}
}</p><pre>namespace WinFormsApp_GetForegroundWindowTest</pre><pre>{</pre><pre>publicpartialclass Form1 : Form</pre><pre> {</pre><pre>//调用API</pre><pre> [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]</pre><pre>publicstaticextern IntPtr GetForegroundWindow(); //获得本窗体的句柄</pre><pre> [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]</pre><pre>publicstaticexternbool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体</pre><pre>//定义变量,句柄类型</pre><pre>public IntPtr Handle1;</pre><pre> Timer timer2 = new Timer();</pre><pre> </pre><pre>public Form1()</pre><pre> {</pre><pre> InitializeComponent();</pre><pre> }</pre><pre> </pre><pre> Form Form2;</pre><pre> </pre><pre>//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量</pre><pre>void Form1_Load(object sender, EventArgs e)</pre><pre> {</pre><pre> Handle1 = this.Handle;</pre><pre> timer2.Tick += new EventHandler(timer2_Tick);</pre><pre> timer2.Interval = 1000;</pre><pre> }</pre><pre> </pre><pre>//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体</pre><pre>privatevoid timer2_Tick(object sender, EventArgs e)</pre><pre> {</pre><pre>//if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶</pre><pre>//{</pre><pre> SetForegroundWindow(Handle1);</pre><pre> timer2.Stop();//此处可以关掉定时器,则实现单次置顶</pre><pre>//}</pre><pre> }</pre><pre> </pre><pre>privatevoid btnSetForm2ToTop_Click(object sender, EventArgs e)</pre><pre> {</pre><pre>if (Form2 == null) return;</pre><pre> </pre><pre> timer2.Enabled = true;</pre><pre> Handle1 = Form2.Handle;</pre><pre> }</pre><pre> </pre><pre>privatevoid btn_OpenForm2_Click(object sender, EventArgs e)</pre><pre> {</pre><pre> Form2 = new Form();</pre><pre> Form2.Text = "Form2";</pre><pre> Form2.Show();</pre><pre> }</pre><pre> }</pre><pre>}</pre></div>