帮助别人就是帮助自己! 如果这里解决了您的问题,请您点一下推荐

C#如何实现一个进程?当整点的时候,进行弹窗报时?

C#如何实现一个进程?当整点的时候,进行弹窗报时?

有一个Form程序,我想让程序启动时,任务管理器里有个A.exe进行,表示该Form程序正在运行。

我想实现:当A.exe运行时,同时开启B.exe执行(即在任务管理器中可以看到B.exe在运行)
,B.exe的作用是当整点时,弹出窗口进行报时。

我想到了用进程(不想用线程),不知道还有什么其他更好的办法?
C#语言 106 次浏览 2010-11-23 22:35

16 个回答

想法很好啊, 你只需要解决两个问题:
- A中判断什么时候是正点。
- 正点以后执行B。

这些都不难实现
2010-11-24 00:48 推荐: 0 次
有timer控件的。
2010-11-24 01:59 推荐: 0 次
没必要用进程或线程,用一个timer控件即可。
C# code
DateTime now = DateTime.Now; // 当前时间 DateTime zhengdian = new DateTime(now.Year, now.Month, now.Day, now.Hour + 1, 0, 0); // 下一个整点时间 TimeSpan ts = zhengdian - DateTime.Now; // 间隔 timer1.Interval = (int)ts.TotalMilliseconds; // 设置timer时间,单位是毫秒 timer1.Enabled = true; // 启动 timer // timer到时 private void timer1_Tick(object sender, EventArgs e) { timer1.Interval = 3600 * 1000; // 一小时,单位是毫秒 // ...... 弹窗报时

2010-11-24 04:54 推荐: 0 次
3楼计算整点的方法显然不对,这样应该可以:
  DateTime t = DateTime.Now.AddHours(1);
  DateTime zhengdian = new DateTime(t.Year, t.Month, t.Day, t.Hour, 0, 0);
2010-11-24 05:10 推荐: 0 次
timer控件可以在间隔一定时间触发某个事件
2010-11-24 07:50 推荐: 0 次
引用 3 楼 brookmill 的回复:
没必要用进程或线程,用一个timer控件即可。

C# code
DateTime now = DateTime.Now; // 当前时间
DateTime zhengdian = new DateTime(now.Year, now.Month, now.Day, now.Hour + 1, 0, 0); // 下一个整点时间
……

顶一个
直接在B里实现,完全和A不相干最好,当然A调用B是可以的。
 DateTime t = DateTime.Now.AddHours(1);
  DateTime zhengdian = new DateTime(t.Year, t.Month, t.Day, t.Hour+1, 0, 0);
2010-11-24 08:13 推荐: 0 次
时间控件Timer可以实现,它有一个Interval属性就是隔多久调用一次
2010-11-24 08:35 推荐: 0 次
的确没必要用线程,你可以用另一个窗体+timer
2010-11-24 09:12 推荐: 0 次
引用 3 楼 brookmill 的回复:

没必要用进程或线程,用一个timer控件即可。
C# code
DateTime now = DateTime.Now; // 当前时间
DateTime zhengdian = new DateTime(now.Year, now.Month, now.Day, now.Hour + 1, 0, 0); // 下一个整点时间
……


我举这个整点报时的例子是可以用timer,但是现实情况,比整点报时要复杂,所以得用进程。 整点报时只是举例而已。 最要A和B是不相干的。
2010-11-24 09:20 推荐: 0 次
引用 7 楼 pcqpzq 的回复:

引用 3 楼 brookmill 的回复:
没必要用进程或线程,用一个timer控件即可。

C# code
DateTime now = DateTime.Now; // 当前时间
DateTime zhengdian = new DateTime(now.Year, now.Month, now.Day, now.Hour + 1, 0, 0); // 下一个整点时间
……

……


我举这个整点报时的例子是可以用timer,但是现实情况,比整点报时要复杂,所以得用进程。 整点报时只是举例而已。 最要A和B是不相干的。
2010-11-24 09:21 推荐: 0 次
引用 9 楼 jianshao810 的回复:
的确没必要用线程,你可以用另一个窗体+timer


用timer 正确
2010-11-24 17:41 推荐: 0 次
我知道了,搞两个程序,A计时,到时执行B,完事后B自动退出
2010-11-24 19:45 推荐: 0 次
A包含下面程序
 string Pct = System.Environment.CurrentDirectory.ToString();
 Open("" + Pct + "//B.exe");
//----------------
private void OpenRespond(string pat)
  {

  System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
  Info.FileName = pat;
  Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;  
  System.Diagnostics.Process Proc;
  try
  {
  Proc = System.Diagnostics.Process.Start(Info);
  }
  catch
  {
  }

  }

B就和他们说的那样.用timer
2010-11-24 20:00 推荐: 0 次
private void Open(string pat)
  {

  System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
  Info.FileName = pat;
  Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;  
  System.Diagnostics.Process Proc;
  try
  {
  Proc = System.Diagnostics.Process.Start(Info);
  }
  catch
  {
  }

  }
2010-11-24 20:01 推荐: 0 次
现在知道该怎么实现了,用Windows SERVICE
2010-11-25 15:57 推荐: 0 次
要用到windows message 分成两个窗体 
1发送窗体


//发送方:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WinFormSendMsg
{
  public partial class Form1 : System.Windows.Forms.Form
  {
  private System.Windows.Forms.TextBox textBox1;
  private System.Windows.Forms.Button button1;
  private System.ComponentModel.Container components = null;
  const int WM_COPYDATA = 0x004A;
  public Form1()
  {
  InitializeComponent();
  }
  protected override void Dispose(bool disposing)
  {
  if (disposing)
  {
  if (components != null)
  {
  components.Dispose();
  }
  }
  base.Dispose(disposing);
  }

  private void InitializeComponent()
  {
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.button1 = new System.Windows.Forms.Button();
  this.SuspendLayout();
  //
  // textBox1
  //
  this.textBox1.Location = new System.Drawing.Point(184, 24);
  this.textBox1.Name = "textBox1";
  this.textBox1.Size = new System.Drawing.Size(128, 21);
  this.textBox1.TabIndex = 0;
  this.textBox1.Text = "textBox1";
  //
  // button1
  //
  this.button1.Location = new System.Drawing.Point(344, 16);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(112, 32);
  this.button1.TabIndex = 1;
  this.button1.Text = "button1";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(536, 142);
  this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.button1,
this.textBox1});
  this.Name = "Form1";
  this.Text = "发送方窗体";
  this.ResumeLayout(false);
  }
  static void Main()
  {
  Application.Run(new Form1());
  }
  [DllImport("User32.dll", EntryPoint = "SendMessage")]
  private static extern int SendMessage(
  int hWnd, // handle to destination window
  int Msg, // message
  int wParam, // first message parameter
  ref COPYDATASTRUCT lParam // second message parameter
  );

  [DllImport("User32.dll", EntryPoint = "FindWindow")]
  private static extern int FindWindow(string lpClassName, string
  lpWindowName);

  private void button1_Click(object sender, System.EventArgs e)
  {
  int WINDOW_HANDLER = FindWindow(null, @"接收方窗体");
  if (WINDOW_HANDLER == 0)
  {
  }
  else
  {
  byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
  int len = sarr.Length;
  COPYDATASTRUCT cds;
  cds.dwData = (IntPtr)100;
  cds.lpData = this.textBox1.Text;
  cds.cbData = len + 1;
  SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);

  }
  }
  }
  public struct COPYDATASTRUCT
  {
  public IntPtr dwData;
  public int cbData;
  [MarshalAs(UnmanagedType.LPStr)]
  public string lpData;
  }

}


2接收窗体 :

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WindowsFormGetMsg
{
  public partial class Form1 : System.Windows.Forms.Form
  {
  private System.Windows.Forms.TextBox textBox1;
  private System.ComponentModel.Container components = null;
  const int WM_COPYDATA = 0x004A;
  public Form1()
  {
  InitializeComponent();
  }
  protected override void Dispose(bool disposing)
  {
  if (disposing)
  {
  if (components != null)
  {
  components.Dispose();
  }
  }
  base.Dispose(disposing);
  }
  private void InitializeComponent()
  {
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.SuspendLayout();
  //
  // textBox1
  //
  this.textBox1.Location = new System.Drawing.Point(176, 32);
  this.textBox1.Name = "textBox1";
  this.textBox1.Size = new System.Drawing.Size(160, 21);
  this.textBox1.TabIndex = 0;
  this.textBox1.Text = "textBox1";
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(432, 266);
  this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.textBox1});
  this.Name = "Form1";
  this.Text = "接收方窗体";
  this.ResumeLayout(false);
  }
  static void Main()
  {
  Application.Run(new Form1());
  }
  protected override void DefWndProc(ref System.Windows.Forms.Message m)
  {
  switch (m.Msg)
  {
  case WM_COPYDATA:
  COPYDATASTRUCT mystr = new COPYDATASTRUCT();
  Type mytype = mystr.GetType();
  mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
  this.textBox1.Text = mystr.lpData;
  break;
  default:
  base.DefWndProc(ref m);
  break;
  }
  }
  }
  public struct COPYDATASTRUCT
  {
 
2010-11-25 16:18 推荐: 0 次