net做的windows服务程序,如何与用户界面交互?

allen12345 2012-07-10 10:20:51
我用.net做了个windows服务程序,网上查到了些东西,可以弹出个winform用户界面来了,现在我想在服务中放个timer,定时的写些内容,并显示在winform用户界面中的textbox1里,该怎么做?我的大致代码如下(不成功):

public partial class Service_CARMS : ServiceBase
{
Form_Main f; //与用户交互的Form窗口
System.Threading.Thread threadform = null;
protected override void OnStart(string[] args)
{
threadform = new Thread(new ThreadStart(FormShow));
threadform.Start();

}

public 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;

f = new Form_Main(); //此FORM1可以带notifyIcon,可以显示在托盘里,用户可点击托盘图标进行设置
System.Windows.Forms.Application.Run(f);


dwGuiThreadId = IntPtr.Zero;
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
CloseDesktop(hdeskUser);
CloseWindowStation(hwinstaUser);
}

[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);

private void timer1_Tick(object sender, EventArgs e)
{
//MessageBox.Show("mm");
////////经调试发下以下代码异常,提示
/////"调用的目标发生了异常,..........{"未将对象引用设置到对象的实例
f.ShowInf("触发器触发"); //调用与用户交互的Form里的方法,该方法附加字符串到textbox1中。

}
}

救命啦
...全文
552 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
15px 2014-07-28
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390844919 问题好简单!来人呐,兄弟有难!
nonocast 2012-07-13
  • 打赏
  • 举报
回复
分离2个程序,用socket/pipe/WINDOWS MESSAGE/MSMQ通讯
YapingXin 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
既然带界面了,你为啥还选择window服务去做这样的事情呢?何不直接采用form程序?
[/Quote]

确实有这样的需求:用界面去和service交互。

界面可以被关上,但service却要始终在后台不间断地监听。

allen12345 2012-07-13
  • 打赏
  • 举报
回复
不过我也有变通的解决方案了,就是我不在服务中执行任务,而是在那个弹出的用户界面里执行。
allen12345 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

既然带界面了,你为啥还选择window服务去做这样的事情呢?何不直接采用form程序?
[/Quote]
windows服务,主要是用来防止电脑不小心重启后,他能自动启动服务,要是普通form程序,,虽然可以通过写注册表达到自动自动的功能,但是,如果系统有登录密码的话,还没登录进操作系统,form程序还不会启动吧
孟子E章 2012-07-13
  • 打赏
  • 举报
回复
既然带界面了,你为啥还选择window服务去做这样的事情呢?何不直接采用form程序?
宝_爸 2012-07-13
  • 打赏
  • 举报
回复
zincy 2012-07-13
  • 打赏
  • 举报
回复
System.Threading.Timer
窗户纸 2012-07-13
  • 打赏
  • 举报
回复
最好单起个进程通过管道或SOCKET与服务进行通信,一方面操作更方便,另外还要保证winform把服务的可靠性。
allen12345 2012-07-10
  • 打赏
  • 举报
回复
我用的是组件列表里的timer了,timer能触发,说明不是timer的问题,我估计是
Form_Main f 的生命周期的问题了,他是在线程中被实例化的。
bdmh 2012-07-10
  • 打赏
  • 举报
回复
timer用system的timer,不用form的timer

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧