Я написал заставку C#, которая работает в режиме предварительного просмотра (установки), конфигурации или даже тестового режима. Однако при достижении таймера Windows для его запуска экран становится черным, я вижу значок загрузки мыши в течение 2-3 секунд, а затем экран возвращается на рабочий стол.
Я добавляю запись в файл журнала в качестве первой строки кода в моем main()
, и кажется, что этот код никогда не запускается при запуске Windows.
Использование Visual Studio 2017 в Windows 10.
Поскольку я использую старый 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.
Я пробовал как отладочную, так и выпускную сборку... И я использовал ту же структуру кода, чтобы сделать простой пример экранной заставки, отображающей текст, и это сработало, поэтому я действительно думаю, что проблема связана с использованием dll 3D-движка.
Не могли бы вы, ребята, дать совет? Есть ли какие-то особенности в конфигурации, применимые к .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();
}
}
}
}