Windows服務啟動時,如何與UI進行互動

來源:互聯網
上載者:User
   可以參考MSDN《.NET Windows編程系列課程(14):Windows 服務 (Level 200)》
   http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/Series/NETWindows.aspx
    public partial class Server1 : ServiceBase    {        Thread threadForm = null;        public Server1()        {            InitializeComponent();        }        [DllImport("user32.dll")]        static extern int GetDesktopWindow();         [DllImport("user32.dll")]        static extern IntPtr GetProcessWindowStation();         [DllImport("kernel32.dll")]        static extern IntPtr GetCurrentThreadId();         [DllImport("user32.dll")]        static extern IntPtr GetThreadDesktop(IntPtr dwThread);         [DllImport("user32.dll")]        static extern IntPtr OpenWindowStation(string a, bool b, int c);         [DllImport("user32.dll")]        static extern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,        bool fInherit, uint dwDesiredAccess);         [DllImport("user32.dll")]        static extern IntPtr CloseDesktop(IntPtr p);         [DllImport("rpcrt4.dll", SetLastError = true)]        static extern IntPtr RpcImpersonateClient(int i);          [DllImport("rpcrt4.dll", SetLastError = true)]        static extern IntPtr RpcRevertToSelf();         [DllImport("user32.dll")]        static extern IntPtr SetThreadDesktop(IntPtr a);         [DllImport("user32.dll")]        static extern IntPtr SetProcessWindowStation(IntPtr a);        [DllImport("user32.dll")]        static extern IntPtr CloseWindowStation(IntPtr a);         protected override void OnStart(string[] args)        {            threadForm = new Thread(new ThreadStart(FormShow));            threadForm.Start();        }         protected override void OnStop()        {            if (threadForm != null)            {                if (threadForm.IsAlive)                {                    threadForm.Abort();                    threadForm = null;                }            }         }        void FormShow()        {             GetDesktopWindow();            IntPtr hwinstaSave = GetProcessWindowStation();            IntPtr dwThreadId = GetCurrentThreadId();            IntPtr hdeskSave = GetThreadDesktop(dwThreadId);            IntPtr hwinstaUser = OpenWindowStation("WinSta0", false, 33554432);            if (hwinstaUser == IntPtr.Zero)            {                RpcRevertToSelf();                return;            }            SetProcessWindowStation(hwinstaUser);            IntPtr hdeskUser = OpenDesktop("Default", 0, false, 33554432);            RpcRevertToSelf();            if (hdeskUser == IntPtr.Zero)            {                SetProcessWindowStation(hwinstaSave);                CloseWindowStation(hwinstaUser);                return;            }            SetThreadDesktop(hdeskUser);             IntPtr dwGuiThreadId = dwThreadId;             Form1 f = new Form1(); //此FORM1可以帶notifyIcon,可以顯示在托盤裡,使用者可點擊托盤表徵圖進行設定            System.Windows.Forms.Application.Run(f);              dwGuiThreadId = IntPtr.Zero;            SetThreadDesktop(hdeskSave);            SetProcessWindowStation(hwinstaSave);            CloseDesktop(hdeskUser);            CloseWindowStation(hwinstaUser);        }     }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.