【发布时间】:2014-05-02 18:25:46
【问题描述】:
我有一个提供 30 天免费试用的 C# Windows 程序。之后,用户必须购买该产品,否则它将被锁定。当程序查询我的网络服务器以查看用户是否正在篡改数据以试图让程序在不购买的情况下运行时,我制作了一个启动屏幕来占用用户。
在我的 Windows 8 机器上(我使用的是 .Net Framework 3.5),启动画面很好地出现,然后 MessageBox 出现(在启动画面的顶部)为他们提供诸如“您的 30 天免费试用”之类的信息还有 2 天”。
然而,在我的 XP 机器上,MessageBox 被闪屏隐藏了。关于如何 SendToFront() MessageBox 或 SendToBack() 启动屏幕的任何想法?如果我只是尝试将初始屏幕上的表单发送到后面,那与将整个线程发送到后面不同。
这是显示启动画面的代码:
static public void ShowSplashScreen() {
// Make sure it's only launched once.
if (ms_frmSplash != null)
return;
ms_oThread = new Thread(new ThreadStart(SplashScreen.ShowForm));
ms_oThread.Name = "SplashScreenThread";
ms_oThread.IsBackground = true;
ms_oThread.SetApartmentState(ApartmentState.STA);
ms_oThread.Start();
while (ms_frmSplash == null || ms_frmSplash.IsHandleCreated == false) {
System.Threading.Thread.Sleep(TIMER_INTERVAL);
}
}
【问题讨论】:
-
一些源代码对诊断您的问题非常有帮助。
-
您是否从主 GUI 线程运行启动画面和消息框?
-
我为此使用了codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C。它正在从一个单独的线程运行启动画面。我会将 ShowSplashScreen() 的代码添加到原始问题中...谢谢!
-
您的程序不应使用多个 UI 线程。与其创建第二个 UI 线程然后阻塞原始 UI 线程,不如在原始 UI 线程中显示初始屏幕并在新线程中执行非 UI 工作。
标签: c# screen splash-screen