[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