大家好,我想请教个问题:
我做了一个下在线更新程序,使用C#,具体流程是:1.主进程app run一个winform出来检测服务器是否有更新文件 2.检测到有更新文件会弹出一个MessageBox提示有更新是否进行更新 3.倘若点击OK,用app run的方式弹出一个下载form。现在的问题是:XP,Vista下下载form可以弹出在最上面,win7下办不到。
在csdn上我查找了解决方案:设置下载窗体属性为TopMost,设置定时器置顶窗口,BringToFront提升窗口Z轴位置,SetWindowPos效果不佳,我添加了SetForegroundWindow效果还是不佳,未达到理想效果。我发现窗口确实置顶了,但是下载的窗口出来之后就自动缩小到任务栏,窗口不断的置顶,使下载窗体图标不断的闪烁,但是就是弹不出,使用鼠标点击之后就可以保持一直在最上面,我想达到的效果是下载窗体弹出后就一直保持在最上面,可惜win7做不到。
请教高手们如何解决这个让我纠结几周的问题?衷心的表示感谢,谢谢!请大家指教。
我做了一个下在线更新程序,使用C#,具体流程是:1.主进程app run一个winform出来检测服务器是否有更新文件 2.检测到有更新文件会弹出一个MessageBox提示有更新是否进行更新 3.倘若点击OK,用app run的方式弹出一个下载form。现在的问题是:XP,Vista下下载form可以弹出在最上面,win7下办不到。
在csdn上我查找了解决方案:设置下载窗体属性为TopMost,设置定时器置顶窗口,BringToFront提升窗口Z轴位置,SetWindowPos效果不佳,我添加了SetForegroundWindow效果还是不佳,未达到理想效果。我发现窗口确实置顶了,但是下载的窗口出来之后就自动缩小到任务栏,窗口不断的置顶,使下载窗体图标不断的闪烁,但是就是弹不出,使用鼠标点击之后就可以保持一直在最上面,我想达到的效果是下载窗体弹出后就一直保持在最上面,可惜win7做不到。
请教高手们如何解决这个让我纠结几周的问题?衷心的表示感谢,谢谢!请大家指教。
解决方案 »
- 请问若干个加号连在一起中间用空格隔开是什么运算符?
- System.Timers 的错误,请高手帮忙
- datagrid数据无法显示问题!
- 好心人,帮个忙吧!小女子的分花没了,不好意思!
- 请问谁有punycode和中文相互转换的C#代码?
- httprequest 如何抓取页面信息 并打印到页面上
- richtextbox怎么实现项目符号列表,字体的背景色,还有插入表格实现复杂的编辑?
- 如何把EXCEL的两列数据读取到数据库表中的两列,为什么找不到microsoft.office不存在interop
- GDI+高手请进:如何将3幅图片拼成一幅Gif动画
- 我想开发基于WINDOWS平台地软件,用C#还是VB.NET比较好?
- 文本框當手動輸入新的數據后,我還想引用下以前舊的數據
- 求助高手
//调用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);
}
现在是陷入困境了,求解……