mian() 句柄,mian句柄
1.我想知道main()应用程序本身有没有句柄。我在网上看到main()应用程序是可以GetMessage()的。并且可以接受到消息的。用setTimer(NULL,...)函数测试,确实能接受到WM_TIMER消息。既然都能接受到消息了,那么肯定是有句柄的我猜。
2.如果有句柄的话,那么如何获得它呢?setTimer()的第一个参数是NULL并可以使用,但是其他的SendMessage()是需要句柄才能发消息的(我也设为NULL,并没有用)。
使用GetModuleHandle(NULL)总是获得0x40000.
3.虽然我用了个隐藏的窗口来处理这些消息了,但是我还是想知道这些可不可以不用隐藏的窗口实现。
解决方案
参考DLL使用定时器 没有窗口哪来的句柄? 没有创建窗口就没有窗口句柄。SetTimer设置计时器后将有WM_TIMER消息发到线程的消息队列,每个线程都有一个消息队列(调用和消息有关的API时其内部自动创建),所以GetMessage()可以取到消息。PostThreadMessage之类的API不需要填写窗口句柄作参数也能工作,就是这样的道理。 1. 在 Windows 下,命令行也是一个普通的窗口,有类名也有句柄。MSDN 说,如果窗口句柄传递 NULL,那么如果指定 id 的定时器存在则会被替换。如果不同的窗口句柄有一样的 id,那肯定不会了。个人觉得指定 NULL 与否只是为了防止冲突,定时器都是进程独立的,并不能跨进程。
2. 命令行程序中可以通过 GetConsoleWindow() 取得当前窗口的句柄,但是发消息肯定大多情况下是没用的,命令行窗口系统并未提供消息。不过你可以试试 SetWindowLong 之后自己处理消息。SendMessage 肯定 HWND 参数不能用 NULL 了,否则消息发给谁?GetModuleHandle 得到的值只要不是 0,那就是有效的,管他是否 0x40000。 进程通信的方式很多,管道、邮槽、内存文件映射、共享内存、windows消息、Socket、事件对象等。
但是使用windows消息是最简单方便的方式。不使用windows消息的话,方法有很多,比如外部程序可以使用事件对象通知你的程序,然后在共享内存写入数据,然后你的程序读取数据并处理。也可以使用管道、邮槽、Socket来实现,但总体来说都比直接发windows消息麻烦
用户评论