baidu

[WM]创建一个不会退出的Console程序

 

  经常碰到一种需求,就是需要监听某些东西,就需要创建一个能在后台跑的程序.很显然服务能满足你的需求,不过我没写过服务程序,不知道具体怎么运作的(应该是暴露几个导出函数给操作系统),但是可以用其他的办法到达你想要的效果.

  Windows程序之所以会持久运行,就是因为其消息机制.消息循环从消息队列里面不断抽取消息,分发给窗口,系统调用窗口过程.而这个类似于死循环一样的消息循环正是程序不会退出的原因(暂时不会退出).

 

	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

 

  想要做一个在后台跑的程序,这个消息循环是必不可少的.现在无非就是要弄一个能处理消息的东西,有两个选择:

  •  直接在分发消息之前处理,在消息循环中间横插一杠.
  •  还是利用原来的窗口过程,让操作系统来执行.

  中间横插一杠,看着很简单容易理解,但是据说窗口过程是操作系统执行的,因为操作系统需要给程序分配时间片,如果你自己执行,操作系统就不知道要分配多少时间片.还是利用原来的窗口过程,创建一个窗口类,创一个窗口.我们需要做的就是,不让那个窗口显示出来....(除此之外,我想不到怎么才能让窗口句柄和窗口过程联系起来,哪位达人知道可以指点一二)

  CreateWindow创建的时候,可以指定窗口显示不显示.(之前在Win32上面实验过,到WM上面实验的时候没注意...结果创建一个直接被显示的窗口)

 

 

    hWnd = CreateWindow(szWindowClass, 
						szTitle, 
						WS_DISABLED,//丫的就是这个参数
						CW_USEDEFAULT, 
						CW_USEDEFAULT, 
						CW_USEDEFAULT, 
						CW_USEDEFAULT, 
						NULL, 
						NULL, 
						hInstance, 
						NULL);

 

 

  后面VS默认生成的代码,还会ShowWindow,UpdateWindow,只需要把这两行注释掉即可

    //ShowWindow(hWnd, nCmdShow);
    //UpdateWindow(hWnd);

  剩下的就是FindWindow,SendMessage,或者PostMessage了.

 

PS:

这个道理在.NET CF下面也是可行的.Application.Run(Form f)其实就是一个消息循环+f.Show().你完全可以自己P/Invoke一个消息循环,至于Show不Show就是你自己的事儿了.:P

posted @ 2010-01-19 14:34  egmkang  阅读(4749)  评论(9编辑  收藏  举报