zoukankan      html  css  js  c++  java
  • [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

    /**********************************************************************
     * 机械教条主义
     *
     * From:          http://www.cnblogs.com/egmkang/
     * Email:          egmkang [at] outlook.com
     * Weibo:        http://weibo.com/egmkang
     * Github:       http://github.com/egmkang
     *
     **********************************************************************/

  • 相关阅读:
    day21_map&debug
    Error: A JNI error has occurred, please check your installation and try again
    day20_比较器&Map
    day1819_List&Set&Genericity
    day17_Collection
    String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了
    day15_api01
    day16_api02
    渡河问题
    leetcode 春季个人赛
  • 原文地址:https://www.cnblogs.com/egmkang/p/1651443.html
Copyright © 2011-2022 走看看