hao_2468

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

使用方法

要注意的是 安装服务后 设置服务让可以与用户交互。

  1.  protected override void OnStart(string[] args)
  2.         {
  3.             Thread _TestForm = new Thread(new ThreadStart(StartListen));
  4.             _TestForm.Start();
  5.         }
  6.         public void StartListen()
  7.         {
  8.       
  9.             Zgke.WindowFrom.Service.ServerWindows.ServiceForm(EventLog);
  10.             System.Windows.Forms.Form _MyForm = new System.Windows.Forms.Form();
  11.             _MyForm.Text = "打开窗体 Application";
  12.             
  13.            
  14.             System.Windows.Forms.Application.Run(_MyForm);
  15.             while (true)
  16.             {
  17.                 Thread.Sleep(100000);
  18.             }            
  19.         }

 

下面是全部类

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. namespace Zgke.WindowFrom.Service
  6. {
  7.     /// <summary>
  8.     /// WINDOWS SERVER 开启窗体
  9.     /// zgke@sina.com
  10.     /// qq:116149
  11.     /// </summary>
  12.     public class ServerWindows
  13.     {
  14.        
  15.         /// <summary>
  16.         /// 开启窗体 使用后用 System.Windows.Forms.Application.Run(_Form);来启动窗体
  17.         /// </summary>
  18.         /// <param name="s">日志</param>
  19.         public static void ServiceForm(System.Diagnostics.EventLog p_ServiceLog)
  20.         {
  21.             try
  22.             {
  23.                 GetDesktopWindow();
  24.                 IntPtr _WindowsStation = GetProcessWindowStation();
  25.                 IntPtr _ThreadID = GetCurrentThreadId();
  26.                 IntPtr _DeskTop = GetThreadDesktop(_ThreadID);
  27.                 IntPtr _HwinstaUser = OpenWindowStation("WinSta0"false, 33554432);
  28.                 if (_HwinstaUser == IntPtr.Zero)
  29.                 {
  30.                     RpcRevertToSelf();
  31.                     return;
  32.                 }
  33.                 SetProcessWindowStation(_HwinstaUser);
  34.                 IntPtr _HdeskUser = OpenDesktop("Default", 0, false, 33554432);
  35.                 RpcRevertToSelf();
  36.                 if (_HdeskUser == IntPtr.Zero)
  37.                 {
  38.                     SetProcessWindowStation(_WindowsStation);
  39.                     CloseWindowStation(_HwinstaUser);
  40.                     return;
  41.                 }
  42.                 SetThreadDesktop(_HdeskUser);
  43.                 IntPtr _GuiThreadId = _ThreadID;
  44.                 _GuiThreadId = IntPtr.Zero;
  45.                 SetThreadDesktop(_DeskTop);
  46.                 SetProcessWindowStation(_WindowsStation);
  47.                 CloseDesktop(_HdeskUser);
  48.                 CloseWindowStation(_HwinstaUser);
  49.             }
  50.             catch (Exception ex)
  51.             {
  52.                 p_ServiceLog.WriteEntry(ex.ToString());
  53.             }
  54.         }
  55.         #region User32.DLL
  56.         [DllImport("user32.dll")]
  57.         private static extern int GetDesktopWindow();
  58.         [DllImport("user32.dll")]
  59.         private static extern IntPtr GetProcessWindowStation();
  60.         [DllImport("kernel32.dll")]
  61.         private static extern IntPtr GetCurrentThreadId();
  62.         [DllImport("user32.dll")]
  63.         private static extern IntPtr GetThreadDesktop(IntPtr dwThread);
  64.         [DllImport("user32.dll")]
  65.         private static extern IntPtr OpenWindowStation(string lpszWinSta, bool fInherit, int dwDesiredAccess);
  66.         [DllImport("User32.dll")]
  67.         private static extern IntPtr OpenDesktop(string lpsxDesktop, uint dwFlags, bool fInherit, uint dwDesiredAccess);
  68.         [DllImport("user32.dll")]
  69.         private static extern IntPtr CloseDesktop(IntPtr hDesktop);
  70.         [DllImport("user32.dll")]
  71.         private static extern IntPtr SetThreadDesktop(IntPtr hDesktop);
  72.         [DllImport("user32.dll")]
  73.         private static extern IntPtr SetProcessWindowStation(IntPtr hWinSta);
  74.         [DllImport("user32.dll")]
  75.         private static extern IntPtr CloseWindowStation(IntPtr hWinSta);
  76.         #endregion
  77.         #region Rpcrt4.dll
  78.         [DllImport("rpcrt4.dll", SetLastError = true)]
  79.         private static extern IntPtr RpcImpersonatClient(int rpc);
  80.         [DllImport("rpcrt4.dll", SetLastError = true)]
  81.         private static extern IntPtr RpcRevertToSelf();
  82.         #endregion
  83.     }
  84. }

posted on 2009-12-09 17:04  hao_2468  阅读(255)  评论(0编辑  收藏  举报