userinit并运行另一个程序

时间:2013-04-23 01:30:21

标签: c# winlogon

每次计算机启动时我都需要启动一个程序。

公司规则不允许触及运行注册表项。

我在某处读到将可执行文件附加到winlogon注册表中userinit条目末尾的内容将允许程序启动。

我认为这是真的,因为我的应用程序确实启动了....但是,这是疯狂的事情....应用程序从屏幕开始...低于开始按钮。

我将程序设置为在屏幕中心启动...但它不希望显示在正确的位置,直到我执行alt-tab将其带到前面,然后它将显示在正确的位置位置。

所以我的问题是

使用userinit,并将可执行文件附加到值行的末尾,确实启动了应用程序,但是当屏幕尚未建立时如何强制它在屏幕上居中?

谢谢

3 个答案:

答案 0 :(得分:3)

您无需为此修改注册表。实际上,您可能不应为此修改注册表。公司政策有一定程度的意义。

相反,只需将应用程序可执行文件的快捷方式添加到Startup文件夹即可。 (或者,如果要在启动时为所有用户运行它,请将其添加到“所有用户启动”文件夹中。)

手动操作非常简单 - 只需将快捷方式拖到文件夹中即可。典型的路径类似于:

%APPDATA%\Microsoft\Windows\Start Menu\Programs\StartUp (for a single user)

%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\StartUp (for all users)

但是以编程方式执行此操作并不是非常困难。您只需要检索文件夹的路径 - 不要硬编码!要从C#执行此操作,请调用Environment.GetFolderPath函数,指定SpecialFolder.StartupSpecialFolder.CommonStartup值。

答案 1 :(得分:0)

如果您只是在谈论WinForm应用程序的位置,也许您可​​以试试这个:

void SetLocation(Point location) {
    var context=SynchronizationContext.Current;

    (new Thread(
        () => {
            SendOrPostCallback d=dummy => {
                this.Location=location;
            };

            for(; ; Thread.Sleep(0))
                try {
                    context.Send(d, null);
                }
                catch(InvalidAsynchronousStateException ex) {
                    break;
                }
        })).Start();
}

例如,在表单加载或您希望的某个事件处理程序中调用它:

SetLocation(Point.Empty);

它永远执行以设置表单的位置;你可能想要编写一个方法,一旦它已经设置到你想要的位置就终止它。

答案 2 :(得分:0)

这是视频驱动程序...更新了它,对话框显示在屏幕中央,编码。