我为某种机器编写了一个HMI(人机界面)程序.该程序在带有"Windows Standard Embedded 7"的触摸面板上运行.我想我的问题是它是Windows 7的嵌入式版本没有任何区别.
WindowState我的程序的主要形式被设置为Normal,且尺寸设置为匹配触摸面板(1280×800)的分辨率. FormBorderStyle设置为None. StartPosition设置为CenterScreen.问题是:
当直接在触摸屏上启动程序时,程序将按原样显示,从顶部/左侧到右侧/底部完全填满屏幕.还行吧!
当程序没有运行并且您通过远程桌面登录触摸面板(使用更大的屏幕,比方说1920x1200),然后然后启动程序(通过rdp会话)程序也按预期启动,如中间所示屏幕尺寸为1280x800.还行吧!
当通过rdp登录时程序已经运行程序显示为最大化,填满整个屏幕(1920x1200).这不好,因为我的程序的整个布局是为1280x800制作的!
有没有人知道为什么我的程序表现得像这样,或者问题与rdp会话有什么关系?
我想要的是
每当Windows中的时区更改时,我都想做些事情。
到目前为止我有什么
为此,我实现了事件SystemEvents.TimeChanged,如下所示:
在构造函数中:
SystemEvents.TimeChanged += SystemEvents_TimeChanged;
Run Code Online (Sandbox Code Playgroud)
事件主体:
void SystemEvents_TimeChanged(object sender, EventArgs e)
{
MessageBox.Show("Test1");}
Run Code Online (Sandbox Code Playgroud)
问题是什么
在Windows中更改时间或时区时,不会触发该事件。
我尝试过的
当我在干净的WinForms应用程序中编写以上代码时,一切都按预期工作。但是在我的应用程序中却没有,原因是包含许多其他代码。我看不到我还有其他任何事件,应该阻止上述事件的触发。
我的问题是
有谁知道什么可能导致上述代码无法在我的应用程序中触发,但是在创建仅包含上述代码的新项目/应用程序时按预期工作?
更新1
这是因为我在调用之前在单独的线程中显示了启动屏幕
Application.Run(new FormMain());
Run Code Online (Sandbox Code Playgroud)
然后,SystemEvents会坚持启动屏幕创建的线程,即使在加载应用程序后该线程也会终止。
现在的问题是,是否有一种方法可以告诉SystemEvents,当应用程序加载后,现在应该使用“正确的” UI线程吗?
在我的应用程序中,我需要加密各种设置和密码。\n到目前为止,我一直在使用 RijndaelManaged 类等执行此操作,如下所示:
\n\n/// <summary>\n/// Encrypts the string defined by parameter "data" and returns the encrypted data as string\n/// </summary>\n/// <param name="data">Data to be encrypted</param>\n/// <returns>The encrypted data</returns>\npublic static string Encrypt(string data)\n {\n if (data == "")\n return "";\n\n byte[] bytes = Encoding.ASCII.GetBytes(initVector);\n byte[] rgbSalt = Encoding.ASCII.GetBytes(saltValue);\n byte[] buffer = Encoding.UTF8.GetBytes(data);\n byte[] rgbKey = new PasswordDeriveBytes(passPhrase, rgbSalt, hashAlgorithm, passwordIterations).GetBytes(keySize / 8);\n RijndaelManaged managed = new RijndaelManaged();\n managed.Mode = CipherMode.CBC;\n ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes);\n MemoryStream memStream = new MemoryStream();\n …Run Code Online (Sandbox Code Playgroud) 任务定义为:
Name: "TaskAutoLogon"; Description: "{cm:TaskAutoLogon}"; Flags: unchecked
Run Code Online (Sandbox Code Playgroud)
用户可以选择是否向注册表编写密钥,如下所示:
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon; ValueType: dword; ValueName: AutoAdminLogon; ValueData: 1; Tasks: TaskAutoLogon
Run Code Online (Sandbox Code Playgroud)
我的问题是: 仅当未选中/未选中任务时,如何告诉Inno Setup将注册表项写入注册表?我实际上想反转任务的含义。
我知道可以使用[code]部分中的某些代码来完成此操作,但我希望有一种更本地化的方法。
提前致谢!
我有以下代码:
DateTime[] localTimeArray = GetTimeData<DateTime>();
Run Code Online (Sandbox Code Playgroud)
现在的问题是,.ToLocalTime()在将GetTimeData它们复制到新数组之前,我需要调用返回的数组中的每个元素.
如何在不必手动迭代每个项目的情况下进行此操作?
显然以下不起作用:
DateTime[] localTimeArray = GetTimeData<DateTime>().ToLocalTime();
Run Code Online (Sandbox Code Playgroud)
与GetTimeData外部库一样,我无法按照注释中的建议在其中添加代码.
这是我为重现该问题而做的测试应用程序:

请查看以下测试代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(radioGroup1.Items[0]);
ShowMessage(BoolToStr(radioGroup1.Buttons[0].Enabled));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(radioGroup1.Items[0]);
ShowMessage(BoolToStr(radioGroup1.Buttons[0].Enabled)); //<- Fails!!!
end;
Run Code Online (Sandbox Code Playgroud)
将显示FormCreate中的第一个ShowMessage,并显示正确的文本(Item1).
FormCreate中的第二个代码行抛出一个异常,该索引超出范围.
如果我在按钮单击事件中运行相同的代码,如代码中所示(在表单加载后)一切正常.
问题1: 在FormCreate中执行第二个代码行时,似乎没有加载按钮.为什么会出现这样的情况,当项目本身似乎已经加载?
问题2: 在将现有(运行良好)项目从Delphi 2006升级到XE6时,我注意到了这个问题.由于此问题,此项目现在在不同的单元中引发了几个异常.在这方面发生了什么变化?
提前感谢您的帮助!
c# ×4
winforms ×2
arrays ×1
delphi ×1
delphi-xe ×1
dpapi ×1
encryption ×1
events ×1
inno-setup ×1