大家好,我想请教个问题:
我做了一个下在线更新程序,使用C#,具体流程是:1.主进程app run一个winform出来检测服务器是否有更新文件 2.检测到有更新文件会弹出一个MessageBox提示有更新是否进行更新 3.倘若点击OK,用app run的方式弹出一个下载form。现在的问题是:XP,Vista下下载form可以弹出在最上面,win7下办不到。
在csdn上我查找了解决方案:设置下载窗体属性为TopMost,设置定时器置顶窗口,BringToFront提升窗口Z轴位置,SetWindowPos效果不佳,我添加了SetForegroundWindow效果还是不佳,未达到理想效果。我发现窗口确实置顶了,但是下载的窗口出来之后就自动缩小到任务栏,窗口不断的置顶,使下载窗体图标不断的闪烁,但是就是弹不出,使用鼠标点击之后就可以保持一直在最上面,我想达到的效果是下载窗体弹出后就一直保持在最上面,可惜win7做不到。
请教高手们如何解决这个让我纠结几周的问题?衷心的表示感谢,谢谢!请大家指教。

解决方案 »

  1.   

    方法一:我使用失败
    //调用API
    [System.Runtime.InteropServices.DllImport("user32", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetFocus(); //获得本窗体的句柄
    [System.Runtime.InteropServices.DllImport("user32", EntryPoint = "SetForegroundWindow")]
    public static extern bool SetFocus(IntPtr hWnd);//设置此窗体为活动窗体
     
    // 定义变量,句柄类型
    public IntPtr han;
    ……
    private void Form1_Load(object sender, EventArgs e){
           //在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量
           han = this.Handle;
    }
    ……
    private void timer1_Tick(object sender, EventArgs e){
           // 加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体
            if (han != GetFocus()){
                    SetFocus(han);
            }
            this.WindowState = FormWindowState.Normal;      
    }
     
    方法二:我使用失败
    [System.Runtime.InteropServices.DllImport("user32")]
    private static extern IntPtr GetActiveWindow();//获取当前窗体的活动状态
     
    // 判断当前窗口是否处于活动状态的方法
    private bool ThisIsActive(){ return (GetActiveWindow() == this.Handle);}
     
    private void timer1_Tick(object sender, EventArgs e){
           if (!ThisIsActive()){
                    this.Activate();
           }
           this.WindowState = FormWindowState.Normal;

    方法三:我使用失败
    设置定时器置顶
     [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x,
                int y, int Width, int Height, int flags);this.TopMost = true;
    this.BringToFront();
    SetWindowPos(this.Handle, -1, 0, 0, 0, 0, 1 | 2);
    方法四:我使用失败
     [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            private static extern IntPtr GetForegroundWindow();   //WINAPI 获取当前活动窗体的句柄
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            private static extern bool SetForegroundWindow(IntPtr hWnd); //WINAPI 设置当前活动窗体的句柄
     IntPtr frontHWnd = GetForegroundWindow();
     if (frontHWnd != this.Handle)
    {
       SetForegroundWindow(this.Handle);
    }
    现在是陷入困境了,求解……
      

  2.   

    我发现现在的你就是以前的我啊,同情ING。