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

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

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就是你自己的事儿了。

时间: 2024-09-13 21:47:06

[WM]创建一个不会退出的Console程序的相关文章

使用C# Builder创建一个简单的ASP.NET应用程序

一般网站建设通常要求开发人员做后台的程序设计,前面有专业的美工做界面设计.虽然有时候开发人员也会做些界面设计,但是通常都无法达到专业的要求.在以前的ASP中,由于代码和HTML页面语言混杂在一起,这就使得网站的建设变得相当的困难.但在ASP.NET中,这种情况完全改变了.下面就用C# Builder创建一个简单的ASP.NET应用程序. 打开C# Builder,选择 File>New>other-菜单项,你将会看到下面的窗口: 我们选择C# ASP Projects,你就会看到右边有3种可供

创建一个IBM Rational Team Concert应用程序来跟踪机会

本文将介绍如何自定义 IBM® Rational Team Concert,以便将它用于传统应用程序生命周期管理用例以外的用途.本文首先会介绍一个示例场景(构建一个应用程序来跟踪基于 Web 的机会),向 Rational Team Concert 管理员展示如何创建一种新的工作项类型,自定义该工作项类型(添加属性.更新这些属性的编辑器演示,以及配置需要的属性)并测试该工作项类型.文中提供了一些 参考资料 链接,它们进一步介绍了如何创建新工作项.工作流和编辑器演示. 开始之前 要学习本文,您需要

《WCF技术内幕》24:第2部分_第5章_消息:创建一个消息(上)

创建一个消息 可以选择众多定义的CreateMessage工厂方法中的一个来创建Message对象. 绝大部分,这些方法接受的都是SOAP消息体的内容作为参数.非常重要的一点是 Message的body在创建以后就不能再做修改.SOAP消息头块,话句话说,在消息 创建以后还可以增加和修改.一般地说,Message类型的工厂方法可以根据处理 消息的路线图来划分的,从XmlReader提取数据的方法,把数据放进Message的方 法,和产生表示SOAP Fault Message的方法.在我们研究各

《Android UI基础教程》——2.1节创建一个应用

2.1 创建一个应用Android UI基础教程首先,创建一个名叫TimeTracker的新工程.这将会是整本书中你的应用工程的名字.本章中,你将会做完几个简单的布局并创建一个最低限度功能的应用程序.图2.1展示了在本章结束时你将会构建的应用.本书不会涉及太多后台的逻辑并且会专注于用户界面的编码.不过,本书的网站上有所有可用的代码供读者下载:www.peachpit.com/androiduifundamentals. 图2.1 本章结束之时你将会创建的时间跟踪应用

《精通移动App测试实战:技术、工具和案例》一1.7 创建一个Android项目

1.7 创建一个Android项目 前面已经完成了Android开发环境的搭建工作,现在就让我们一起来编写一个简单的Android程序.这里我们要实现一个两个整型数字相加的程序. 1.7.1 创建一个新的Android项目 启动Eclipse,单击"File > New > Android Application Project"菜单项,如图1-42所示. 1.7.2 如何填写Android项目信息 在弹出的图1-43所示界面中,"Application Name

使用Java Swing 创建一个XML编辑器

xml|创建 我想您一定对XML有所了解,说不定您现在还跃跃欲试想写一段XML文本呢,可是现在能找到的跨平台的.免费的XML编辑器太少了.所以在本文中,我想介绍一下或者说带您一步一步的开发一个简单的XML编辑器,当然我们要用到一些最常见的Java 2 Swing组件,不过这些都是免费的,有些是JDK中的,有些是可以从网上下载的.我想通过本文,你就可以创建一个属于你自己的XML编辑器. 先让我介绍一下本文辑写的思路.首先我想简要的讨论一下XML和为什么树型结构比较适合用来显示XML,然后我们来看一

怎样通过Visual C#.net创建一个DTS任务

visual|创建 怎样通过Visual C#.net创建一个DTS任务一.摘要这篇文章描述了如何利用Visual C#.net 创建一个DTS 自定义的任务.你可以通过C#.net创建自定义的任务的方式扩展DTS的功能.之后你可以安装并注册任务,他讲出现在DTS设计其中,就像默认的DTS任务.总之,你能够使用.NET Framework创建自定义的任务. 这篇文章除了讲创建一个DTS自定义任务外,还包括一下部分内容: 1.这篇文章中自定义的代码分为编译.注册和安装自定义任务:2.这部分一个有特

使用Java Swing创建一个XML编辑器之三

如果你现在正在寻找一个跨平台.资源开放的XML编辑器的话,您可能很快就能够实现这个愿望了.在这个三部分系列文章中,我将带您利用一些最通常的Java 2 Swing组件开发一个简单的 XML编辑器.本系列将有益于那些想编写他们的自己的XML编辑器的朋友或者帮助您学习或温习Swing. 这是本系列的第三篇文章.在第一个篇文章中,我们简要地讨论了XML和为什么树形结构适合显示XML.如何处理XML 数据.如何使用JTree Swing组件,并且我们还构建一个可重用组件用来解析XML文件并在JTree中

WCF后续之旅(13): 创建一个简单的WCF SOAP Message拦截、转发工具[上篇]

WCF是.NET平台下实现SOA的一种手段,SOA的一个重要的特征就基于Message的通信方式.从Messaging的角度讲,WCF可以看成是对Message进行发送.传递.接收.基础的工具.对于一个消息交换的过程,很多人只会关注message的最初的发送端和最终的接收端.实际上在很多情况下,在两者之间还存在很多的中间结点(Intermediary),这些中间结点在可能在实际的应用中发挥中重要的作用.比如,我们可以创建路由器(Router)进行消息的转发,甚至是Load Balance:可以创