经常碰到一种需求,就是需要监听某些东西,就需要创建一个能在后台跑的程序.很显然服务能满足你的需求,不过我没写过服务程序,不知道具体怎么运作的(应该是暴露几个导出函数给操作系统),但是可以用其他的办法到达你想要的效果.
Windows程序之所以会持久运行,就是因为其消息机制.消息循环从消息队列里面不断抽取消息,分发给窗口,系统调用窗口过程.而这个类似于死循环一样的消息循环正是程序不会退出的原因(暂时不会退出).
1 while (GetMessage(&msg,NULL,0,0))
2 {
3 TranslateMessage(&msg);
4 DispatchMessage(&msg);
5 }
想要做一个在后台跑的程序,这个消息循环是必不可少的.现在无非就是要弄一个能处理消息的东西,有两个选择:
直接在分发消息之前处理,在消息循环中间横插一杠.
还是利用原来的窗口过程,让操作系统来执行.
中间横插一杠,看着很简单容易理解,但是据说窗口过程是操作系统执行的,因为操作系统需要给程序分配时间片,如果你自己执行,操作系统就不知道要分配多少时间片.还是利用原来的窗口过程,创建一个窗口类,创一个窗口.我们需要做的就是,不让那个窗口显示出来....(除此之外,我想不到怎么才能让窗口句柄和窗口过程联系起来,哪位达人知道可以指点一二)
CreateWindow创建的时候,可以指定窗口显示不显示.(之前在Win32上面实验过,到WM上面实验的时候没注意...结果创建一个直接被显示的窗口)
01 hWnd = CreateWindow(szWindowClass,
02 szTitle,
03 WS_DISABLED,//丫的就是这个参数
04 CW_USEDEFAULT,
05 CW_USEDEFAULT,
06 CW_USEDEFAULT,
07 CW_USEDEFAULT,
08 NULL,
09 NULL,
10 hInstance,
11 NULL);
后面VS默认生成的代码,还会ShowWindow,UpdateWindow,只需要把这两行注释掉即可
1 //ShowWindow(hWnd, nCmdShow);
2 //UpdateWindow(hWnd);
剩下的就是FindWindow,SendMessage,或者PostMessage了.
PS:
这个道理在.NET CF下面也是可行的.Application.Run(Form f)其实就是一个消息循环+f.Show().你完全可以自己P/Invoke一个消息循环,至于Show不Show就是你自己的事儿了。