找到了可能的解决方案!
我相信我找到了解决方案!我将继续测试,以确保它确实工作,但我很有希望:)我已经详细说明了如何在EDIT三个问题中找到解决方案!
对于任何希望了解我的问题背后的完整背景以及由于此问题的输入而尝试过的人,请参阅:http://pastebin.com/nTrEAkVj
随着我的研究和情况的进展,我将经常对此进行编辑(大多数工作日每天> 3次),所以如果您有兴趣或者对我的问题有一些信息或了解,请继续检查:)
快速背景:
我有这个应用程序我可以通过更改我的屏幕保护程序或锁定我的工作站崩溃,并且通常每当发送WM_WININICHANGE/WM_SETTINGSCHANGE消息时.
如果我可以通过更改我的屏幕保护程序来持续崩溃我的应用程序,那么这样做的一部分就是向我的应用程序发送某种消息(不一定是Windows消息,我的意思是最普遍意义上的消息),这反过来对我来说是灾难性的应用.因此,我试图找到一种方法来阻止导致我的问题被我的应用程序处理的任何消息.我知道这不是解决方案的最佳方式,所以你不需要告诉我.查看背景信息或询问为什么会困扰您(有充分理由).
我的问题:
有几件事情,任何有关的信息都可以帮助我解决我的问题,根据相关性进行标记(1是最相关的,3稍微有点帮助):
我试图使用Wndproc()过滤掉我的消息,如下所示:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If CInt(m.Msg) <> CInt(26) then
MyBase.WndProc(m)
end if
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,根据Windspector,WM_WININICHANGE消息仍然被发送到我的应用程序(这是有道理的),但它也返回0 ...如果它正常工作不应该发生,它不应该返回什么,不应该吗?有关为什么这不符合我的预期以及如何使其工作的信息将非常有帮助!
我也尝试过使用messagefilters:
Public Class MyMessageFilter
Implements IMessageFilter
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
' Return true for messages that you want to stop << someone elses comment
Return m.Msg = 26
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
然后添加到mybase.load处理方法:
Application.AddMessageFilter(New MyMessageFilter())
然而,它们似乎只是过滤某些消息,而像我这样的消息显然没有被捕获.有关是否绝对无法使用任何类型的过滤器来捕获WM_消息的信息,或者是否有其他方法可以使用消息过滤器来实现我的目标也是有帮助的.
在其他方式(除了这个带有message.msg = WM_WININICHANGE = 26的Windows消息)我可以更改我的屏幕保护程序向我的应用程序发送任何类型的消息吗?更改我的屏幕保护程序的另一种消息是否也可能是致命的? …
我是大家.使用启动画面时,我目前的焦点有问题.我正在使用VS2008,带有.NET framework 2.0.此外,我已将我的项目与VisualBasic.dll链接,因为我使用ApplicationServices来管理我的单实例应用程序和启动画面.
这是一个简化了我尝试调试的代码片段.
namespace MyProject
{
public class Bootstrap
{
/// <summary>
/// Main entry point of the application. It creates a default
/// Configuration bean and then creates and show the MDI
/// Container.
/// </summary>
[STAThread]
static void Main(string[] args)
{
// Creates a new App that manages the Single Instance background work
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
App myApp = new App();
myApp.Run(args);
}
}
public class App : WindowsFormsApplicationBase
{
public App()
: base()
{
// Make this …Run Code Online (Sandbox Code Playgroud) 我正在优化WinForms应用程序的启动.我发现的一个问题是加载了启动画面.它需要大约半秒到一秒.
我知道多线程在UI片段上是禁止的,然而,看看启动画面是一个相当独立的应用程序片段,是否有可能以某种方式通过抛出其他一些线程来缓解其性能损失(可能在Chrome的方式),以便应用程序的重要部分实际上可以开始.
我希望在我的应用程序的主窗体加载时显示启动画面,并且启动窗体应该消失,而不必在构建定时器等等.另一个重要的事情是主窗体应该是确定何时应用程序退出,何时使用我的启动窗体启动应用程序然后用它来打开我的主窗体我无法处理启动画面,因为这会杀死应用程序.
我有一个通过Shown事件调用的C#数据库应用程序的启动画面.启动屏幕包含一些在调用主窗体的构造函数时预处理的信息,因此我使用了Shown事件,因为该信息应该可用.
但是,当显示启动画面时,主窗体会变白,菜单栏,底部菜单栏,甚至灰色背景都是白色和不可见的.看起来程序正在挂起,但是在我内置的5秒延迟之后,横幅消失了,程序正常显示.此外,在横幅上,我有标签,当启动画面显示时不显示...
这是我的代码,为什么它不起作用背后的一些推理会有很大帮助.
SPLASH屏幕代码:
public partial class StartupBanner : Form
{
public StartupBanner(int missingNum, int expiredNum)
{
InitializeComponent();
missingLabel.Text = missingNum.ToString() + " MISSING POLICIES";
expiredLabel.Text = expiredNum.ToString() + " EXPIRED POLICIES";
}
}
Run Code Online (Sandbox Code Playgroud)
来电代码:
private void MainForm_Shown(object sender, EventArgs e)
{
StartupBanner startup = new StartupBanner(missingPoliciesNum, expiredPoliciesNum);
startup.MdiParent = this;
startup.Show();
Thread.Sleep(5000);
startup.Close();
}
Run Code Online (Sandbox Code Playgroud)
使用startup.ShowDialog()在启动屏幕上显示正确的标签信息,但这会锁定应用程序,并且我需要在大约5秒后消失,这就是为什么它会引起轰动.;)
我有一个申请.
首先,我显示一个启动画面,一个表单,这个启动会调用另一个表单.
问题:当显示启动窗体时,如果我然后在启动画面顶部打开另一个应用程序,然后最小化这个新打开的应用程序窗口,则启动画面变为白色.我该如何避免这种情况?我希望我的飞溅能够清晰显示,不受任何应用程序的影响.
我正在处理与C#WinForms应用程序相关的错误,该应用程序以启动画面启动,然后关闭启动画面并打开登录表单.在某些电脑上一切正常.在其他情况下,会出现登录表单,但闪烁的标题栏会在几次闪烁之后完全失去焦点.光标仍在"用户名"文本框中闪烁,但应用程序没有焦点,当您开始输入时,没有任何反应,这对用户来说非常烦人.
操作系统运行似乎没有区别(我们已经尝试过Windows 7和Server 2008),并且在启动应用程序后我们特别没有任何键盘或鼠标输入.
现在 - 有没有人知道什么可能导致应用程序失去焦点?
或者,您将如何调试此问题?我们无法在Visual Studio调试环境中复制问题,但这并不让我感到惊讶,因为我猜这是编译的应用程序如何与操作系统交互的问题......或者我错了?
编辑#1:我认为这是由@vinodpthmn解决的,确保在登录表单出现之前正确关闭了启动画面,但这似乎没有帮助.所以我创建了一个记录器来跟踪所有事件和线程,并找到了以下有趣的日志条目:
Thread 01 - 2012/03/29 12:51:09.693 - Show splash screen
Thread 01 - 2012/03/29 12:51:20.350 - Splash screen closed
Thread 01 - 2012/03/29 12:51:20.490 - Login Form Activated
Thread 01 - 2012/03/29 12:51:20.522 - Login Form Load
Thread 01 - 2012/03/29 12:51:25.694 - Login Form deactivated
Thread 01 - 2012/03/29 12:51:25.694 - Active form =
Thread 01 - 2012/03/29 12:51:25.694 - Active app =
Run Code Online (Sandbox Code Playgroud)
显示活动表单和应用程序的最后一行分别显示Form.ActiveForm和Windows中当前活动的应用程序(此处的代码).它们都是空的/无效的.即便如此,即使在登录表单中加载I调用Activate() …