Запустить приложение, скрытое в Dot Net Compact Framework - PullRequest
1 голос
/ 22 июля 2010

Я пытаюсь скрыть загрузку моего приложения при загрузке Windows. Я создал ярлык с параметром, и я пытаюсь скрыть форму, если параметр равен "WINDOWS". Но Форма ВСЕГДА отображается независимо от того, скрываю ли я форму или устанавливаю для видимости значение false. Как мне это сделать?

[MTAThread]
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                Debug.WriteLine("Arguments were passed");
                foreach (string item in args)
                {
                    MessageBox.Show(item);
                }


                Application.Run(new frmMain("WINDOWS"));
            }    

        }

и в конструкторе frmMain

public frmMain(string Argument)
        {
            InitializeComponent();

            if (Argument != null && Argument != "")
            {                
                if (Argument == "WINDOWS")
                {
                    this.Visible = false;
                    //Hide();
                }  
           }

Но окно frmMain ВСЕГДА отображается. Как заставить его загружаться скрытно?

Большое спасибо заранее:)

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Полагаю, правильный ответ - запустить собственный насос сообщений.Я скопировал следующий код из блога BenPas (ранее по адресу http://blog.xeviox.com),, который я мог найти только в кеше Google - ссылка на страницу была мертвой. Но я проверил код, и он работает.

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public static implicit operator System.Drawing.Point(POINT p)
    {
        return new System.Drawing.Point(p.X, p.Y);
    }
        public static implicit operator POINT(System.Drawing.Point p)
    {
        return new POINT(p.X, p.Y);
    }
}

[StructLayout(LayoutKind.Sequential)]
public struct MSG
{
    public IntPtr hwnd;
    public UInt32 message;
    public IntPtr wParam;
    public IntPtr lParam;
    public UInt32 time;
    public POINT pt;
}

[DllImport("coredll.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin,
   uint wMsgFilterMax);

[DllImport("coredll.dll")]
public static extern bool TranslateMessage([In] ref MSG lpMsg);

[DllImport("coredll.dll")]
public static extern IntPtr DispatchMessage([In] ref MSG lpmsg);

Вот как вы можете использовать его для создания цикла сообщений:

    [MTAThread]
    static void Main()
    {
        HiddenForm f = new HiddenForm();

        MSG msg;
        while(GetMessage(out msg, IntPtr.Zero, 0, 0))
        {
            TranslateMessage(ref msg);
            DispatchMessage(ref msg);
        }
    }

С вышеупомянутыми сообщениями таймера и обратными вызовами на основе Windows, но окно не отображается, и там ничего не добавленона панель задач.

1 голос
/ 22 июля 2010

Определение метода Application.Run(Form):

"Начинает выполнение стандартного цикла сообщений приложения в текущем потоке и делает указанную форму видимой."

Вы можете создатьформировать, затем спать или блокировать, пока вы не захотите, чтобы Форма была видимой, а затем вызовите Application.Run() в Форме, которую вы создали, когда пришло время показывать ее.

Если приложению необходимо выполнить задачи еще доформа отображается, вы можете поместить этот код вне логики формы (или даже вообще не использовать форму).

0 голосов
/ 17 ноября 2010
...