1

我编写了一个 C# 屏幕保护程序,它可以在预览(安装)模式、配置甚至测试模式下工作。但是,当达到 Windows 计时器启动它时,屏幕变黑,我看到鼠标加载图标 2-3 秒,然后屏幕恢复到桌面上。

我在我的第一行代码中添加了一个日志文件条目,main()并且似乎该代码在由 Windows 启动时永远不会运行。

在 Windows 10 上使用 Visual Studio 2017。

由于我使用的是旧的 3D 引擎,因此我确保修改了 app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup useLegacyV2RuntimeActivationPolicy="true"> 
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
      <supportedRuntime version="v1.1.4322"/>
    </startup>
</configuration>

我将 Screensaver.exe 重命名为 Screensaver.scr,并将 app.config 重命名为 Screensaver.scr.config。将这些与我的引擎 dll 复制到 SysWOW64 文件夹中。

构建平台目标 = x86。

我尝试了调试和发布版本......并且我使用相同的代码结构来做一个显示文本的屏幕保护程序的简单示例并且它有效,因此我真的认为问题来自于 3D 引擎 dll 的使用。

你们有什么建议吗?配置中是否有一些适用于 .scr 的特殊性?在任何地方都找不到任何线索,我不知道......

如果有帮助,这里是主要代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using TV3D;

namespace ScreenSaver
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            LogMessageToFile("Hello, World");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            CLTV3D tv3d = new CLTV3D();

            if (args.Length > 0)
            {
                string firstArgument = args[0].ToLower().Trim();
                string secondArgument = null;

                // Handle cases where arguments are separated by colon.
                // Examples: /c:1234567 or /P:1234567
                if (firstArgument.Length > 2)
                {
                    secondArgument = firstArgument.Substring(3).Trim();
                    firstArgument = firstArgument.Substring(0, 2);
                }
                else if (args.Length > 1)
                    secondArgument = args[1];

                if (firstArgument == "/c")           // Configuration mode
                {
                    Application.Run(new ScreenSaverSettingsForm());
                }
                else if (firstArgument == "/p")      // Preview mode
                {
                    if (secondArgument == null)
                    {
                        MessageBox.Show("Sorry, but the expected window handle was not provided.",
                            "ScreenSaver", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    IntPtr previewWndHandle = new IntPtr(long.Parse(secondArgument));
                    Application.Run(new TVForm(previewWndHandle, tv3d));


                }
                else if (firstArgument == "/s")      // Full-screen mode
                {
                    tv3d.TV.AddToLog("full screen mode argument detected");

                    foreach (Screen screen in Screen.AllScreens)
                    {
                        TVForm tv = new TVForm(screen.Bounds, screen.DeviceName, tv3d);
                        tv.Show();
                    }
                    Application.Run();
                }
                else    // Undefined argument
                {
                    MessageBox.Show("Sorry, but the command line argument \"" + firstArgument +
                        "\" is not valid.", "ScreenSaver",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
            else    // No arguments - treat like /c
            {
                Application.Run(new ScreenSaverSettingsForm());
            }
        }



        static public string GetTempPath()
        {
            string path = System.Environment.GetEnvironmentVariable("TEMP");
            if (!path.EndsWith("\\")) path += "\\";
            return path;
        }

        static public void LogMessageToFile(string msg)
        {
            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + "My Log File.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }


    }
}
4

1 回答 1

0

看起来您已将其范围缩小到 3d 组件。

如果没有日志文件,您可以确定应用程序无法启动,并且如果没有错误消息,则很难诊断原因。以下是一些故障排除步骤。

尝试:

  • 事件日志中的线索,
  • Assembly.Load在 Try/Catch 中使用“后期绑定”CLTV3D ,
  • 运行 ProcessMonitor 以查看它说明失败的原因。

如果上述方法不起作用,请设置 DebugDiag(或带有 WinDbg 和 SOS 的 AdPlus)并分析故障转储。

做不到这一点,.Net 1.1 就像 15 岁!帮自己一个忙,使用最新的库会容易得多。

于 2017-08-05T04:34:06.257 回答