C# 显示不可见窗口
我有一个有一些过程和可视化的窗口,但我希望这个窗口在启动时被隐藏,但仍然执行它的工作。我用简单的代码实现了这一点C# 显示不可见窗口,c#,wpf,winforms,C#,Wpf,Winforms,我有一个有一些过程和可视化的窗口,但我希望这个窗口在启动时被隐藏,但仍然执行它的工作。我用简单的代码实现了这一点 SomeWindow.Show(); SomeWindow.Hide(); 但问题是这段代码会导致启动闪烁。无论是在Windows窗体中,还是在WPF中,我都无法解决这个问题。有没有更优雅的方式来显示隐藏/不可见的窗口 更新 我希望窗口显示在任务栏中,但仅当它是可见的。窗口正在执行依赖于渲染的任务,无论可见性如何,渲染都将及时执行,用户应该能够看到它的状态,就像它一直处于打开状态一
SomeWindow.Show();
SomeWindow.Hide();
但问题是这段代码会导致启动闪烁。无论是在Windows窗体中,还是在WPF中,我都无法解决这个问题。有没有更优雅的方式来显示隐藏/不可见的窗口
更新
我希望窗口显示在任务栏中,但仅当它是可见的。窗口正在执行依赖于渲染的任务,无论可见性如何,渲染都将及时执行,用户应该能够看到它的状态,就像它一直处于打开状态一样。为什么要为此任务使用窗口?为什么不在另一个线程上启动一个类并让它完成工作呢 如果确实需要一个窗口,只需在打开该窗口时从该自定义任务请求数据即可
var myClass = new MyClass();
Task.Run(()=>myClass.Start());
为什么要使用窗口来完成此任务?为什么不在另一个线程上启动一个类并让它完成工作呢 如果确实需要一个窗口,只需在打开该窗口时从该自定义任务请求数据即可
var myClass = new MyClass();
Task.Run(()=>myClass.Start());
这在我的机器上工作,没有“闪烁”。正如Ed提到的,任务栏按钮的行为与您预期的一样,没有添加设置或代码
//Assuming SomeWindow is System.Windows.Form object
SomeWindow.Opacity = 0.0;
SomeWindow.Show();
SomeWindow.Hide();
//Elsewhere in code when you want to display the window
SomeWindow.Opacity = 1.0;
SomeWindow.Visible = true;
这在我的机器上工作,没有“闪烁”。正如Ed提到的,任务栏按钮的行为与您预期的一样,没有添加设置或代码
//Assuming SomeWindow is System.Windows.Form object
SomeWindow.Opacity = 0.0;
SomeWindow.Show();
SomeWindow.Hide();
//Elsewhere in code when you want to display the window
SomeWindow.Opacity = 1.0;
SomeWindow.Visible = true;
试试这个:
SomeWindow.ShowInTaskbar = false; // not shown on taskbar set to true if you want to show form on taskbar
SomeWindow.WindowState = FormWindowState.Minimized; // set window state as minimized
SomeWindow.Show();
你甚至不需要隐藏它
这是winforms版本,我没有在WPF中测试它
更新:
如果Show()
窗口位于打开的窗口列表(Alt+Tab)上之后未执行Hide()
。要防止这种情况,请执行以下操作:
SomeWindow.Hide();
试试这个:
SomeWindow.ShowInTaskbar = false; // not shown on taskbar set to true if you want to show form on taskbar
SomeWindow.WindowState = FormWindowState.Minimized; // set window state as minimized
SomeWindow.Show();
你甚至不需要隐藏它
这是winforms版本,我没有在WPF中测试它
更新:
如果Show()
窗口位于打开的窗口列表(Alt+Tab)上之后未执行Hide()
。要防止这种情况,请执行以下操作:
SomeWindow.Hide();
基于此,我创建了显示不可见窗口的扩展方法
对于Windows窗体:
public static class FormHelper
{
public static void ShowInvisible(this Form form)
{
// saving original settings
bool needToShowInTaskbar = form.ShowInTaskbar;
FormWindowState initialWindowState = form.WindowState;
// making form invisible
form.ShowInTaskbar = false;
form.WindowState = FormWindowState.Minimized;
// showing and hiding form
form.Show();
form.Hide();
// restoring original settings
form.ShowInTaskbar = needToShowInTaskbar;
form.WindowState = initialWindowState;
}
}
或对于WPF:
public static class WindowHelper
{
public static void ShowInvisible(this Window window)
{
// saving original settings
bool needToShowInTaskbar = window.ShowInTaskbar;
WindowState initialWindowState = window.WindowState;
// making window invisible
window.ShowInTaskbar = false;
window.WindowState = WindowState.Minimized;
// showing and hiding window
window.Show();
window.Hide();
// restoring original settings
window.ShowInTaskbar = needToShowInTaskbar;
window.WindowState = initialWindowState;
}
}
基于此,我创建了显示不可见窗口的扩展方法
对于Windows窗体:
public static class FormHelper
{
public static void ShowInvisible(this Form form)
{
// saving original settings
bool needToShowInTaskbar = form.ShowInTaskbar;
FormWindowState initialWindowState = form.WindowState;
// making form invisible
form.ShowInTaskbar = false;
form.WindowState = FormWindowState.Minimized;
// showing and hiding form
form.Show();
form.Hide();
// restoring original settings
form.ShowInTaskbar = needToShowInTaskbar;
form.WindowState = initialWindowState;
}
}
或对于WPF:
public static class WindowHelper
{
public static void ShowInvisible(this Window window)
{
// saving original settings
bool needToShowInTaskbar = window.ShowInTaskbar;
WindowState initialWindowState = window.WindowState;
// making window invisible
window.ShowInTaskbar = false;
window.WindowState = WindowState.Minimized;
// showing and hiding window
window.Show();
window.Hide();
// restoring original settings
window.ShowInTaskbar = needToShowInTaskbar;
window.WindowState = initialWindowState;
}
}
因为WPF是一个很好的开始,但最终对我来说不起作用,原因有两个:Show()和Hide()是同步方法,当您希望在没有其他窗口打开的情况下预创建该窗口时,这是一个问题(因为没有调度程序执行这些请求);此外,恢复原始值必须在以后执行,否则仍会出现快速闪烁。然后,我不得不异步恢复ShowInTaskbar的值;否则,任务栏条目就会丢失,但奇怪的是,只有在VisualStudio调试器中运行时才会丢失
以下帮助器类为我执行此任务:
public class InitiallyInvisibleWindow
{
private readonly Window _window;
private bool _origShowActivated;
private bool _origShowInTaskbar;
private WindowState _origWindowState;
public InitiallyInvisibleWindow(Window window)
{
_window = window;
}
public void ShowInvisible()
{
_origShowActivated = _window.ShowActivated;
_origShowInTaskbar = _window.ShowInTaskbar;
_origWindowState = _window.WindowState;
_window.ShowActivated = false;
_window.ShowInTaskbar = false;
_window.WindowState = WindowState.Minimized;
_window.Visibility = Visibility.Visible;
_window.Visibility = Visibility.Hidden;
}
public void RestoreVisible()
{
_window.ShowActivated = _origShowActivated;
_window.Visibility = Visibility.Visible;
Dispatcher.CurrentDispatcher.InvokeAsync(() =>
{
_window.ShowInTaskbar = _origShowInTaskbar;
_window.WindowState = _origWindowState;
});
}
}
因为WPF是一个很好的开始,但最终对我来说不起作用,原因有两个:Show()和Hide()是同步方法,当您希望在没有其他窗口打开的情况下预创建该窗口时,这是一个问题(因为没有调度程序执行这些请求);此外,恢复原始值必须在以后执行,否则仍会出现快速闪烁。然后,我不得不异步恢复ShowInTaskbar的值;否则,任务栏条目就会丢失,但奇怪的是,只有在VisualStudio调试器中运行时才会丢失
以下帮助器类为我执行此任务:
public class InitiallyInvisibleWindow
{
private readonly Window _window;
private bool _origShowActivated;
private bool _origShowInTaskbar;
private WindowState _origWindowState;
public InitiallyInvisibleWindow(Window window)
{
_window = window;
}
public void ShowInvisible()
{
_origShowActivated = _window.ShowActivated;
_origShowInTaskbar = _window.ShowInTaskbar;
_origWindowState = _window.WindowState;
_window.ShowActivated = false;
_window.ShowInTaskbar = false;
_window.WindowState = WindowState.Minimized;
_window.Visibility = Visibility.Visible;
_window.Visibility = Visibility.Hidden;
}
public void RestoreVisible()
{
_window.ShowActivated = _origShowActivated;
_window.Visibility = Visibility.Visible;
Dispatcher.CurrentDispatcher.InvokeAsync(() =>
{
_window.ShowInTaskbar = _origShowInTaskbar;
_window.WindowState = _origWindowState;
});
}
}
当我调用
Show
表单时,它将是可见的。如果没有这个调用,我的可视化和依赖过程将无法工作。但它无法解决任务栏问题(我希望此窗口显示在任务栏中)。如果确实需要调用show(),它当然会闪烁。该方法的全部目的是,好的,显示形式。。。让它可见。仅创建表单对象是否有效<代码>MyForm SomeWindow=新建MyForm()代码>您需要触发某些事件吗?我在您的需求中看不到任何不是默认窗口行为的东西。运行窗口最小化而不在任务栏上显示如何?当我调用Show
表单时,它将是可见的。如果没有这个调用,我的可视化和依赖过程将无法工作。但它无法解决任务栏问题(我希望此窗口显示在任务栏中)。如果确实需要调用show(),它当然会闪烁。该方法的全部目的是,好的,显示形式。。。让它可见。仅创建表单对象是否有效<代码>MyForm SomeWindow=新建MyForm()代码>您需要触发某些事件吗?我在您的需求中看不到任何不是默认窗口行为的东西。那么运行“窗口最小化”而不在任务栏上显示它呢?因为我的任务依赖于可视化,反之亦然。因为我的任务依赖于可视化,反之亦然。这使窗口在屏幕底部成为一个可见的最小化框。然后可以将其移出可见区域,但仍可在可见窗口列表中访问,例如Alt+Tab、Win+Tab。用户仍然可以激活它。不是我不相信你,而是我没有看到这样的行为(在windows 10上)你在使用什么操作系统?也许你是在WPF项目上做的?这是第一个窗口的第二个窗口吗?第十个窗口。Winforms。任何一个窗口。我让第一个窗口正常加载,然后在事件上加载第二个窗口。但是,如果我更改第一个窗口,使其具有您指定的属性,它也会执行相同的操作——唯一的区别是它在所有其他窗口之后启动。如果最小化或移动其他窗口,您将找到它。即使没有,它仍应出现在Alt+Tab窗口列表中。@CPerkins您关于Alt+Tab的看法是正确的,要防止这种行为,您需要执行SomeWindow.Hide()代码>节目结束后。但是我找不到我喜欢的这扇小窗户。另外,我知道你可以从Alt+Tab列表中删除窗口(甚至完全显示在屏幕上),就像我以前做的那样,但现在我不记得怎么做了。有趣的是,下次我重新运行程序时